前言
Electron帮助我们突破浏览器的界限,通过Electron构建的桌面应用拥有各种浏览器应用梦寐以求的能力。
Electron提供的autoUpdater还可以帮助我们实现桌面应用的自动更新。
文件结构
首先,我们已经有了一个基于Electron做的应用,项目中有两个package.json。这样做的一个原因是将devDependencies和dependencies分开了,另外就是不需要在打包的时候再去指定哪些依赖不需要一起打到安装包里面去了(通过ignore参数)。
目录结构类似于这样:
myapp -node_modules -package.json -app -js -css -index.html -main.js -package.json
外面的package.json内容类似于:
{ "name": "myapp", "main": "app/main.js", "scripts": { "start": "electron ." }, "devDependencies": { "electron-prebuilt": "^1.2.7" }}
里面的package.json的内容类似于:
{ "name": "myapp", "version": "1.0", "main": "main.js", "description": "my app", "scripts": { "start": "electron ." }, "dependencies": {}}
注意里面的package.json中的name,version,description是必填的,接下来打包会用到。
electron-squirrel-startup
为了使最后的安装包能够实现自动更新,我们需要对现有的应用做一些改动,使它可以处理一些启动或者安装时的事件。
我们可以在main.js里面加入一些处理的代码或者方便起见,我们可以直接使用electron-squirrel-startup。
先安装:
npm install electron-squirrel-startup --save
因为需要在main.js里面用到,我们需要将其安装在app里面。
在main.js里面使用它,第一行加入如下代码即可:
if (require('electron-squirrel-startup')) return;
有兴趣的童鞋可以一起跟我去看看electron-squirrel-startup做了什么事情,急着打包的童鞋可以直接忽略这一段:
在myapp/app/node_modules/electron-squirrel-startup下面有一个index.js:
var path = require('path');var spawn = require('child_process').spawn;var debug = require('debug')('electron-squirrel-startup');var app = require('electron').app; var run = function(args, done) { var updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe'); debug('Spawning `%s` with args `%s`', updateExe, args); spawn(updateExe, args, { detached: true }).on('close', done);}; var check = function() { if (process.platform === 'win32') { var cmd = process.argv[1]; debug('processing squirrel command `%s`', cmd); var target = path.basename(process.execPath); if (cmd === '--squirrel-install' || cmd === '--squirrel-updated') { run(['--createShortcut=' + target + ''], app.quit); return true; } if (cmd === '--squirrel-uninstall') { run(['--removeShortcut=' + target + ''], app.quit); return true; } if (cmd === '--squirrel-obsolete') { app.quit(); return true; } } return false;}; module.exports = check();
新闻热点
疑难解答
图片精选