1. 程式人生 > >前端利器躬行記(1)——npm

前端利器躬行記(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