Electron开发 —— 简单demo之整合vue

总得有个开始

前置条件:

一:步骤:

1. 利用上一章节的demo,以及之前的vue开发系列,vue项目开发有2种模式,一种脚手架CLI生成,一种直接js引用,此处因为利用上一章节demo,故先采取js引用,仅修改的index.html,其他不变,改动如下

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Demo</title>
  </head>
  <body>
    <div id="app">{{ content }}</div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      var app = new Vue({
        el: '#app',
        data: {
          content: '潇风剑易水',
        },
      });
    </script>
  </body>
</html>

1. 1、运行结果如下:

npm start

demo运行图:


demo运行图.png

2. 脚手架CLI,和引用js其实是一样的,只是前面需要把vue框架转译成原生js这些,多了这个步骤,故下面的操作也是基于此去改造,当然后面再整合为一个框架,编译打包这些对外透明,目前流程仅为一步步摸索到,且,对应的脚手架已有,各位也是可以下他那个直接用。参考之前vue脚手架搭建栗子,搭建一个demo,然后install引入Electron

2.1 回顾前面的Electron demo,首先要在package.json里面设置运行的脚本index.js,Electron运行时会依据这个来创建窗口,其次是这个运行脚本需要指定运行的首页index.html;到此在回顾vueCLI的运行过程,默认就是脚手架指定生成的src下面的index.js和pubic下面的index.html,至此整合的目的就是把2处合在一起,即可既是vue也是Electron,实际上抛开pc窗口应用程序来看,不外乎就是引入了vue.js和electron.js,梳理清楚后,请按以下操作,当然客官有更简便的做法那就不必按部就班

2.2 暂且规定vueCLI打包后的路径为根目录下的dist文件,故Electron启动转译的地方也将是这里,不再是项目根目录下的main.js(当然你也是可以指向这里,其次下面均改名为index.js,因为不在担任重要的业务逻辑,或者改成init.js更为合适),package.json指定位置设置为dist/index.js,总所周知,在CLI打包后是根本没有index.js,仅仅为不重复的hash命名的js,但是首页index.html是存在的,参考index.html保持原来的原理,在public目录下创建index.js,再次声明这个js,主要是负责创建Electron容器的,并不负责项目的业务逻辑,一般变化不大,所以也不太需要hash命名,也方便指定,index.js内容如下:

const { app, BrowserWindow } = require('electron')

function createWindow () {   
    // 创建浏览器窗口
    let win = new BrowserWindow({
      width: 800,
      height: 600,
      webPreferences: {
        nodeIntegration: true,
      }
    })
  
    // 加载index.html文件,注意此处路径
    win.loadFile('dist/index.html')
  }
  
   // 应用程序准备就绪后打开一个窗口
  app.whenReady().then(createWindow)

2.3 项目根目录新增vue.config.js ,指定vue打包的路径以及资源的相对路径,如下:

module.exports = {
  // 相对路径
  publicPath:'./',
  // 打包输出路径
  outputDir: 'dist',
};

2.4 修改package.json的main和scripts节点,如下:

 "main": "dist/index.js",
  "scripts": {
    "electron-start": "electron .",
    "vue-build": "vue-cli-service build",
    "client": "vue-cli-service build && electron ."
  },

2.5 执行vue-build转译打包

npm run vue-build

2.6 执行electron-start启动electron应用

npm run electron-start

2.7 正如你所见,直接执行client指令是可以连续运行2个指令的,为何要单独引出,仅为了提醒各位混合开发的本质,当然需要合并scripts2个子节点的key达到scripts命令复用,请引入npm-run-all,例:

"client": "npm-run-all electron-start && vue-build"

demo运行图:


demo运行图.png

3. electron打包,当前我已知有2种,其一为官网文档突显的第三方electron-builder、其二为自家的electron-packager,暂无空研究两者的区别,需要注意两者依赖的node.js的版本,可能是某些地方没处理好,8.x版本在使用electron-builder打包时遇到如下错误:

你该项目地址\node_modules\electron-builder\node_modules\fs-extra\lib\mkdirs\make-dir.js:85
      } catch {
              ^

SyntaxError: Unexpected token {
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
npm ERR! code ELIFECYCLE

但是使用electron-packager倒是疼快,直接简单粗暴(至少从这点我是倾向于它的):

Electron Packager requires Node >= 10.12.0.

当然官网那个apiDemo是可以打包的,至于为啥这个可以,请自行比较,本人感觉个中意义不大,最后的解决,当然是选择升级我当前的node版本,从v8.11.3到v12.18.3(windows的用户请直接覆盖安装,或其他工具),或许你能找到不用升级的原因,那恭喜你

正题,即是2种方案都需要install进项目内,本身并不包含,特别注意傲娇的electron-builder,详情见Electron开发 —— 问题汇集 ,要是你遵循文档的yarn引入倒是没这个烦恼,对,是时候了解下yarn了,安装好后,需要修改package.json,加入指令如下(若非VueCli集成请去掉前面vue相关指令):

// 当打包工具为electron-packager,此处仅选windows和安装形式
"build": "vue-cli-service build && electron-packager . --overwrite --platform=win32 --arch=ia32 --out=out "
// 当打包工具为electron-builder,默认为win以及out路径以及免安装形式,其他需要自行修改
"pack": "vue-cli-service build && electron-builder"

4. 最后需要提醒的就是该方案非常繁琐,本人意愿为,不需要改这么多处,故后续的优化重点是回归到原先vue CLI那样的做法,一键install引入,一键打包,以及重点治理index.js(已想到全局变量,还需要花点时间,毕竟重点还是vue里面使用electron的API),毕竟在public在去创建这个,是有点不符合内聚的做法,还有热更新这个也得重点关注下,还有集成指令(特别重要,因为很多没必要出现在项目中,很多是因为对开发者透明的,一如各位使用各大主流的框架去开发,面向前端就不该去考虑所谓的后端该怎么去打包,项目尽其所能保持简洁可用),此文仅为边测试边改进得到,很多没必要的步骤,所以后期有时间会改进,仅供娱乐测试所用,当然现成的electron-vue可以直接用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353