Electron是PC端的跨平台开发框架,咱们能够经过nodejs去调用其提供的各类底层API。但Electron为了保证自身文件体积较小和可持续开发,对API的数量进行了控制。好在,Electron一样支持Nodejs原生模块,只不过,须要用Electron的头文件进行重编译。node
项目本来的npm库管理很乱,各级目录下都有package.json,且没有同步全部用到的,也没有经过package-lock.json进行版本号管理。所以,以前若想在新的设备,尤为非mac os上从新配下开发和打包环境,很难。。基本都是靠手动复制node_modules...python
出于近期须要在linux上搭建一套开发环境的契机,对整个项目的架构进行从新梳理,重点就是npm库。由于换了操做系统,项目涉及到的Native库,须要从新编译。linux
Electron官方文档给出的方案,经过在.npmrc文件中配置相关环境变量,帮助npm在下载Native模块时,自动下载其对应的Electron版本。c++
npm config ls -l
git
.npmrc在不一样系统下的路径不同,经过上面的命令找到其位置,手动添加一下内容:github
// 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有差别不影响,不然,可能会报错:sql
'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模块进行重编译。shell
npm i -g node-gyp
macos
使用node-gyp前,系统须要事先安装好如下环境:npm
Mac OS
xcode-select --install
Windows
npm i -g production windows-build-tools
Linux
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的手动编译更重要些。。