基于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 获取LI里的内容
Dec 17 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
一些javascript一些题目的解析
Dec 25 Javascript
js 将json字符串转换为json对象的方法解析
Nov 13 Javascript
js使用post 方式打开新窗口
Feb 26 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
Mar 26 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
jquery实现图片切换代码
Oct 13 Javascript
利用React-router+Webpack快速构建react程序
Oct 27 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 Javascript
javascript实现切割轮播效果
Nov 28 Javascript
如何通过JS实现转码与解码
Feb 21 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
快速配置PHPMyAdmin方法
2008/06/05 PHP
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
php探针不显示内存解决方法
2019/09/17 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
JavaScrip常见的一些算法总结
2015/12/28 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
react-router实现按需加载
2017/05/09 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
python写文件时覆盖原来的实例方法
2020/07/22 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
中学教师培训制度
2014/01/31 职场文书
三查三看党性分析材料
2014/02/18 职场文书
厂区绿化方案
2014/05/08 职场文书
公司领导班子对照材料
2014/08/18 职场文书
客户答谢会活动方案
2014/08/31 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
创先争优活动个人总结
2015/03/04 职场文书
PHP基本语法
2021/03/31 PHP
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL