桌面端框架Electron使用问题整理和总结

发表于 4年以前  | 总阅读数:1066 次

文章主要记录了使用electron日常开发中所遇到的一些坑以及怎样填坑,帮助其他开发的小伙伴少踩一些坑。

electron这个框架我就不过多介绍了,是使用nodeChromium架构的一个桌面端框架,如果有了解使用web技术开发桌面端,这个框架多少会听说过或者正在使用。

下面就记录一下自己在阅读文档的一些疑问以及开发过程中踩过的坑!

electron?

  1. SpectronDevtron 的作用?
  • Spectron可以和其他的mocha等测试框架进行结合,测试electron
  • Devtron是Electron DevTools的扩展,可以帮助你检查,监控和调试应用程序。默认是关闭状态

2.<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />的作用?

  • 设置 HTTP 的 Content-Security-Policy 头部字段
  • 为了防止XSS攻击,安全考虑可以在content中设置允许加载的脚本的源

3.electron-forge的作用?

  • 是一个快速构建electron的构建工具,里面包含打包、自动更新等
  • 内部书写htmljs为原生写法,未集成第三方框架

4.在electron中使用iframewebview的的区别?

  • 官方建议使用iframe代替webview,webview标签可以加载一个访客模式的URL页面,由于这个标签是基于Chromium webview,目前架构变化较快,不够稳定。但是webview所提供的功能较多,比如控制访客能否前进后退等

5.window.open()使用native和chrome的区别是什么?

  • electron中使用window.open()打开一个URL使用,会创建一个BrowserWindow实例,使用的是native的窗口,可以通过设置nativeWindowOpen: true来使用chrome内置的window.open(),同步打开窗口

6.electron-packagerelectron-builder 的打包区别?为什么推荐使用 electron-builder

  • electron-packagerelectron-builder 都是用于electron应用打包的模块, 相比较electron-builder有更丰富的功能,支持更多的平台,打包的文件更加轻量,支持非electron内置的自动更新(内置的自动更新需上传到git等支持平台)

7.在electron中使用node原生模块的时候,electron-rebuild能够简化原生的重编译?

  • 由于electron内置的node版本和你电脑本机的版本不一致,则在使用node原生模块的时候可能会报错,Error: The module '/path/to/native/module.node'
  • 有3种方式可以解决该问题(下面会详细介绍两种使用方法,其他方式参考官方文档)

electron进程之间通讯

1.主进程向渲染进程通讯

  • 主进程使用 win.webContents.send发送消息
  • 渲染进程使用 ipcRenderer.on 接收消息

2.渲染进程向主进程通信

  • 渲染进程使用 ipcRenderer.send或者 ipcRenderer.invoke 发送消息
  • 主进程使用 ipcMain.on或者ipcMain.handle 接收消息

3.渲染进程向渲染进程通信

  • 通知事件

  • 通过主进程转发(Electron 5之前)

  • ipcRenderer.sendTo(Electron 5之后)

  • 数据共享

  • web技术(localStorage、sessionStorage、indexedDB、可嵌入型数据库等)

  • 使用remote(尽量少用,容易影响性能)

由于公司使用的技术栈是vue,所以需要将electronvue结合起来,当然结合的方式也不麻烦,这里我们选用了electron-vue这个开源框架。它已经将两者结合起来,并且能够独立打包成web,但在使用过程中还是有些疑问和坑的,记录一下

electron-vue 的坑与填坑?

  1. 这个框架使用vue-electron模块,它的作用是什么?
const electron = require('electron')

module.exports = {
  install: function (Vue) {
    Object.defineProperties(Vue.prototype, {
      $electron: {
        get () {
          return electron
        },
      },
    })
  },
}
  • 将 electron API 附加到 Vue 对象,不需要显式的在vue中引入electron(require('electron')
  • vue-electron源码很简单,将 $electron 挂载到vue的原型上

2.这个框架使用vuex-electron模块,它的作用是什么?

  • 可以在多个进程中间可以共享状态,比如在electron的主进程和渲染进程中公用一个状态,并将数据存放在磁盘中

3.在主进程中使用__dirname__filename 打包后,并不能得到我们预期的路径?

  • 在调用native的dll的时候也遇到这个问题了,打包之前能够获得正确路径,打包后文件会被放在app.asar这个虚拟文件中,路径就会错误
  • 解决方法:electron-vue 中提供了__static全局变量解决了这个问题,只需要将静态文件放入到__static文件夹即可(path.join(__static, '/xxx.dll')
  • 如果只使用electron本身这个框架,你需要自己设置开发时路径和打包后的访问路径

4.初始化完成项目后会报一个错误:ReferenceError: process is not defined

new HtmlWebpackPlugin({
      filename: 'index.html',
      template: path.resolve(__dirname, '../src/index.ejs'),
+      templateParameters(compilation, assets, options) {
+        return {
+         compilation: compilation,
+         webpack: compilation.getStats().toJson(),
+          webpackConfig: compilation.options,
+          htmlWebpackPlugin: {
+            files: assets,
+            options: options
+          },
+          process,
+        };
+      },
      minify: {
        collapseWhitespace: true,
        removeAttributeQuotes: true,
        removeComments: true
      },
      nodeModules: process.env.NODE_ENV !== 'production'
        ? path.resolve(__dirname, '../node_modules')
        : false
    }),
  • 可以在index.ejs中将<% if (!process.browser) { %>修改成<% if (!require('process').browser) { %>(如果需要打包成web,请不要使用该方法)
  • 或者在webpack.renderer.config.js修改以下代码(实际上是配置页面中使用的process参数,如果需要打包成web,可以使用该方法,但不要在webpack.web.config.js中添加该代码)

5.构建完项目后electron版本默认是2.x, 升级版本后会报错module is not defined

mainWindow = new BrowserWindow({
  height: 563,
  useContentSize: true,
  width: 1000,
+  webPreferences: {
+    nodeIntegration: true
+  }
})
  • 原因新版本electron默认不开启node集成,在main/index.js创建窗口的时候加上以下代码

6.报错 Unable to install vue-devtools

  • 原因是vue-devtools需要外网下载,科学上网即可

7.在该项目中调用vuexmutations时,会报错Please, don't use direct commit's, use dispatch instead of this.

  • 这里提示不能使用同步的方法修改,应该通过调用actions去触发mutations
  • 原因是vuex-electron里面加载了多进程之间共享mutations插件
  • 解决方法:1.在store/index.js中将createSharedMutations 插件注释即可
  • 2.通过调用actions去触发mutations,并且在主进程main/index.js加入该代码import '../renderer/store'
  • 3.查询vuex-electrongithub,按照文档设置whitelist,这里不赘述

8.在vuex中存储的数据,即使刷新和重启项目,该数据依然存在(这里功能可以设置用户长期存储的数据)

  • vuex-electron是将数据存储在磁盘中,默认路径可以通过app.getPath('userData')找到存储路径下面的一个vuex.json的文件,安装不同的electron应用,文件目录下面都会生成一个vuex.json文件
  • vuex-electron内部使用了electron-store这个模块,这个模块可以set数据,但是vuex-electron并没有将暴露出来
  • 解决办法:如果你想和在web中一样,刷新或者关闭后,数据重置,直接在下面第9个问题这,将plugins加载的模块删除即可

9.使用npm run build:web打包时候,报错Error: Can't resolve 'fs' in xxxx

import Vue from 'vue'
import Vuex from 'vuex'
- import { createPersistedState, createSharedMutations } from 'vuex-electron'
import modules from './modules'

Vue.use(Vuex)

export default new Vuex.Store({
  modules,
+  plugins: process.env.IS_WEB ? [] : [
+    require('vuex-electron').createPersistedState(),
+    require('vuex-electron').createSharedMutations()
  ],
  strict: process.env.NODE_ENV !== 'production'
})
  • 修改renderer/store/index.js,在web中去除vuex-electron并删除显示引入vuex-electron

10.打包报错

  • 这里最容易报错的就是downloading parts=8 size=63 MB url=https://github.com/electron/electron/releases/download/vx.x/electron-vx.x-win32-x64.zip失败
  • 解决办法:手动去https://npm.taobao.org/mirrors/electron找到对应electron版本下载
  • 将下载好文件手动放在C:\Users\用户名\AppData\Local\electron\Cache文件夹中即可(AppData是隐藏文件夹)

electron调用native方法

安装环境(mac环境无需安装第1步)

  1. 管理员权限执行npm install --global windows-build-tools 安装python和C++环境 如果无法安装可以单独安装
  • python(v2.7 ,3.x不支持)
  • visual C++ Build Tools,或者vs2015及以上

2.npm install -g node-gyp 编译原生node模块(electron使用node原生模块需要编译) 3.node-gyp list 查看是否缺少node.lib 库,并按照提示安装 node-gyp install 4.在src/main/index.js中启用渲染层node集成

通过 node-ffi 模块调用C/C++ dll

  1. npm install ffi-napi --save 安装调用C/C++ dll的模块
  • 如果找不到python路径,设置python环境变量或者npm config set python你的python路径
  • 如果还不行尝试使用yarn安装

2.npm install electron-rebuild ---save-dev 安装自动编译原生node模块

  • 如果不安装的话可以进行手动编译,方法如下
  • 进入node_module/ffi-napi文件夹执行node-gyp rebuild --target='当前electron的版本' --arch=x64 --dist-url=https://atom.io/download/atom-shell编译node原生模块
  • arch :计算机的架构(x64或者ia32),如果node环境是32位,那么这里就是ia32,如果是node环境是64位,那么这里就是x64。
  • 如果路径错误,换成国内镜像路径 --dist-url=https://npm.taobao.org/mirrors/atom-shell
  • 再进入node_module/ref-napi文件夹执行node-gyp rebuild --target='当前electron的版本' --arch=x64 --dist-url=https://atom.io/download/atom-shell编译node原生模块

3.如果自动编译的话执行npx electron-rebuild,上步手动编译则不需要这一步了 4.剩下的就是在主进程里面调用native方法即可,渲染进程调用通过ipcRendereripcMain通信调用即可,举个小例子

// 主进程
// 调用示例
const ffi = require('ffi-napi')
const CTEST =  ffi.Library('dll文件路径', {
  // 文件内的方法和参数类型
  'Add': ['float', ['float', 'float']],
  'Hello': ['string', []],
  'StrLength': ['int', ['string']]
})
// 同步调用
CTEST.Hello()

// 异步调用
CTEST.StrLength.async('1234', (error, res) => {
  console.log(error, res)
})

这里有两点需要注意一下

  • 如果没有使用electron-vue这个框架(electron-vue已经处理好静态文件路径),需要注意打包后的静态文件路径会有些问题,可以在在package.json文件中配置build后dll的文件存放
 "extraFiles": [
    {
    "from": "",
    "to": ""
    }
]
  • 64位的dll不能再32位机器上调用,会报错

通过 electron-edge-js 模块调用C# dll

  1. npm install electron-edge-js --save 安装调用C# dll的模块
  2. 这里electron的版本不能为8.x,版本7.x的页面刷新有bug,目前这个模块支持情况
 * Electron 1.6.x - Node.js v7.4.0.
* Electron 1.7.x - Node.js v7.9.0.
* Electron 1.8.x - Node.js v8.2.1.
* Electron 2.x - Node.js v8.9.3.
* Electron 3.x - Node.js v10.2.0.
* Electron 4.0.4+ - Node.js v10.11.0.
* Electron 5.x - Node.js v12.0.0.
* Electron 6.x - Node.js v12.4.0.
* Electron 7.x - Node.js v12.8.1
// 主进程
// 调用示例

const edge = require('electron-edge-js')
const edgeDll = edge.func({
  assemblyFile: 'dll文件路径',
  typeName: "Edge_test.Class1",
  methodName: "Concat"
})

edgeDll({ first: 'aaa', second: 'bb' }, function (error, result) {
  if (error) throw error
  console.log('C# DLL:',result)
})

通过robotjs控制鼠标键盘、node-serialport进行串口通讯等

  1. 使用方法这里不再赘述,文档查询即可。这些模块也是node原生模块,因此需要编译
  2. 自动编译同上npx electron-build,有时候自动编译不好使,就需要手动编译
  3. 手动编译 npm rebuild --runtime=electron --disturl=https://atom.io/download/atom-shell --target=<electron版本> --abi=<对应node版本的abi>或者直接进入模块文件夹中通过node-gyp编译:node-gyp rebuild
  4. abi查询网址:https://github.com/mapbox/node-pre-gyp/blob/master/lib/util/abi_crosswalk.json

自动更新

由于项目代码是放在自己服务并且不会进行签名,所以放弃electron内置的自动更新。项目使用的打包方式是electron-builder,最终决定使用electron-updater模块进行自动更新,它不依赖任何服务器并且可以从S3, GitHub或者任何其它静态文件存储更新,避开了 Electron 内置的更新机制

mac上代码必须要进行签名

这里给个简版示例

  1. npm install electron-updater --save 安装自动更新模块 2.主进程中写入更新代码
// 每次开启应用时候会去自动到文件服务器检查是否有更新,并自动更新重启
import { autoUpdater } from 'electron-updater'

autoUpdater.on('update-downloaded', () => {
  autoUpdater.quitAndInstall()
})

app.on('ready', () => {
  if (process.env.NODE_ENV === 'production') autoUpdater.checkForUpdates()
})

3.配置打包更新服务器地址(这里配置从自己文件服务器获取更新)

"build": {
  "publish": {
    "provider": "generic",
    "url": "http://127.0.0.1:8080" // 服务器地址
  }
}

4.打包后安装,如果需要更新修改package.json的版本,重新打包,将.exe``latest.yml``.exe.blockmap 3个文件直接扔在文件服务器地址即可。下次用户打开应用便会自动更新

在electron中起个node服务

  • 这里代码比较简单,提供个思路:在主进程中创建个子进程执行node服务(child_process.fork),子进程和主进程通过进程之间进行通信,在主进程拿到数据之后通过ipcMainipcRenderer进行主进程和渲染层通信即可。

以上就是个人在阅读文档以及项目中遇到的部分问题和坑,记录分享一下,帮助其他小伙伴少走一些坑,感谢阅读!

本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/hW1g_TgXjg-YhK9aEwgGYg

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录