2013年5月9日 星期四

NPK 釋出!打包你的 Node.js 程式!

Standard
NPK』是什麼?一個打包 Node.js 程式的工具,之所以會有這個工具,完全是拜下周(5/18 - 5/19)將在中研院舉行的 JSDC 所賜。因為這次筆者也有個 Talk,將探討如何去編譯我們寫出來的 Node.js 程式,所以過程中便寫出了這樣一個工具。

https://github.com/cfsghost/npk

事實上,目前的 NPK 不是個新東西。JavaScript 經過多年的發展,早已經有非常多合併 JavaScript 程式碼的工具可以使用,對於前端工程師來說,是再尋常不過。不過,針對 Node.js 的程式碼,這樣的工具卻相對來說非常少。

如果你想嘗試使用看看,可以立即用 NPM 來安裝 NPK:
npm install npk -g

以 NPK 裡的範例專案為例,你可以直接下命令打包該專案:
npk tests/purejs/

接著你可以在輸出的資料夾中找到打包好的檔案:
tests/purejs/out/app.js/

甚至是直接執行他:
node tests/purejs/out/app.js/app.js

NPK 工具定義了一個新的屬性『npk_target』在 package.json,用來讓程式人員自行決定要合併和連結哪些 JavaScript 程式(像過去為 C/C++ 等語言寫 Makefile),可以參考 NPK 內附範例專案的 package.json。

最終目標『編譯』成二進位格式(Binary)

在與一些企業以及同業分享 Node.js 技術和其未來發展時,時不時會有人提出一個問題:『我們能不能編譯自己寫的 Node.js 程式?』這個問題,往往會開始引發一長串的討論,有一些人為終止這個問題,甚至會開始引用 JavaScript 語言的設計宗旨:『明碼保存,不需要預先編譯』,來強調我們不應該把 JavaScript 的優勢給閹掉。當然,這樣一廂情願的說法,是不可能消除許多人的疑慮,尤其是和 Open Source 路線不熟的企業,或是被『壞客戶欺負』的工程師。

有些眼睛比較亮的人,或許已經發現到,這其實是個複合性的命題,會提出這個問題的人,多半想要知道或得到的是:
  • 能否透過預先編譯 JavaScript 程式,讓執行效能提升。
  • 想要打包自己寫的程式,讓他合併成一個,以方便釋出或管理。
  • 保護自己的程式碼。

這些都將會是 NPK 的目標,但現在暫且不提 Node.js 程式碼被編譯的可行性,更多細節將會在 JSDC 的議程上有更近一步的探討。但若只是要達到第二項,打包自己的程式,將 Node.js 程式碼合而為一,你現在就已經可以用『NPK』工具做到。

後記

為了準備 JSDC 的 Talk,過程中筆者原本使用了一個 NPM 上現成的模組『nld』,完成合併 Node.js 程式碼的工作,但由於該模組有一些問題,而且有一年以上沒有維護。種種因素,才促使自己動手做一個新的 Node.js Linker 給 NPK。

此外,有興趣的人可以試著用編輯器打開打包成功的 JavaScript 檔案,你除了會看到所有的 Source Code 已經被合併,而且會發現程式碼都經過 Uglify 處理過,某種程度上可以算是被加密了。