基于Electron实现桌面应用开发代码实例


Posted in Javascript onJuly 07, 2020

Electron是一个可以使用 JavaScript,HTML 和 CSS 构建跨平台桌面应用程序的开源框架。

本文主要分享一下采用vue + electron开发桌面程序的搭建过程。

1. 环境准备

这里采用的是vue-cli3.x,可以通过下面的指令查看当前vue-cli的版本:

vue --version# 3.9.3 这里我用的是3.9.3

如果没有装vue-cli可以通过下面的命令安装:

npm install -g @vue/cli

如果是vue-cli还是2.x可以先卸载2.x然后装3.x

npm uninstall vue-cli -g

npm install -g @vue/cli

2. 创建项目

这里采用vue-cli创建vue项目。

vue create electron-helloworld

引入vue-cli-plugin-electron-builder

cd electron-helloworld

vue add electron-builder

这一步需要拉取electron-vX.Y.Z-win32-x64.zip,过程非常漫长。

3. 运行项目

运行electron项目。

npm run electron:serve

基于Electron实现桌面应用开发代码实例

4. node通讯

正常来说vue组件应该只关心页面层的逻辑即可,所以为了解耦,可以在Vue Component和Node API、Electron API中间插入一个桥接层,然后通过IPC进行通讯,如下图所示:

基于Electron实现桌面应用开发代码实例

按照关系图,Vue Commponent通过Service发布事件,完成与Node API和Electron API的通讯,下面根据这个关系写一个读取文件内容的示例。

创建Service,发布事件并监听

/bridge/service/Service.js

import { ipcRenderer } from 'electron'
class Service {
 readTxt(params, callback) {
  ipcRenderer.once('readTxt', (e, ret) => callback(ret))
  // 将params参数传给Server
  ipcRenderer.send('readTxt', params)
 }
}
export default new Service()

创建Server,监听事件并读取文件内容返回

/bridge/server/Server.js

import { ipcMain } from "electron";
import fs from 'fs'
export default class Server {
 constructor(app, win) {
  this.app = app
  this.win = win
 }
 initEventHandler() {
  ipcMain.on('readTxt', (e, params) => {
   // 这里将参数转化为json,然后读取G:\\0.txt的内容一起返回
   const pms = JSON.stringify(params)
   const ret = fs.readFileSync('G:\\0.txt')
   e.sender.send('readTxt', pms + '::::' + ret)
  })
 }
}

启动Server

在创建完Server之后,需要在应用程序启动的时候启动并让其监听对应的事件。

这里可以创建一个ApplicationContext,来启动Server。

/bridge/ApplicationContext.js

import Server from './server/Server'
export default class ApplicationContext {
 constructor(app, window) {
  this.app = app
  this.window = window
 }
 init() {
  new Server(this.app, this.window).initEventHandler()
 }
}

然后在background.js中实例化ApplicationContext,并调用init方法。

win.on('closed', () => {
  win = null
 })
 // Windows创建完成后初始化context
 new ApplicationContext(app, win).init()

Vue组件调用Service

完成上面三步之后,只需要在vue组件中调用Service即可,这一步跟普通开发vue程序是一样的。

<div>{{txt}}</div>
<button @click="readTxt">读取文件信息</button>
<script>
import service from '@/bridge/service/Service'
export default {
 name: 'HelloWorld',
 props: {
  msg: String
 },
 data() {
  return {
   txt: ''
  }
 },
 methods: {
  readTxt() {
   // 这里传入两个参数,并将返回结果赋值给txt,在div中显示出来
   service.readTxt({
    p1: '参数1',
    p2: '参数2'
   }, resp => {
    this.txt = resp
   })
  }
 }
}
</script>

至此,一个electron helloworld示例就完成了。

5. node API undefind

在上面的过程中可能会遇到node API undefined的情况,这是因为electron禁用了node集成,在background.js中创建window的时候指定了配置:

webPreferences: {
   // Use pluginOptions.nodeIntegration, leave this alone
   // See nklayman.github.io/vue-cli-plugin-electron builder/guide/security.html#node-integration for more info
   nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION
   // nodeIntegration: true
}

这里可以通过配置electronBuilder插件解决。

在项目目录根目录下面创建vue.config.js,内容如下:

// see https://cli.vuejs.org/config
module.exports = {
 productionSourceMap: false,
 pluginOptions: {
  electronBuilder: {
   nodeIntegration: true,
  },
  configureWebpack: {
   resolve: {
    symlinks: true
   }
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
Mar 25 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
Dec 04 Javascript
JS实现div内部的文字或图片自动循环滚动代码
Apr 19 Javascript
JS获取几种URL地址的方法小结
Feb 26 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
Oct 13 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
JavaScript实现动态增删表格的方法
Mar 09 Javascript
angular 用拦截器统一处理http请求和响应的方法
Jun 08 Javascript
详解vue-cli之webpack3构建全面提速优化
Dec 25 Javascript
vue 实现锚点功能操作
Aug 10 Javascript
基于javascript处理nginx请求过程详解
Jul 07 #Javascript
vue-i18n实现中英文切换的方法
Jul 06 #Javascript
vue 实现动态路由的方法
Jul 06 #Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 #Javascript
解决Nuxt使用axios跨域问题
Jul 06 #Javascript
js实现星星打分效果
Jul 05 #Javascript
jQuery实现简单飞机大战
Jul 05 #jQuery
You might like
如何删除多级目录
2006/10/09 PHP
php+mysql事务rollback&amp;commit示例
2010/02/08 PHP
php连接数据库代码应用分析
2011/05/29 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
2012/02/10 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
python函数的万能参数传参详解
2019/07/26 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
python实现大学人员管理系统
2019/10/25 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
办公文员的工作岗位职责
2013/11/12 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
奖励通知
2015/04/22 职场文书
电影复兴之路观后感
2015/06/02 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
Python中super().__init__()测试以及理解
2021/12/06 Python