基于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 相关文章推荐
如何在Web页面上直接打开、编辑、创建Office文档
Mar 12 Javascript
location.href语句与火狐不兼容的问题
Jul 04 Javascript
Jquery之美中不足小结
Feb 16 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
Feb 23 Javascript
javascript题目,重写函数让其无限相加
Feb 15 Javascript
js解析与序列化json数据(二)序列化探讨
Feb 01 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
May 10 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
Feb 28 Javascript
JS+php后台实现文件上传功能详解
Mar 02 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
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
获取URL文件名后缀
2013/10/24 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
Js 中debug方式
2010/02/07 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
javascript的delete运算符知识点总结
2019/11/19 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Python实现简单拆分PDF文件的方法
2015/07/30 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
python用插值法绘制平滑曲线
2021/02/19 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
会展中心部门工作职责
2013/11/27 职场文书
新闻稿标题
2015/07/18 职场文书
2016年寒假家长评语
2015/10/10 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书