electron+vue的基础研究

152 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

1.基本概念

1.Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入Chromium和 Node.js到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。

2.和google浏览器一样,采用多进程方案,拥有一个主进程和多个渲染进程

主进程功能:

(1)可以使用electron API和原生系统对接-创建菜单,上传文件

(2)有且只有一个主进程,可以创建渲染进程

(3)全面支持Node.js

渲染进程功能:

(1)可以有多个,每一个都是单独的进程

(2)全面支持Node.js和DOM API

(3)可以使用一部分electron API

2.原生JS实践

2.1主进程和渲染进程

使用社区推荐脚手架electron-quick-start

创建一个主进程main.js

const {app, BrowserWindow} = require('electron')

const path = require('path')



//封装一个创建主窗口的方法

function createWindow () {

  const mainWindow = new BrowserWindow({

    width: 800,

    height: 600,

    webPreferences: {

      nodeIntegration:true,//手动打开支持node.js

      contextIsolation: false,//electron12版本以上必须关掉,不然渲染进程不支持node.js

      preload: path.join(__dirname, 'preload.js')//设置dom加载完成后的js操作

    }

  })



 

  mainWindow.loadFile('index.html')

 

  mainWindow.webContents.openDevTools()//打开调试工具



}



app.whenReady().then(() => {

  createWindow()



  app.on('activate', function () {



    if (BrowserWindow.getAllWindows().length === 0) createWindow()

  })

})





app.on('window-all-closed', function () {

  if (process.platform !== 'darwin') app.quit()

})

配置scirpt

"scripts": {

    "start": "chcp 65001 &&electron .",//手动配置chcp 65001转换控制台乱码

    "build": "electron-builder"//社区打包方案,原生打包步骤比较繁琐

  },

index.html

<!DOCTYPE html>

<html>

  <head>

    <meta charset="UTF-8">

    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">

    <title>Hello World!</title>

  </head>

  <body>

    <h1>Hello World!</h1>

   <div id="main">点击内容</div>

  <div id="content"></div>

   </div>

    <script src="./renderer.js"></script>

  </body>

</html>

加载的index.html可以引入一个js文件,这个index.html就是渲染进程,也就是我可以在main.js调用多次创建进程,那么就可以创建多个渲染进程

2.2 进程通信

使用IPC进程通信模块,electron已经封装了

渲染进程render.js,发送信息给主进程并且接受主进程的回复,将回复的信息操作页面

const {ipcRenderer}=window.require('electron')



window.addEventListener('DOMContentLoaded',()=>{

    document.getElementById("main").addEventListener('click',()=>{

        console.log("监听到定义")

        ipcRenderer.send("message","发送信息")

        ipcRenderer.on("reply",(event,arg)=>{

        console.log("收到回复消息",arg)

        document.getElementById("content").innerHTML=arg

})



    })

})

主进程接收到并且回应

const {ipcMain} = require('electron')

   ipcMain.on("message",(event,arg)=>{

    event.sender.send("reply","恢复信息")

  })

}

通过以上逻辑我们使用原生的方式,可以创建多个index.html,也就是多个窗口页面,每个页面都可以和主进程通信,可以操作每个页面的样式等等,一个基本模块就搭建了

2.3 打包

electron提供的原生打包方式比较复杂,使用社区推荐方案electron-builder,通过配置package.json就可以打包,如果需要打包windows需要安装electron-builder-squirrel-windows,版本最后保持最新,不然实践起来很可能不兼容。

关于package.json主要是配置打包的文件类型,文件背景icon等等

  "build": {

    "productName": "electron-demo",

    "appId": "com.zhuyu.app",

    "directories": {

      "output": "build"

    },

    "files": [

      "dist/electron/**/*"

    ],

    "dmg": {

      "contents": [

        {

          "x": 410,

          "y": 150,

          "type": "link",

          "path": "/Applications"

        },

        {

          "x": 130,

          "y": 150,

          "type": "file"

        }

      ]

    },

    "mac": {

      "icon": "build/icons/icon.icns"

    },

    "win": {

      "icon": "build/icons/icon.ico"

    },

    "linux": {

      "icon": "build/icons"

    }

  },

3.electron和vue结合

使用社区推荐方案electron-vue,集成了css预处理语言,vuex,elctron-store,electron-builder等

主进程采用本地加载指定服务,线上打包index.html

'use strict'



import { app, BrowserWindow } from 'electron'

import '../renderer/store'



if (process.env.NODE_ENV !== 'development') {

  global.__static = require('path').join(__dirname, '/static').replace(/\/g, '\\')

}



let mainWindow

const winURL = process.env.NODE_ENV === 'development'

  ? `http://localhost:9080`

  : `file://${__dirname}/index.html`



function createWindow () {

  /**

   * Initial window options

   */

  mainWindow = new BrowserWindow({

    height: 563,

    useContentSize: true,

    width: 1000

  })



  mainWindow.loadURL(winURL)



  mainWindow.on('closed', () => {

    mainWindow = null

  })

}



app.on('ready', createWindow)



app.on('window-all-closed', () => {

  if (process.platform !== 'darwin') {

    app.quit()

  }

})



app.on('activate', () => {

  if (mainWindow === null) {

    createWindow()

  }

})

4.打包构建

采用的官方推荐方案electron-builder,直接通用配置package.json进行打包构建,package.json基本规范配置

"build": {

    "productName": "手机设备系统PC端",

    "appId": "com.example.yourapp",

    "directories": {

      "output": "build"

    },

    "files": [

      "dist/electron/**/*"

    ],

    "dmg": {

      "contents": [

        {

          "x": 410,

          "y": 150,

          "type": "link",

          "path": "/Applications"

        },

        {

          "x": 130,

          "y": 150,

          "type": "file"

        }

      ]

    },

    "mac": {

      "icon": "build/icons/icon.icns"

    },

    "win": {

      "icon": "build/icons/icon.ico"

    },

    "linux": {

      "icon": "build/icons"

    }

  },

6.展望

将在以下三个方面出发研究electron

1.系统托盘菜单设置

2.右键上下文菜单设置

3.和客户端文件交互