整合Angular2和Electron
Electron不限制使用什么前端技术,所以我们可以在其中使用任何我们喜欢的框架。现在我们来研究一下如何吧Angular程序部署到Electron中。
工程搭建
新建一个Angular工程可不是一个简单的事情,一个完整Angular工程设计到很多技术,比如打包方式,如何安排自动化测试等。现在比较好的做法有两个:
- 使用Angular官方提供的Angular CLI来新建工程。
- 使用社区维护的[angular2-webpack-starter][angular2-webpack-starter]项目。
这两种做法都会生成一个完整的,整合了目前最佳实践的Angular模板项目。在这里我选择Angular CLI,但是这个项目目前还处于早期开发中。
首先使用CLI新建工程:
1 | ng new electron-angular-test |
然后需要在这个项目中安装electron依赖,这样才能electron命令来启动Electron来运行项目:
1 | cd electron-angular-test |
默认Angular CLI会在项目目录下建立一个src目录用于存放项目代码。我们这里新建一个专门安放Electron启动代码的目录:
1 | mkdir src/electron |
一个Electron项目,也需要一个package.json,这个package.json的结构和npm的package.json很像,Electron启动器在启动时会加载这个文件。
1 | // src/electron/package.json |
配置中的main字段指定了这个Electron应用的入口文件是哪个文件。我们来新建这个文件:
1 | // src/electron/electron.js |
这里需要注意一下,我们需要修改src/index.html
,把
1 | <base href="/"> |
改为:
1 | <base href="./"> |
这是因为Angular CLI建立的工程默认是基于http://
协议的,而Electron加载应用的时候,使用的是file://
协议。
最后我们需要在npm script中添加用于从electron启动应用的命令:
1 | "build-electron": "ng build && cp src/electron/* dist/", |
这样我们执行npm run electron
就能启动应用了。
问题
现在虽然可以启动应用了,但是有几个问题:
- 修改代码electron中的程序无法自动刷新,而在浏览器中运行程序会自动刷新,这个对于开发的帮助很大,要如何配置?
- 我在Component代码中执行
console.log(process.platform);
,得到的输出竟然是undefined!这是为什么? - 启动应用后,Loading大致花了半秒钟,这是Angular最短启动时间了么?
解决问题
在Electron中开发如何自动刷新?
这个问题目前有两个思路
- 使用
ng build --watch
命令监视代码变化,一旦代码发生变化就重新编译。和浏览器调试的区别在于需要手动刷新Electron。 在electron.js中,默认在窗口载入页面的代码是:
1
2
3
4
5win.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}))
这是基于`file://`协议的,我们可以直接把这行修改为:
1
win.loadURL("http://localhost:4200/");
就和浏览器调试一模一样了!区别在于使用的是Electron运行环境!这个方法目前看起来最好,但是不知道有没有什么坑。
如何在Angular代码中使用node模块?
TODO
add webpack target configuration via angular-cli.json by vilarone · Pull Request #3346 · angular/angular-cli
Problems importing native modules (for Electron app) · Issue #3482 · angular/angular-cli
Problems importing native modules (for Electron app) · Issue #3482 · angular/angular-cli