Node.js從入門到實戰(三)Npm使用介紹
一、NPM
NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS程式碼部署上的很多問題,常見的使用場景有以下幾種:
- 允許使用者從NPM伺服器下載別人編寫的第三方包到本地使用。
- 允許使用者從NPM伺服器下載並安裝別人編寫的命令列程式到本地使用。
- 允許使用者將自己編寫的包或命令列程式上傳到NPM伺服器供別人使用。
$ 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 檔案可以有以下幾點作用:
- 作為一個描述檔案,描述了你的專案依賴哪些包
- 允許我們使用 “語義化版本規則”(後面介紹)指明你專案依賴包的版本
- 讓你的構建更好地與其他開發者分享,便於重複使用
在npm使用時,在本地目錄中如果沒有 package.json 這個檔案的話,那麼最新版本的包會被安裝。如果存在 package.json 檔案,則會在 package.json 檔案中查詢針對這個包所約定的語義化版本規則,然後安裝符合此規則的最新版本。
使用 npm init 即可在當前目錄建立一個 package.json 檔案,package.json 檔案至少要有兩部分內容:
- “name” 全部小寫,沒有空格,可以使用下劃線或者橫線
- “version” x.x.x 的格式,符合“語義化版本規則”
- description:描述資訊,有助於搜尋
- main: 入口檔案,一般都是 index.js
- scripts:支援的指令碼,預設是一個空的 test
- keywords:關鍵字,有助於在人們使用 npm search 搜尋時發現你的專案
- author:作者資訊
- license:預設是 MIT
- bugs:當前專案的一些錯誤資訊,如果有的話
- 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 版本開始。以後要升級版本應該遵循以下標準:
- 補丁版本:解決了 Bug 或者一些較小的更改,增加最後一位數字,比如 1.0.1
- 小版本:增加了新特性,同時不會影響之前的版本,增加中間一位數字,比如 1.1.0
- 大版本:大改版,無法相容之前的,增加第一位數字,比如 2.0.0
1. 如果只打算接受補丁版本的更新(也就是最後一位的改變),就可以這麼寫:
- 1.0
- 1.0.x
- ~1.0.4
- 1
- 1.x
- ^1.0.4
- *
- 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 指令碼有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]