公司使用Angular+Electron进行PC端应用开发,使用开源项目angular-electron
作为模板(https://github.com/maximegris/angular-electron ),但随着项目的进行,被如下的几个痛点折磨得不行:
Attention: 本文对照源码食用更佳 : https://github.com/simo-an/ng-electron
接下来我们在上班摸鱼时间写一个打包脚本来解决上述的问题
angular-cli
的命令import NgCli from "@angular/cli";
import * as WaitOn from "wait-on";
function startRenderer(): Promise<void> {
NgCli({ cliArgs: ['serve', '--configuration', 'development'] });
return WaitOn({ resources: ['tcp:4200'] }); // 监听默认 4200 端口
}
Webpack
的配置代码详细见 https://github.com/simo-an/ng-electron/blob/master/scripts/app-runner/webpack.main.config.ts
那我们怎样做到主进程的热更新呢?
Webpack
检查到有代码更新时,根据进程ID
杀死原进程这样是不是就很完美(思路来自electron-vue
)
编译打包主进程的代码如下
import * as webpack from 'webpack';
import mainConfig from './webpack.main.config'; // 获取 Webpack 配置文件
let electronProcess = null; // 记住的主进程信息
let manualRestart = false; // 记录主进程被杀死是不是手动杀死的(即是不是热启动)
function startMain(): Promise<void> {
return new Promise<void>((resolve, reject) => {
const compiler = webpack.webpack(mainConfig);
compiler.watch({}, (err, stats) => {
if (err) { return ; } // 出错
if (!electronProcess || electronProcess.kill) return resolve(); // 进程已经杀死
// 手动重启,对于上面的三个步骤
manualRestart = true;
process.kill(electronProcess.pid);
electronProcess = null;
startElectron(); // 启动 Electron
setTimeout(() => manualRestart = false, 5000);
});
});
}
启动应用的代码如下startElectron()
,注意類下面我们开始启动Electron
啦
let electronProcess = null; // 记住的主进程信息
let manualRestart = false; // 记录主进程被杀死是不是手动杀死的(即是不是热启动)
function startElectron(): void {
const args = [
'--inspect=5858',
path.join(__dirname, '../../dist/electron-main/main.js') // 主进程入口文件
];
// 记住主进程(下次有代码更新时就杀死)
electronProcess = spawn(require('electron'), args);
electronProcess.on('close', () => { if (!manualRestart) process.exit(); });
}
这部分的代码里,我如果主动退出应用,会将整个Process
全部杀死,解决了主进程关闭,渲染进程还在运行的问题。
Promise.all([ startRenderer(), startMain() ]).then(startElectron)
撒花,完结,我们上面的两个痛点解决啦
然而最后一个问题在Webpack11 +
变得非常容易解决啦,只需要在angular.json
中配置模块热更新即可 裸
{
// ...
"serve": {
"development": {
"hmr": true,
"browserTarget": "ng-electron:build:development"
}
}
// ...
}
// ...
}
至此,我们项目中的三个痛点全部解决
小黄人分割线
看到这里你会不会有疑问
electron-builder
打包呢?4k+ star
的更好用吗?那clone
下来看看代码,在电脑上跑一下,上面的疑惑就全解啦
欢迎访问,star or fork: https://github.com/simo-an/ng-electron