1. 程式人生 > >Node.js從入門到實戰(三)Npm使用介紹

Node.js從入門到實戰(三)Npm使用介紹

一、NPM

NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS程式碼部署上的很多問題,常見的使用場景有以下幾種:

  1. 允許使用者從NPM伺服器下載別人編寫的第三方包到本地使用。
  2. 允許使用者從NPM伺服器下載並安裝別人編寫的命令列程式到本地使用。
  3. 允許使用者將自己編寫的包或命令列程式上傳到NPM伺服器供別人使用。
由於新版的nodejs已經集成了npm,所以之前npm也一併安裝好了。同樣可以通過輸入 "npm -v" 來測試是否成功安裝。命令如下,出現版本提示表示安裝成功:
$ npm -v
2.3.0

npm的安裝和升級:

npm的安裝通過官網進行,升級通過如下npm命令:

npm install 
[email protected]
-g

二、使用npm安裝node.js模組

模組安裝

npm 安裝 Node.js 模組語法格式如下:

npm install <Module Name>
以下例項,我們使用 npm 命令安裝常用的 Node.js web框架模組 express:
npm install express
安裝好之後,express 包就放在了工程目錄下的 node_modules 目錄中,因此在程式碼中只需要通過 require('express') 的方式就好,無需指定第三方包路徑。
var express = require('express');

全域性安裝

npm 的包安裝分為本地安裝(local)、全域性安裝(global)兩種,從敲的命令列來看,差別只是有沒有-g而已,比如
npm install express          # 本地安裝
npm install express -g       # 全域性安裝
本地安裝
1. 將安裝包放在 ./node_modules 下(執行 npm 命令時所在的目錄),如果沒有 node_modules 目錄,會在當前執行 npm 命令的目錄下生成node_modules 目錄。
2. 可以通過 require() 來引入本地安裝的包。
全域性安裝
1. 將安裝包放在 /usr/local 下或者你 node 的安裝目錄。
2. 可以直接在命令列裡使用

按照package約定的版本安裝:

npm install 預設會安裝 package.json 中 dependencies 和 devDependencies 裡的所有模組。如果想只安裝 dependencies 中的內容,可以使用 --production 欄位:

npm install --production

模組解除安裝

模組解除安裝可以使用如下的命令:

npm uninstall express
安裝引數 --save 和 --save -dev

在使用 npm install 時增加 --save 或者 --save -dev 字尾:
  • npm install <package_name> --save 表示將這個包名及對應的版本新增到 package.json的 dependencies
  • npm install <package_name> --save-dev 表示將這個包名及對應的版本新增到 package.json的 devDependencies

三、package.json檔案

管理本地安裝 npm 包的最好方式就是建立 package.json 檔案。一個 package.json 檔案可以有以下幾點作用:

  1. 作為一個描述檔案,描述了你的專案依賴哪些包
  2. 允許我們使用 “語義化版本規則”(後面介紹)指明你專案依賴包的版本
  3. 讓你的構建更好地與其他開發者分享,便於重複使用

在npm使用時,在本地目錄中如果沒有 package.json 這個檔案的話,那麼最新版本的包會被安裝。如果存在 package.json 檔案,則會在 package.json 檔案中查詢針對這個包所約定的語義化版本規則,然後安裝符合此規則的最新版本。
使用 npm init 即可在當前目錄建立一個 package.json 檔案,package.json 檔案至少要有兩部分內容:

  1. “name”        全部小寫,沒有空格,可以使用下劃線或者橫線
  2. “version”     x.x.x 的格式,符合“語義化版本規則”
其他內容:
  1. description:描述資訊,有助於搜尋
  2. main: 入口檔案,一般都是 index.js
  3. scripts:支援的指令碼,預設是一個空的 test
  4. keywords:關鍵字,有助於在人們使用 npm search 搜尋時發現你的專案
  5. author:作者資訊
  6. license:預設是 MIT
  7. bugs:當前專案的一些錯誤資訊,如果有的話
我們需要在 package.json 檔案中指定專案依賴的包,這樣別人在拿到這個專案時才可以使用 npm install 下載。包有兩種依賴方式:
  • dependencies:在生產環境中需要用到的依賴
  • devDependencies:在開發、測試環境中用到的依賴
舉個例子:
{
    "name": "my-weex-demo",
    "version": "1.0.0",
    "description": "a weex project",
    "main": "index.js",
    "scripts": {
        "build": "weex-builder src dist",
        "build_plugin": "webpack --config ./tools/webpack.config.plugin.js --color",
        "dev": "weex-builder src dist -w",
        "serve": "serve -p 8080"
    },
    "keywords": [
        "weex"
    ],
    "author": "[email protected]",
    "license": "MIT",
    "devDependencies": {
        "babel-core": "^6.14.0",
        "babel-loader": "^6.2.5",
        "babel-preset-es2015": "^6.18.0",
        "vue-loader": "^10.0.2",
        "eslint": "^3.5.0",
        "serve": "^1.4.0",
        "webpack": "^1.13.2",
        "weex-loader": "^0.3.3",
        "weex-builder": "^0.2.6"
    },
    "dependencies": {
        "weex-html5": "^0.3.2",
        "weex-components": "*"
    }
}
Semantic versioning(語義化版本規則)

