­

前端利器躬行記(1)——npm

  • 2019 年 10 月 3 日
  • 筆記

  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 lodash@4.0.1           安裝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 lodash@4.0.1