基于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 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
jquery与google map api结合使用 控件,监听器
Mar 04 Javascript
jquery easyui的tabs使用时的问题
Mar 23 Javascript
js 可拖动列表实现代码
Dec 13 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 Javascript
js的隐含参数(arguments,callee,caller)使用方法
Jan 28 Javascript
详解JavaScript正则表达式中的global属性的使用
Jun 16 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
Jul 31 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
运用js实现图层拖拽的功能
May 24 Javascript
微信小程序APP页面的之间的相互传递参数以及自定义组件
Apr 19 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
PHP中的加密功能
2006/10/09 PHP
聊天室php&amp;mysql(三)
2006/10/09 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
javascript两段代码,两个小技巧
2010/02/04 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
Python求算数平方根和约数的方法汇总
2016/03/09 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
Python格式化日期时间操作示例
2018/06/28 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
巴西手表购物网站:eclock
2019/03/19 全球购物
保安自我鉴定范文
2013/12/08 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
个人职业及收入证明
2014/10/13 职场文书
投标承诺函范文
2015/01/21 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
Springboot中如何自动转JSON输出
2022/06/16 Java/Android