Node.js應用不需要經過編譯過程,可以直接把源代碼拷貝到部署機上執行,確實比C++、Java這類編譯型應用部署方便。然而,Node.js應用執行需要有運行環境,意味著你需要先在部署機器上安裝Node.js。雖說沒有麻煩到哪里去,但畢竟多了一個步驟,特別是對于離線環境下的部署機,麻煩程度還要上升一級。假設你用Node.js寫一些小的桌面級工具軟件,部署到客戶機上還要先安裝Node.js,有點“大炮打蚊子”的感覺。更嚴重的是,如果部署機器上游多個Node.js應用,而且這些應用要依賴于不同的Node.js版本,那就更難部署了。
理想的情況是將Node.js打包為一個單獨的可執行文件,部署的時候直接拷貝過去就行了。除了部署方便外,因為不需要再拷貝源代碼了,還有利于保護知識產權。
將Node.js打包為可執行文件的工具有pkg、nexe、node-packer、enclose等,從打包速度、使用便捷程度、功能完整性來說,pkg是最優秀的。這篇文章就來講一講半年來我使用pkg打包Node.js應用的一些經驗。
pkg的打包原理簡單來說,就是將js代碼以及相關的資源文件打包到可執行文件中,然后劫持fs里面的一些函數,使它能夠讀到可執行文件中的代碼和資源文件。例如,原來的require('./a.js')會被劫持到一個虛擬目錄require('/snapshot/a.js')。
安裝
pkg既可以全局安裝也可以局部安裝,推薦采用局部安裝:
npm install pkg --save-dev
用法
pkg使用比較簡單,執行下pkg -h就可以基本了解用法,基本語法是:
pkg [options] <input>
<input>可以通過三種方式指定:
1.一個腳本文件,例如pkg index.js;
2.package.json,例如pkg package.json,這時會使用package.json中的bin字段作為入口文件;
3.一個目錄,例如pkg .,這時會尋找指定目錄下的package.json文件,然后在找bin字段作為入口文件。
[options]中可以指定打包的參數:
1.-t指定打包的目標平臺和Node版本,如-t node6-win-x64,node6-linux-x64,node6-macos-x64可以同時打包3個平臺的可執行程序;
2.-o指定輸出可執行文件的名稱,但如果用-t指定了多個目標,那么就要用--out-path指定輸出的目錄;
3.-c指定一個JSON配置文件,用來指定需要額外打包腳本和資源文件,通常使用package.json配置。
使用pkg的最佳實踐是:在package.json中的pkg字段中指定打包參數,使用npm scripts來執行打包過程,例如:
{ ... "bin": "./bin/www", "scripts": {  "pkg": "pkg . --out-path=dist/" }, "pkg": {  "scripts": [...]  "assets": [...],  "targets": [...] }, ...}scripts和assets用來配置未打包進可執行文件的腳本和資源文件,文件路徑可以使用glob通配符。這里就浮現出一個問題:為什么有的腳本和資源文件打包不進去呢?
新聞熱點
疑難解答
圖片精選