基于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 相关文章推荐
使用javascript获取flash加载的百分比的实现代码
May 25 Javascript
浅谈JavaScript中的String对象常用方法
Feb 25 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
Mar 09 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
JavaScript的ExtJS框架中表格的编写教程
May 21 Javascript
AngularJS基础 ng-repeat 指令简单示例
Aug 03 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
Ajax请求超时与网络异常处理图文详解
May 23 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
PHP入门速成教程
2007/03/19 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
php检测url是否存在的方法
2015/04/14 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
使用Python解析JSON数据的基本方法
2015/10/15 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
python小项目之五子棋游戏
2019/12/26 Python
如何验证python安装成功
2020/07/06 Python
python实现xml转json文件的示例代码
2020/12/30 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
档案管理员岗位职责
2013/12/01 职场文书
奥巴马演讲稿
2014/01/08 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
外贸业务员求职信
2014/06/16 职场文书
销售会议开幕词
2015/01/28 职场文书
结婚司仪主持词
2015/06/29 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
调研报告的主要写法
2019/04/18 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server