npm是 Node.js 官方提供的包管理工具,它已經(jīng)成了 Node.js 包的標準發(fā)布平臺,用于 Node.js 包的發(fā)布、傳播、依賴控制。npm 提供了命令行工具,使你可以方便地下載、安裝、升級、刪除包,也可以讓你作為開發(fā)者發(fā)布并維護包。
npm 是隨同 Node.js 一起安裝的包管理工具,能解決 Node.js 代碼部署上的很多問題,常見的場景有以下幾種:
- 允許用戶從 npm 服務器下載別人編寫的第三方包到本地使用。
- 允許用戶從 npm 服務器下載并安裝別人編寫的命令行程序到本地使用。
- 允許用戶將自己編寫的包或命令行程序上傳到 npm 服務器供別人使用。
安裝
- 新版的nodejs已經(jīng)集成了npm,測試版本:
$npm -v
6.9.0
- 升級
$sudo npm install npm -g
- windows 環(huán)境
npm install npm -g
- 查看npm擁有的全部命令
$ npm --help
$ npm help
查看某一個npm命令的詳細用法
$ npm <command> --help
$ npm help <command>
使用
- 包管理
npm install <package_name>
例如安裝express:
$npm install express # 本地安裝
$npm install express -g # 全局安裝
指定一個版本:
$npm install express@4.0.1
- 查看模塊的當前版本號
npm view 模塊名 version
需要注意的是查看到的模塊版本是該模塊再遠程倉庫的版本號,并不是當前項目中所依賴的版本號。
- 查看當前項目中應用的某個模塊的版本號的命令為
npm list 模塊名 version
- 查看模塊的歷史版本和當前版本
npm view 模塊名 versions
- 查看一個模塊的所有信息
npm view 模塊名
本地安裝的話,包會安裝當前目錄node_modules文件夾下
在全局模式下面,NPM會把包安裝到/usr/local/lib/node_module
常見錯誤:
npm err! Error: connect ECONNREFUSED 127.0.0.1:8087
運行 npm config set proxy null
- 查看全局安裝
$npm list -g --depth 0
- 設置環(huán)境變量
下面命令等于為 npm init 設置了默認值,以后執(zhí)行 npm init 的時候,package.json 的作者姓名、郵件、主頁、許可證字段就會自動寫入預設的值。這些信息會存放在用戶主目錄的 ~/.npmrc文件,使得用戶不用每個項目都輸入。如果某個項目有不同的設置,可以針對該項目運行npm config
$ npm set init-author-name 'Your name'
$ npm set init-author-email 'Your email'
$ npm set init-author-url 'http://yourdomain.com'
$ npm set init-license 'MIT'
- npm常用命令
- npm init 會引導你創(chuàng)建一個package.json文件,包括名稱、版本、作者這些信息等
- npm install <name> 安裝nodejs的依賴包
- npm install <name> -g 將包安裝到全局環(huán)境中
- npm install <name> --save 安裝的同時,將信息寫入package.json中。項目路徑中如果有package.json文件時,直接使用npm install方法就可以根據(jù)dependencies配置安裝所有的依賴包
- npm remove <name> 移除
- npm update <name> 更新
- npm ls 列出當前安裝的了所有包
- npm root 查看當前包的安裝路徑
- npm root -g 查看全局的包的安裝路徑
- npm info 命令可以查看每個模塊的具體信息。
- npm prune 清除未被使用到的模塊
5.使用 package.json
通常我們使用npm init命令來創(chuàng)建一個npm程序時,會自動生成一個package.json文件。package.json文件會描述這個NPM包的所有相關信息,包括作者、簡介、包依賴、構建等信息,格式是嚴格的JSON格式。
- 命令行方式創(chuàng)建package.json
$ npm init //生成一個package.json
然后在當前目錄生成一個基本的package.json文件。所有問題之中,只有項目名稱(name)和項目版本(version)是必填的,其他都是選填的,一路下一步。
- 查看生成的package
$cat package.json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
-
屬性介紹
name
name和version是package.json中最重要的兩個字段,也是發(fā)布到NPM平臺上的唯一標識,如果沒有正確設置這兩個字段,包就不能發(fā)布和被下載。version
包的版本號。如"1.0.0"。
在node.js中的package.json配置文件中,我們需要配置版本號,比如0.1.2
第一位數(shù)字:主版本號
第二位數(shù)字:子版本號
第三位數(shù)字:補丁版本號description
包的描述信息,將會在npm search的返回結果中顯示,以幫助用戶選擇合適的包。keywords
包的關鍵詞信息,是一個字符串數(shù)組,同上也將顯示在npm search的結果中。homepage
包的主頁地址。bugs
包的bug跟蹤主頁地址。license
包的開源協(xié)議名稱。author
包的作者。contributors, maintainers
包的貢獻者,是一個數(shù)組。files(較少用)
包所包含的所有文件,可以取值為文件夾。通常我們還是用.npmignore來去除不想包含到包里的文件。main
包的入口文件。bin(較少用)
如果你的包里包含可執(zhí)行文件,通過設置這個字段可以將它們包含到系統(tǒng)的PATH中,這樣直接就可以運行,很方便。
-
man(較少用)
為系統(tǒng)的man命令提供幫助文檔。幫助文件的文件名必須以數(shù)字結尾,如果是壓縮的,需要以.gz結尾。
"man": ["./man/foo.1", "./man/bar.1", "./man/foo.2" ]
directories(較少用)
CommonJS包所要求的目錄結構信息,展示項目的目錄結構信息。字段可以是:lib, bin, man, doc, example。值都是字符串。repository
包的倉庫地址。
"repository": {
"type": "git",
"url": "git+https://github.com/rainnaZR/es6-react.git"
},scripts
通過設置這個可以使NPM調用一些命令腳本,封裝一些功能。
"scripts": {"start": "babel-node src/pages/index.js",
"build": "webpack --config config/webpack.config.js",
"watch": "webpack-dev-server --config config/webpack.config.js --hot --inline --progress"
}config
添加一些設置,可以供scripts讀取用,同時這里的值也會被添加到系統(tǒng)的環(huán)境變量中。
"config": {
"port": "8080"
}
npm start的時候會讀取到npm_package_config_port環(huán)境變量。dependencies
指定依賴的其它包,這些依賴是指包發(fā)布后正常執(zhí)行時所需要的,也就是線上需要的包。使用下面的命令來安裝:
npm install --save packageName
如果是開發(fā)中依賴的包,可以在devDependencies設置。devDependencies
這些依賴只有在開發(fā)時候才需要。使用下面的命令來安裝:
npm install --save-dev packageNamepeerDependencies
相關的依賴,如果你的包是插件,而用戶在使用你的包時候,通常也會需要這些依賴(插件),那么可以將依賴列到這里。bundledDependencies
綁定的依賴包,發(fā)布的時候這些綁定包也會被一同發(fā)布。optionalDependencies(較少用)
即使這些依賴沒有,也可以正常安裝使用。engines(較少用)
指定包運行的環(huán)境。
"engines": {
"node": ">=0.10.3 < 0.12",
"npm": "~1.0.20"
}os(較少用)
指定你的包可以在哪些系統(tǒng)平臺下運行。
"os": [ "darwin", "linux", "!win32" ]
cpu(較少用)
可以指定包運行的cpu架構。private
設為true這個包將不會發(fā)布到NPM平臺下。publishConfig(較少用)
這個字段用于設置發(fā)布時候的一些設定。尤其方便你希望發(fā)布前設定指定的tag或registry。
當你有了一個完整的 package.json 文件的時候,就可以讓人一眼看出來,這個模塊的基本信息,和這個模塊所需要依賴的包。我們可以通過 npm install就可以很方便的下載好這個模塊所需要的包。
npm install 默認會安裝 dependencies 字段和 devDependencies 字段中的所有模塊,如果使用 --production 參數(shù),可以只安裝 dependencies 字段的模塊:
$npm install
和
$npm install --production
一旦安裝了某個模塊,就可以在代碼中用 require 命令加載這個模塊,例如:
let backbone = require('backbone')
package.json 的版本控制
例如:
"cluster": ">= 0.7.7",
"commander": "^2.6.0",
"async" : "*",
第一種:
貌似通過字面意思你應該懂得, cluster 版本必須大于等于 0.7.7
npm 安裝的時候你也可以這樣指定:
npm install cluster@">=0.7.7"
甚至你可以把版本范圍指定到更小
npm install cluster@">=0.7.7<0.8.0"
讓安裝的版本大于0.7.7并且小于 0.8.0
第二種:
^ 符號表示,可以接受小版本和補丁版本的變化.簡單說就是大版本不變即可,其他版本隨便更新.
"commander":"^2.6.0"
當我們npm install 的時候,安裝到 node_modules 目錄下的
commander開源包可能是 2.6.0 或 2.7.3 或 2.8.9
第三種:
"async": " * "
最糟糕的一種版本控制,一點限制沒有.
第四種:
當主版本號/次版本號/修訂版本號為X or x or *時,
那么update或install是會下載該分支最新的版本號
第五種:
波浪號(~)是限定模塊的次要版本
~1.5.1允許安裝版本號大于1.5.1但小于1.6.0版本的模塊
scripts 腳本
npm 不僅可以用于模塊管理,還可以用于執(zhí)行腳本。package.json 文件有一個 scripts 字段,可以用于指定腳本命令,供 npm 直接調用。
顧名思義,scripts就是一些腳本代碼,可以通過
npm run script-key 來調用,例如在這個 package.json 的文件夾下使用npm run dev就相當于運行了node build/dev-server.js這一段代碼。使用 scripts 的目的就是為了把一些要執(zhí)行的代碼合并到一起,使用 npm run 來快速的運行,方便省事。
npm run 是 npm run-script 的縮寫,一般都使用前者,但是后者可以更好的反應這個命令的本質。
更換源
- 全局安裝nrm
$ npm install -g nrm
- 列出可選的源:
帶*號的表示當前在使用的源
$nrm ls
* npm ---- https://registry.npmjs.org/
cnpm --- http://r.cnpmjs.org/
taobao - https://registry.npm.taobao.org/
nj ----- https://registry.nodejitsu.com/
npmMirror https://skimdb.npmjs.com/registry/
edunpm - http://registry.enpmjs.org/
- 切換成淘寶源:
$ nrm use taobao
Registry has been set to: https://registry.npm.taobao.org/
- 測試所有源的響應時間:
$nrm test
npm ---- 314ms
cnpm --- 350ms
* taobao - 300ms
nj ----- Fetch Error
npmMirror 1153ms
edunpm - Fetch Error