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的手動編譯更重要些。。