工程目錄
了解了以上知識後,現在我們可以來完整地規劃一個工程目錄了。以編寫一個命令列程式為例,一般我們會同時提供命令列模式和 API 模式兩種使用方式,我們會藉助三方包來編寫程式碼。除了程式碼外,一個完整的程式也應該有自己的文件和測試案例。因此,一個標準的工程目錄都看起來像下邊。
- /home/user/workspace/node-echo/ # 工程目录 - bin/ # 存放命令行相关代码 node-echo + doc/ # 存放文档 - lib/ # 存放API相关代码 echo.js - node_modules/ # 存放三方包 + argv/ + tests/ # 存放测试用例 package.json # 元数据文件 README.md # 说明文件
其中部分文件內容如下:
/* bin/node-echo */ var argv = require('argv'), echo = require('../lib/echo'); console.log(echo(argv.join(' '))); /* lib/echo.js */ module.exports = function (message) { return message; }; /* package.json */ { "name": "node-echo", "main": "./lib/echo.js" }
上述範例中分類存放了不同類型的文件,並透過 node_moudles 目錄直接使用三方包名載入模組。此外,定義了package.json 之後,node-echo 目錄也可被當作一個套件來使用。
NPM
NPM 是隨同 NodeJS 一起安裝的套件管理工具,能解決 NodeJS 程式碼部署上的許多問題,常見的使用情境有以下幾種:
可以看到,NPM 建立了一個 NodeJS 生態圈,NodeJS 開發者和使用者可以在裡邊互通有無。以下分別介紹這三種場景下如何使用 NPM。
下載三方包
需要使用三方包時,首先得知道有哪些包可用。雖然 npmjs.org 提供了個搜尋框可以根據包名來搜索,但如果連想使用的三方包的名字都不確定的話,就請百度一下吧。知道了包名後,例如上邊範例中的 argv,就可以在工程目錄下開啟終端,使用以下指令來下載三方包。
$ npm install argv ... argv@0.0.2 node_modules\argv
下載好之後,argv 套件就放在了工程目錄下的 node_modules 目錄中,因此在程式碼中只需要通過 require('argv')的方式就好,無需指定三方包路徑。
以上指令預設下載最新版三方包,如果想要下載指定版本的話,可以在包名後邊加上@
$ npm install argv@0.0.1 ... argv@0.0.1 node_modules\argv
如果使用到的三方包比較多,在終端機下一個包一條命令地安裝未免太人肉了。因此 NPM 對 package.json 的字段做了擴展,允許在其中申明三方包依賴。因此,上邊範例中的 package.json 可以改寫如下:
{ "name": "node-echo", "main": "./lib/echo.js", "dependencies": { "argv": "0.0.2" } }
這樣處理後,在工程目錄下就可以使用 npm install 指令批次安裝三方包了。更重要的是,當以後 node-echo 也上傳到了 NPM 伺服器,別人下載這個套件時,NPM 會根據套件中申明的三方套件依賴自動下載進一步依賴的三方套件。例如,使用 npm install node-echo 指令時,NPM 會自動建立下列目錄結構。
- project/ - node_modules/ - node-echo/ - node_modules/ + argv/ ... ...
如此一來,使用者只需關心自己直接使用的三方包,不需要自己去解決所有包的依賴關係。
安裝命令列程式
從 NPM 服務下載安裝一個命令列程式的方法與三方套件類似。例如上例中的 node-echo 提供了命令列使用方式,只要 node-echo 自己配置好了相關的 package.json 字段,對於使用者而言,只需要使用以下命令安裝程式。
$ npm install node-echo -g
參數中的 -g 表示全域安裝,因此 node-echo 會預設安裝到以下位置,並且 NPM 會自動建立好 Linux 系統下所需的軟鏈檔案或 Windows 系統下需要的.cmd檔。
- /usr/local/ # Linux系统下 - lib/node_modules/ + node-echo/ ... - bin/ node-echo ... ... - %APPDATA%\npm\ # Windows系统下 - node_modules\ + node-echo\ ... node-echo.cmd ...
發布程式碼
第一次使用 NPM 發布代碼前需要註冊一個帳號。終端機下運行 npm adduser,之後按照提示做即可。帳號搞定後,接著我們需要編輯 package.json 文件,加入 NPM 必需的欄位。接著上方 node-echo 的例子,package.json 裡必要的欄位如下。
{ "name": "node-echo", # 包名,在NPM服务器上须要保持唯一 "version": "1.0.0", # 当前版本号 "dependencies": { # 三方包依赖,需要指定包名和版本号 "argv": "0.0.2" }, "main": "./lib/echo.js", # 入口模块位置 "bin" : { "node-echo": "./bin/node-echo" # 命令行程序名和主模块位置 } }
之後,我們就可以在 package.json 所在目錄下執行 npm publish 發布程式碼了。
版本號碼
使用 NPM 下載和發佈程式碼時都會接觸到版本號。 NPM 使用語意版本號來管理程式碼,這裡簡單介紹一下。
語意版本號分為 X.Y.Z 三位,分別代表主版本號、次版本號和補丁版本號。當程式碼變更時,版本號碼會依照下列原則更新。
+ 如果只是修復bug,需要更新Z位。
+ 如果是新增了功能,但是向下相容,需要更新Y位元。
+ 如果有大變動,向下不相容,需要更新X位元。
版本號碼有了這個保證後,在申明三方包依賴時,除了可依賴一個固定版本號外,還可依賴某個範圍的版本號。例如"argv": "0.0.x"表示依賴 0.0.x 系列的最新版 argv。 NPM 支援的所有版本號範圍指定方式可以查看官方文件。
靈機一點
除了本章介紹的部分外,NPM 還提供了許多功能,package.json 裡也有很多它有用的欄位。除了可以在 npmjs.org/doc/ 查看官方文件外,這裡再介紹一些 NPM 常用指令。
NPM 提供了許多指令,例如 install 和 publish,使用 npm help 可查看所有指令。