Moka Desktop编程记录
上一篇文件简单介绍了下Moka Desktop
, 那么对于我这位Web前端开发工程师
是怎么能够开发一个Pc App
的呢?
这就不得不说到 electron
.
Electron
将chrome
内核与nodejs
融合在一起,分为Main Process
和 Renderer Process
, Main Process
主要负责app通用的全局设置,如窗口大小等等,Renderer Process
则主要在Chrome
中,在两个Process
中可以使用所有的node packages
所用第三方
- react
- babel: 由于react使用的是
es6
语法,所以需要babel
翻译 - ace.js: 编辑器
- marked.js
- moka-cli
- 未使用webpack,因为在react中会包含文件系统操作,webpack只是充当打包的角色,
fs
是不能打包成功的
坑点
iframe
与webview
由于编辑器是我之前用原生js完成的,所以便想用iframe
直接引入。 但如果直接使用iframe
,electron
可不认,在iframe
不能使用node api
与electron api
,但是可以在父窗口利用contentWindow
传入引用,然后在iframe
中就可以用api了。 其实在官方文档中,是可以直接用webview
标签解决上诉问题mac中使用
spawn
与fork
运行moka-cli
在官方apichild_process
中child_process.spawn(command[, args][, options])
传入参数是command
,也就是shell中的指令 需要依赖于PATH
中的moka
child_process.fork(modulePath[, args][, options])
传入参数是modulePath
,也就是javascript
文件路径
注意:modulePath
不需要exports
,因为fork只是找到文件,开个进程跑一遍该文件 所以我在npm i --save moka-cli
后, 直接在文件中写下面代码即可
var moka = require('moka-cli/bin') // bin/index.js中放的便是命令行入口
同时需要传入options
{
cwd: cwd, // 设置的工作目录(current work directory)
stdio: [
0, // (stdin) Use parents stdin for child
'pipe', // (stdout) Pipe child's stdout to parent
'pipe', // (stderr) Pipe child's stderr to parent
'ipc' // fork 需要`ipc`进行进程通信
]
}
传入以上options
后才能在fork
返回的ChildProcess
对象中使用stdout/stderr
关于具体的进程通信与管道与信号机制,请看Linux C 一站式教程中的相关章节。
- 打包过程
可以使用electron-packager
或者electron-builder
进行打包 安装electron
时,可以设置export ELECTRON_MIRROR=https://npm.taobao.org/mirrors/electron/
使用国内代理加快下载速度。 我在使用packager
时,只能打包成unpacked
,builder
可以打包成packed
,也就是安装器,但是builder
产生的安装器的图标不对。所以最后还是使用的packager