前端利器躬行記(1)——npm
npm(Node Package Manager)是Node.js的包管理工具,相當於一個線上倉庫。它提供了一個公共的平臺,將分散在世界各地的包集中起來,能輕鬆的安裝、分享和管理相關的包,不用再為搜尋包而煩惱,並且npm能自動處理包的依賴項。它由三部分組成:
(1)網站:可用來瀏覽、搜尋包的資訊。
(2)登錄檔:一個巨大的資料庫,儲存了每個包的資訊,例如作者、版本、依賴等。
(3)命令列介面(CLI):開發者可在CLI中對包進行釋出、安裝、解除安裝等操作。
由於新版的Node.js已集成了npm,因此在安裝完Node.js後就能使用npm了。
一、安裝包
npm有兩種安裝包的方式:本地安裝和全域性安裝,從使用的命令格式來看(如下所示),兩者只差一個“-g”引數(即標誌)。
npm install <package_name> [-g]
(1)如果程式碼要依賴於某個包(例如jquery、lodash等),那麼應該用本地安裝。在安裝完後,就能在當前目錄的node_modules目錄中找到相應的包,通過require()函式就能引用到。
npm install jquery
(2)如果要將包作為一個命令列工具(例如gulp、grunt等),那麼應該用全域性安裝。在安裝完後,就能在Node.js的安裝目錄或/usr/local的node_modules目錄中找到相應的包。
npm install gulp -g
二、package.json
package.json是一個位於專案根目錄的檔案,用於管理本地已安裝的npm包,記錄了專案的作者、依賴包、版本等各類資訊。有了package.json,就能很方便的克隆一個專案,而不必再手動的安裝相關的包,這樣利於多人協作。
1)建立
除了原始的手動建立之外,還能通過命令“npm init”或“npm init --yes”生成符合規範的package.json檔案,初始化的結果如下所示。
{ "name": "demo", "version": "1.0.0", "description": "test", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "strick", "license": "ISC" }
上面只列出了package.json的部分欄位(屬性),對它們的說明可參考表1,其中第三列會結合示例給出相應的值或用法,package.json的剩餘欄位可參考官方文件。
表1 package.json的欄位
欄位 | 描述 | 值或用法 |
name | 名稱,小寫且無空格,能與“-”或“_”符號混合 | "demo" |
version | 語義化的版本號(後文會有講解) | "1.0.0" |
description | 描述資訊 | "test" |
main | 程式的主入口檔案 | 當執行require("demo")時,就會載入根目錄下的index.js |
scripts | 指令碼命令 | 在執行時需要與“npm run”配合,例如“npm run test” |
keywords | 關鍵字,利於檢索 | [] |
author | 作者 | "strick" |
license | 許可證 | "ISC" |
2)依賴
在package.json中,有兩個欄位都記錄著專案的依賴包,如下所列。
(1)dependencies:在生產環境中所依賴的包,其安裝命令需要“--save”引數。
npm install <package_name> --save
(2)devDependencies:在開發環境中所依賴的包,其安裝命令會比dependencies多一個“-dev”引數。
npm install <package_name> --save-dev
當執行下面的兩條命令後。
npm install lodash --save npm install underscore --save-dev
在package.json中就會多兩段資訊,如下所示。
{ "dependencies": { "lodash": "^4.17.11" }, "devDependencies": { "underscore": "^1.9.1" } }
將上述包含依賴的package.json檔案分享到其它專案時,只要在該目錄中執行下面的命令,就能自動安裝所需的包,並且指定了包的版本,以免無法啟動專案。
npm install
3)版本
npm遵循semver版本規範,使用語義化的版本號來管理包,並且能設定版本範圍。一個版本號包含三位:X.Y.Z,分別代表主版本號(X)、次版本號(Y)和補丁版本號(Z),取值為非負整數,個位數不會補零。首次釋出的新產品,其版本號從“1.0.0”開始。
如果要升級版本號,那麼可以遵循下面所列的這三個規則。
(1)當有重大變化、不向下相容時,遞增主版本號(X),其餘兩位(Y和Z)置零,例如“2.0.0”。
(2)當釋出了向下相容的新功能時,遞增次版本號(Y),最後一位(Z)置零,例如“1.1.0”。
(3)當只是修復向下相容的錯誤時,遞增補丁版本號(Z),其餘兩位保持不變,例如“1.1.1”。
除了可以宣告一個固定版本號之外,還能通過多個符號(例如^、~、>、x、*等)指定版本號的範圍。接下來只介紹其中的兩個,每個符號後面都會給出對應的版本號範圍。
(1)如果在版本號之前加上^,那麼符合的版本號的X位要與其相同,並且剩餘兩位不小於指定的版本號。
^1.2.3 = [>=1.2.3 <2.0.0] ^0.2.3 = [>=0.2.3 <0.3.0]
(2)如果在版本號之前加上~,那麼符合的版本號的X位和Y位要與其相同,並且Z位不小於指定的版本號。
~1.2.3 = [>=1.2.3 <1.3.0] ~0.2.3 = [>=0.2.3 <0.3.0]
三、包和模組
在Node.js和npm中,雖然對包和模組有非常具體的定義(如下所列),但是大部分人還是會混淆。
(1)包(package)是由package.json描述的檔案或目錄。
(2)模組(module)是任何能被Node.js的require()函式載入的檔案或目錄,下面是模組常見的三種形式。
1)包含package.json檔案且定義了main欄位的目錄。
2)包含index.js檔案的目錄。
3)JavaScript檔案。
由此可知,大多數的npm包都是模組,只有一些特殊的包(例如只提供了命令API而沒有定義main入口的CLI包)不能被認為是模組。
四、常用命令
npm不僅包含基本的檢視命令,例如檢視版本號或包的資訊等;還包含實用的輔助命令,例如檢視指定的命令可組合的引數形式,如下所示。
npm -v 檢視npm的版本號 npm ls 檢視當前目錄安裝的包的資訊 npm install --help 檢視npm install可使用的引數形式
除了檢視之外,還有其它幾個常用的操作,例如安裝、解除安裝、更新、搜尋、釋出等。下面以lodash為例,列出了相關的命令。
npm install [email protected] 安裝4.0.1版本的lodash npm uninstall lodash 解除安裝lodash npm update lodash 更新lodash npm search lodash 搜尋lodash npm publish lodash 釋出lodash
五、淘寶npm映象
因為npm上的包都儲存在國外伺服器中,所以受網路影響大,很容易出現異常。在國內推薦使用淘寶npm映象,這是一個完整的npmjs.org映象,同步頻率為10分鐘一次,保證了與官方服務同步。只需要執行下面的安裝命令,就能用淘寶定製的cnpm替代預設的npm。
npm install -g cnpm --registry=https://registry.npm.taobao.org
由於cnpm的用法和npm完全一致,因此依然可以像下面這樣安裝lodash。
cnpm install [email protected]
&n