dependencies 的內容,以 "weex-html5": "^0.3.2"為例,我們知道 key 是依賴的包名稱,value 是這個包的版本。那版本前面的 ^ 或者版本直接是一個 * 是什麼意思呢?
這就是 npm 的 “Semantic versioning”,簡稱”Semver”,中文含義即“語義化版本規則”。在安卓開發中我們有過這樣的經驗:有時候依賴的包升級後大改版,之前提供的介面不見了,這對使用者的專案可能造成極大的影響。因此我們在宣告對某個包的依賴時需要指明是否允許 update 到新版本,什麼情況下允許更新。
這就需要先了解 npm 包提供者應該注意的版本號規範。如果一個專案打算與別人分享,應該從 1.0.0 版本開始。以後要升級版本應該遵循以下標準:

  1. 補丁版本:解決了 Bug 或者一些較小的更改,增加最後一位數字,比如 1.0.1
  2. 小版本:增加了新特性,同時不會影響之前的版本,增加中間一位數字,比如 1.1.0
  3. 大版本:大改版,無法相容之前的,增加第一位數字,比如 2.0.0
瞭解了提供者的版本規範後, npm 包使用者就可以針對自己的需要填寫依賴包的版本規則。作為使用者,我們可以在 package.json 檔案中寫明我們可以接受這個包的更新程度(假設當前依賴的是 1.0.4 版本):
1. 如果只打算接受補丁版本的更新(也就是最後一位的改變),就可以這麼寫: 
  • 1.0
  • 1.0.x
  • ~1.0.4
2. 如果接受小版本的更新(第二位的改變),就可以這麼寫: 
  • 1
  • 1.x
  • ^1.0.4
3. 如果可以接受大版本的更新(自然接受小版本和補丁版本的改變),就可以這麼寫: 
  • *
  • x
小結一下:總共三種版本變化型別,接受依賴包哪種型別的更新,就把版本號準確寫到前一位。

獲取欄位

通過npm_package_字首,npm 指令碼可以拿到package.json裡面的欄位。比如,下面是一個package.json。

{
  "name": "foo", 
  "version": "1.2.5",
  "scripts": {
    "view": "node view.js"
  }
}

那麼,變數npm_package_name返回foo,變數npm_package_version返回1.2.5。

package-lock.json

package-lock.json是當 node_modules 或 package.json 發生變化時自動生成的檔案。這個檔案主要功能是確定當前安裝的包的依賴,以便後續重新安裝的時候生成相同的依賴,而忽略專案開發過程中有些依賴已經發生的更新。其最大的好處就是能獲得可重複的構建(repeatable build),當你在CI(持續整合)上重複build的時候,得到的artifact是一樣的,因為依賴的版本都被鎖住了。在npm5以後,其內容和npm-shrinkwrap.json一模一樣。

四、npm run執行

npm 還可以直接執行 package.json 中 scripts 指定的指令碼:

{
  "name": "demo",
  "scripts": {
    "lint": "jshint **.js",
    "test": "mocha test/"
  }
}
npm run 是 npm run-script 的縮寫。命令列輸入npm run lint 或者 npm run-script lint 就會執行 jshint **.js 。
這些定義在package.json裡面的指令碼,就稱為 npm 指令碼。它的優點很多。
  • 專案的相關指令碼,可以集中在一個地方。
  • 不同專案的指令碼命令,只要功能相同,就可以有同樣的對外介面。使用者不需要知道怎麼測試你的專案,只要執行npm run test即可。
  • 可以利用 npm 提供的很多輔助功能。
檢視當前專案的所有 npm 指令碼命令,可以使用不帶任何引數的npm run命令。
npm 指令碼有pre和post兩個鉤子。舉例來說,build指令碼命令的鉤子就是prebuild和postbuild。使用者執行npm run build的時候,會自動按照下面的順序執行。因此,可以在這兩個鉤子裡面,完成一些準備工作和清理工作。

五、使用淘寶映象

國內直接使用 npm 的官方映象是非常慢的,這裡推薦使用淘寶 NPM 映象。淘寶 NPM 映象是一個完整 npmjs.org 映象,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證儘量與官方服務同步。可以使用淘寶定製的cnpm (gzip 壓縮支援) 命令列工具代替預設的 npm:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org
這樣就可以使用 cnpm 命令來安裝模組了:
$ cnpm install [name]