最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用pkg打包Node.js應用的方法步驟

 更新時間:2018年10月19日 15:28:47   作者:jingsam  
這篇文章主要介紹了使用pkg打包Node.js應用的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Node.js應用不需要經過編譯過程,可以直接把源代碼拷貝到部署機上執(zhí)行,確實比C++、Java這類編譯型應用部署方便。然而,Node.js應用執(zhí)行需要有運行環(huán)境,意味著你需要先在部署機器上安裝Node.js。雖說沒有麻煩到哪里去,但畢竟多了一個步驟,特別是對于離線環(huán)境下的部署機,麻煩程度還要上升一級。假設你用Node.js寫一些小的桌面級工具軟件,部署到客戶機上還要先安裝Node.js,有點“大炮打蚊子”的感覺。更嚴重的是,如果部署機器上游多個Node.js應用,而且這些應用要依賴于不同的Node.js版本,那就更難部署了。

理想的情況是將Node.js打包為一個單獨的可執(zhí)行文件,部署的時候直接拷貝過去就行了。除了部署方便外,因為不需要再拷貝源代碼了,還有利于保護知識產權。

將Node.js打包為可執(zhí)行文件的工具有pkg、nexe、node-packer、enclose等,從打包速度、使用便捷程度、功能完整性來說,pkg是最優(yōu)秀的。這篇文章就來講一講半年來我使用pkg打包Node.js應用的一些經驗。

pkg的打包原理簡單來說,就是將js代碼以及相關的資源文件打包到可執(zhí)行文件中,然后劫持fs里面的一些函數(shù),使它能夠讀到可執(zhí)行文件中的代碼和資源文件。例如,原來的require('./a.js')會被劫持到一個虛擬目錄require('/snapshot/a.js')。

安裝

pkg既可以全局安裝也可以局部安裝,推薦采用局部安裝:

npm install pkg --save-dev

用法

pkg使用比較簡單,執(zhí)行下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]中可以指定打包的參數(shù):

1.-t指定打包的目標平臺和Node版本,如-t node6-win-x64,node6-linux-x64,node6-macos-x64可以同時打包3個平臺的可執(zhí)行程序;
2.-o指定輸出可執(zhí)行文件的名稱,但如果用-t指定了多個目標,那么就要用--out-path指定輸出的目錄;
3.-c指定一個JSON配置文件,用來指定需要額外打包腳本和資源文件,通常使用package.json配置。

使用pkg的最佳實踐是:在package.json中的pkg字段中指定打包參數(shù),使用npm scripts來執(zhí)行打包過程,例如:

{
 ...
 "bin": "./bin/www",
 "scripts": {
  "pkg": "pkg . --out-path=dist/"
 },
 "pkg": {
  "scripts": [...]
  "assets": [...],
  "targets": [...]
 },
 ...
}

scripts和assets用來配置未打包進可執(zhí)行文件的腳本和資源文件,文件路徑可以使用glob通配符。這里就浮現(xiàn)出一個問題:為什么有的腳本和資源文件打包不進去呢?

要回答這個問題,就涉及到pkg打包文件的機制。按照pkg文檔的說法,pkg只會自動地打包相對于__dirname、__filename的文件,例如path.join(__dirname, '../path/to/asset')。至于require(),因為require本身就是相對于__dirname的,所以能夠自動打包。假設文件中有以下代碼:

require('./build/' + cmd + '.js')
path.join(__dirname, 'views/' + viewName)

這些路徑都不是常量,pkg沒辦法幫你自動識別要打包哪個文件,所以文件就丟失了,所以這時候就使用scripts和assets來告訴pkg,這些文件要打包進去。那么我們怎么知道哪些文件沒有被打包呢?難倒要一行行地去翻源代碼嗎?其實很簡單,只需要把打包好的文件運行下,報錯信息一般就會告訴你缺失哪些文件,并且pkg在打包過程中也會提示一些它不能自動打包的文件。

注意事項

如果說pkg還有哪兒還可以改進的地方,那就是無法自動打包二進制模塊*.node文件。如果你的項目中引用了二進制模塊,如sqlite3,那么你需要手動地將*.node文件復制到可執(zhí)行文件同一目錄,我通常使用命令cp node_modules/**/*.node .一鍵完成。但是,如果你要跨平臺打包,例如在windows上打包linux版本,相應的二進制模塊也要換成linux版本,通常需要你手動的下載或者編譯。

那為什么pkg不能將二進制模塊打包進去呢?我猜想是require載入一個js文件和node文件,它們的機制是不一樣的。另外從設計來說,不自動打包二進制模塊也是合理的,因為二進制模塊都是平臺相關的。如果我在windows上生成一個linux文件,那么就需要拉取linux版本的.node文件,這是比較困難的。并且有些二進制模塊不提供預編譯版本,需要安裝的時候編譯,pkg再牛也不可能模擬一個其他平臺的編譯環(huán)境吧。nexe可以自動打包二進制模塊,但是只能打包當前平臺和當前版本的可執(zhí)行文件。這意味著如果Node.js應用引用了二進制包,那么這個應用就不能跨平臺打包了,所以我認為這方面,nexe不能算是一個好的設計。

