关于Electron原生模块编译的一点总结

2019-01-08  本文已影响136人  charles0427

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库:canvassqlite3

配置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

  1. Xcode, 在Terminal上运行xcode-select --install
  2. Python v2.7, 一般已经默认安装

Windows

npm i -g production windows-build-tools

Linux

  1. C/C++工具,例如GCC
  2. 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,还需要本地环境的支持。例如:canvassqlite3

总结

Nodejs的原生模块,Electron本身也有提供electron-rebuild这样的工具,也介绍了如何配置来实现Native模块的自动编译,目前还没有去尝试。考虑到一般情况下,是在一台机子上打包三个平台的安装包,终究是要在不同操作系统下去对Native模块重编译的,所以,掌握好node-gyp的手动编译更重要些。。

上一篇下一篇

猜你喜欢

热点阅读