Electron是PC端的跨平台开发框架,我们可以通过nodejs去调用其提供的各种底层API。但Electron为了保证自身文件体积较小和可持续开发,对API的数量进行了控制。好在,Electron同样支持Nodejs原生模块,只不过,需要用Electron的头文件进行重编译。
项目原本的npm库管理很乱,各级目录下都有package.json,且没有同步所有用到的,也没有通过package-lock.json进行版本号管理。因此,之前若想在新的设备,尤其非mac os上重新配下开发和打包环境,很难。。基本都是靠手动复制node_modules...
出于近期需要在linux上搭建一套开发环境的契机,对整个项目的架构进行重新梳理,重点就是npm库。因为换了操作系统,项目涉及到的Native库,需要重新编译。这里,我们以两个Native库为例,具体介绍下如何在不同系统下重编译Electron的Native库:canvas
和sqlite3
配置npmrc
只是Electron官方文档给出的方案,通过在.npmrc文件中配置相关环境变量,帮助npm在下载Native模块时,自动下载其对应的Electron版本。
npm config ls -l
.npmrc在不同系统下的路径不一样,通过上面的命令找到其位置,手动添加一下内容:
// Electron
target=1.7.11
arch=x64
target_arch=x64
disturl=https://atom.io/download/electron
runtime=electron
build_from_source=true
//target_platform=darwin
target表示要编译的Electron版本,需要与你本地的Electron版本号一致。这里1.7.x,x有差异不影响,否则,可能会报错:
'xx.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 57. This version of Node.js requires
NODE_MODULE_VERSION 54. Please try re-compiling or re-installing
手动编译
Nodejs的Native模块,其根目录下都有binding.gyp
这个文件,这是Chromium团队为nodejs跨平台设计的一种文件。通过node-gyp或者node-pre-gyp等nodejs命令工具,可以对Native模块进行重编译。
npm i -g node-gyp
使用node-gyp前,系统需要事先安装好以下环境:
Mac OS
- Xcode, 在Terminal上运行
xcode-select --install
- Python v2.7, 一般已经默认安装
Windows
npm i -g production windows-build-tools
Linux
- C/C++工具,例如GCC
- python v2.7
node-gyp手动编译Electron模块:
cd node_modules/addon
node-gyp rebuild --target=1.7.11 --arch=x64 --target_platform=darwin --dist-url=https://atom.io/download/atom-shell
若配过.npmrc,直接node-gyp rebuild
即可。
实践
简单的Native库,在配置了npmrc后,能直接下载成功,得到需要的.node文件。也有部分,除了Electron的Headers,还需要本地环境的支持。例如:canvas
和sqlite3
-
canvas
canvas是基于Cairo的图片处理库,该库的编译需要本地事先安装好以下环境:
OS Command OS X Using Homebrew: brew install pkg-config cairo pango libpng jpeg giflib librsvg
Ubuntu sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
Fedora sudo yum install gcc-c++ cairo-devel pango-devel libjpeg-turbo-devel giflib-devel
Solaris pkgin install cairo pango pkg-config xproto renderproto kbproto xextproto
Windows See the wiki 以上环境安装完成后:
cd node_modules/canvas
node-gyp rebuild
可以看到
canvas/build/Release/
下生成canvas.node文件 -
sqlite3
sqlite3本身的编译不算复杂,麻烦的是building for sqlcipher。编译加密的sqlite3版本。
MacOS
npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=`brew --prefix` --runtime=electron --target=1.7.11 --dist-url=https://atom.io/download/electron
或者:
cd node_modules/sqlite3
node-gyp rebuild --sqlite_libname=sqlcipher --sqlite=`brew --prefix` --runtime=electron --target=1.7.11 --dist-url=https://atom.io/download/electron --module_path=../lib/binding/electron-v1.7-darwin-x64 --module_name=node-sqlite3
macos上没有遇到什么问题,但在linux上折腾了很久。因为sqlite3加密也需要底层环境的各种支持,如基本的g++,sqlite编译需要的
libsqlite3-dev
,ld模块需要的sqlcipher等等。这些问题因为没什么普适性,就不展开讲,解决办法也就是根据报错去Google。
总结
Nodejs的原生模块,Electron本身也有提供electron-rebuild这样的工具,也介绍了如何配置来实现Native模块的自动编译,目前还没有去尝试。考虑到一般情况下,是在一台机子上打包三个平台的安装包,终究是要在不同操作系统下去对Native模块重编译的,所以,掌握好node-gyp的手动编译更重要些。。