還有一點就是關于項目中的配置文件處理,比如數(shù)據(jù)庫連接參數(shù)、環(huán)境變量等。因為這些配置文件會跟著不同的部署環(huán)境進行更改,所以為了方便更改,一般不希望把配置文件打包到exe。為了避免pkg自動地將配置文件打包到exe中,代碼中不要采用以下方式讀取配置文件:

fs.readFile(path.join(__dirname, './config.json')), callback)

而是采用相對于process.CWD()的方法讀?。?br />

fs.readFile(path.join(process.CWD(), './config.json'), callback)
// 或者
fs.readFile('./config.json', callback)

如果配置文件是js格式的,那么不要直接require('./config'),而是采用動態(tài)require:

const config = require(process.CWD() + './config')

另外要提及的是pkg打包之后動態(tài)載入js文件會有安全性問題,即用戶可以在js文件寫任何處理邏輯,注入到打包后的exe中。例如,可以讀取exe里面的虛擬文件系統(tǒng),把源代碼導出來。所以,盡量不要采用JS作為配置文件,也不要動態(tài)載入js模塊。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Node.js使用Angular簡單示例

    Node.js使用Angular簡單示例

    這篇文章主要介紹了Node.js使用Angular簡單示例,如何在Node.js項目中引入AngularJS,這次提供一個非常簡單的示例,演示AngularJS里的指令、數(shù)據(jù)綁定、服務等內容。感興趣的小伙伴們可以參考一下
    2018-05-05
  • Nodejs?Sequelize手冊學習快速入門到應用

    Nodejs?Sequelize手冊學習快速入門到應用

    這篇文章主要為大家介紹了Nodejs?Sequelize手冊學習快速入門到應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Node.js調試技術總結分享

    Node.js調試技術總結分享

    Node.js是一個可以快速構建網絡服務及應用的平臺。該平臺的構建是基于Chrome's JavaScript runtime,也就是說,實際上它是對Google V8引擎(應用于Google Chrome瀏覽器)進行了封裝。 今天介紹Node.js調式目前有幾種技術,需要的朋友可以參考下。
    2017-03-03
  • node.js應用后臺守護進程管理器Forever安裝和使用實例

    node.js應用后臺守護進程管理器Forever安裝和使用實例

    這篇文章主要介紹了node.js應用后臺守護進程管理器Forever安裝和使用實例,forever可以看做是一個nodejs的守護進程,能夠啟動,停止,重啟我們的app應用,需要的朋友可以參考下
    2014-06-06
  • nodejs用gulp管理前端文件方法

    nodejs用gulp管理前端文件方法

    本篇文章給大家分享了nodejs用gulp管理前端文件的步驟方法以及優(yōu)缺點分析,有興趣的朋友參考下。
    2018-06-06
  • 整理幾個關鍵節(jié)點深入理解nodejs

    整理幾個關鍵節(jié)點深入理解nodejs

    這篇文章主要介紹了整理幾個關鍵節(jié)點深入理解nodejs,文章圍繞主題展開詳細的內容介紹,需要的小伙伴可以參考一下,需要的小伙伴可以參考一下
    2022-07-07
  • 詳解node如何將Excel導入數(shù)據(jù)庫

    詳解node如何將Excel導入數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了node如何通過腳本實現(xiàn)將Excel導入mysql數(shù)據(jù)庫里,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2024-11-11
  • Node.js使用express寫接口的具體代碼

    Node.js使用express寫接口的具體代碼

    這篇文章主要介紹了Node.js使用express寫接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Node模塊化開發(fā)實例解析

    Node模塊化開發(fā)實例解析

    這篇文章主要為大家介紹了Node模塊化開發(fā)實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • pnpm管理依賴包如何節(jié)省磁盤空間詳解

    pnpm管理依賴包如何節(jié)省磁盤空間詳解

    這篇文章主要為大家介紹了pnpm管理依賴包如何節(jié)省磁盤空間詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論

四子王旗| 仙桃市| 陇川县| 康保县| 封开县| 桂平市| 鹿邑县| 娱乐| 澳门| 宾川县| 河北省| 金塔县| 府谷县| 靖西县| 颍上县| 二连浩特市| 雅安市| 吴江市| 交口县| 渭南市| 常德市| 正镶白旗| 吉木乃县| 宾川县| 新余市| 兰州市| 陆河县| 霍林郭勒市| 永胜县| 怀化市| 金平| 长丰县| 庆阳市| 德安县| 陕西省| 桂阳县| 甘德县| 洛宁县| 绵竹市| 友谊县| 石阡县|