npm 超詳細(xì)教程
簡(jiǎn)介
npm酬土,全名 node package manger荆忍。
- npm 是
Node
的開放式模塊登記和管理系統(tǒng),是Node.js
包的標(biāo)準(zhǔn)發(fā)布平臺(tái),用于Node.js
包的發(fā)布刹枉、傳播叽唱、依賴控制,網(wǎng)址:https://www.npmjs.com/ - npm 提供了命令行工具微宝,可以方便地下載棺亭、安裝、升級(jí)蟋软、刪除包镶摘,也可以讓你作為開發(fā)者發(fā)布并維護(hù)包
npm 如何使用
- npm 在按照 Node.js 時(shí)會(huì)連帶被安裝。但有可能不是最新版本岳守,需要
npm install npm@latest -g
升級(jí)到最新版本凄敢。
基本命令:
# 查看 npm 命令列表
$ npm help
# 查看各個(gè)命令的簡(jiǎn)單用法
$ npm -l
# 查看 npm 的版本
$ npm -v
# 查看 npm 的配置
$ npm config list -l
npm 的使用
npm init 初始化 package.json 文件
用來(lái)初始化生成package.json
文件。在這個(gè)過(guò)程中會(huì)向用戶提問(wèn)一系列問(wèn)題棺耍,如果你覺(jué)得不用修改默認(rèn)配置贡未,一路回車就可以了种樱。
如果使用了-f
(代表force
)蒙袍、-y
(代表yes
),則跳過(guò)提問(wèn)階段嫩挤,直接生成一個(gè)新的package.json
文件害幅。
npm set 設(shè)置環(huán)境變量
$ 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 init
設(shè)置了默認(rèn)值,以后執(zhí)行npm init
的時(shí)候岂昭,package.json
的作者姓名以现、郵件、主頁(yè)约啊、許可證字段就會(huì)自動(dòng)寫入預(yù)設(shè)的值邑遏。這些信息會(huì)存放在用戶主目錄的~/.npmrc
文件,使得用戶不用每個(gè)項(xiàng)目都輸入恰矩。如果某個(gè)項(xiàng)目有不同的設(shè)置记盒,可以針對(duì)該項(xiàng)目運(yùn)行npm config
。
$ npm set save-exact true
上面命令設(shè)置加入模塊時(shí)外傅,package.json
將記錄模塊的確切版本纪吮,而不是一個(gè)可選的版本范圍。
npm config
$ npm config set prefix $dir
上面的命令將指定的$dir
目錄萎胰,設(shè)為模塊的全局安裝目錄碾盟。如果當(dāng)前有這個(gè)目錄的寫權(quán)限,那么運(yùn)行npm install
的時(shí)候技竟,就不再需要sudo
命令授權(quán)了冰肴。
$ npm config set save-prefix ~
上面的命令使得npm install --save
和npm install --save-dev
安裝新模塊時(shí),允許的版本范圍從克拉符號(hào)(^)改成波浪號(hào)(~),即從允許小版本升級(jí)熙尉,變成只允許補(bǔ)丁包的升級(jí)估盘。
$ npm config set init.author.name $name
$ npm config set init.author.email $email
上面命令指定使用npm init
時(shí),生成的package.json
文件的字段默認(rèn)值骡尽。
npm info
npm info
命令可以查看每個(gè)模塊的具體信息
$ npm info underscore
$ npm info underscore description
$ npm info underscore homepage
$ npm info underscore version
npm search
npm search
命令用于搜索npm倉(cāng)庫(kù)遣妥,它后面可以跟字符串,也可以跟正則表達(dá)式
$ npm search <搜索詞>
npm list
npm list
命令以樹型結(jié)構(gòu)列出當(dāng)前項(xiàng)目安裝的所有模塊攀细,以及它們依賴的模塊箫踩。
npm list
npm list -global
npm list vue
加上global參數(shù),會(huì)列出全局安裝的模塊谭贪。
npm install
Node
模塊采用npm install
命令安裝境钟。
每個(gè)模塊可以“全局安裝”,也可以“本地安裝”俭识】鳎“全局安裝”指的是將一個(gè)模塊安裝到系統(tǒng)目錄中,各個(gè)項(xiàng)目都可以調(diào)用套媚。一般來(lái)說(shuō)缚态,全局安裝只適用于工具模塊,比如eslint
和gulp
堤瘤∶德“本地安裝”指的是將一個(gè)模塊下載到當(dāng)前項(xiàng)目的node_modules
子目錄,然后只有在項(xiàng)目目錄之中本辐,才能調(diào)用這個(gè)模塊
# 本地安裝
$ npm install <package name>
# 全局安裝
$ sudo npm install -global <package name>
$ sudo npm install -g <package name>
# 也支持直接輸入Github代碼庫(kù)地址
$ npm install git://github.com/package/path.git
$ npm install git://github.com/package/path.git#0.1.0
# 強(qiáng)制重新安裝
$ npm install <packageName> --force
# 如果你希望桥帆,所有模塊都要強(qiáng)制重新安裝,那就刪除node_modules目錄慎皱,重新執(zhí)行npm install
$ rm -rf node_modules
$ npm install
安裝不同版本
install 命令總是安裝模塊的最新版本老虫,如果要安裝模塊的特定版本,可以在模塊名后面加上@和版本號(hào)茫多。
$ npm install sax@latest
$ npm install sax@0.1.1
$ npm install sax@">=0.1.0 <0.2.0"
# 如果使用--save-exact參數(shù)祈匙,會(huì)在package.json文件指定安裝模塊的確切版本
$ npm install readable-stream --save --save-exact
$ npm install sax --save
$ npm install node-tap --save-dev
# 或者
$ npm install sax -S
$ npm install node-tap -D
# 如果要安裝beta版本的模塊,需要使用下面的命令
# 安裝最新的beta版
$ npm install <module-name>@beta (latest beta)
# 安裝指定的beta版
$ npm install <module-name>@1.3.1-beta.3
# npm install默認(rèn)會(huì)安裝dependencies字段和devDependencies字段中的所有模塊地梨,如果使用--production參數(shù)菊卷,可以只安裝dependencies字段的模塊
$ npm install --production
# 或者
$ NODE_ENV=production npm install
避免系統(tǒng)權(quán)限
默認(rèn)情況下,Npm
全局模塊都安裝在系統(tǒng)目錄(比如/usr/local/lib/
)宝剖,普通用戶沒(méi)有寫入權(quán)限洁闰,需要用到sudo
命令。這不是很方便万细,我們可以在沒(méi)有root
權(quán)限的情況下扑眉,安裝全局模塊纸泄。
首先,在主目錄下新建配置文件.npmrc
腰素,然后在該文件中將prefix
變量定義到主目錄下面聘裁。
prefix = /home/yourUsername/npm
然后在主目錄下新建npm
子目錄
$ mkdir ~/npm
此后,全局安裝的模塊都會(huì)安裝在這個(gè)子目錄中弓千,npm
也會(huì)到~/npm/bin
目錄去尋找命令衡便。
最后,將這個(gè)路徑在.bash_profile
文件(或.bashrc
文件)中加入PATH
變量洋访。
export PATH=~/npm/bin:$PATH
npm update
npm update命令可以更新本地安裝的模塊
# 升級(jí)當(dāng)前項(xiàng)目的指定模塊
$ npm update [package name]
# 升級(jí)全局安裝的模塊
$ npm update -global [package name]
它會(huì)先到遠(yuǎn)程倉(cāng)庫(kù)查詢最新版本镣陕,然后查詢本地版本。如果本地版本不存在姻政,或者遠(yuǎn)程版本較新呆抑,就會(huì)安裝。
使用-S
或--save
參數(shù)汁展,可以在安裝的時(shí)候更新package.json
里面模塊的版本號(hào)鹊碍。
注意,從npm v2.6.1
開始食绿,npm update只更新頂層模塊侈咕,而不更新依賴的依賴,以前版本是遞歸更新的炫欺。如果想取到老版本的效果乎完,要使用下面的命令熏兄。
$ npm --depth 9999 update
npm uninstall
npm uninstall命令品洛,卸載已安裝的模塊
$ npm uninstall [package name]
# 卸載全局模塊
$ npm uninstall [package name] -global
npm run
npm 不僅可以用于模塊管理,還可以用于執(zhí)行腳本摩桶。package.json 文件有一個(gè) scripts 字段桥状,可以用于指定腳本命令,供npm直接調(diào)用硝清。
npm run 命令會(huì)自動(dòng)在環(huán)境變量 $PATH 添加 node_modules/.bin 目錄辅斟,所以 scripts 字段里面調(diào)用命令時(shí)不用加上路徑,這就避免了全局安裝 NPM 模塊芦拿。
npm run 如果不加任何參數(shù)士飒,直接運(yùn)行,會(huì)列出 package.json 里面所有可以執(zhí)行的腳本命令蔗崎。
npm內(nèi)置了兩個(gè)命令簡(jiǎn)寫酵幕,npm test 等同于執(zhí)行 npm run test,npm start 等同于執(zhí)行 npm run start缓苛。
$ npm i eslint --save-dev
pre- 和 post- 腳本
npm run 為每條命令提供了 pre- 和 post- 兩個(gè)鉤子(hook)芳撒。以 npm run lint 為例,執(zhí)行這條命令之前,npm會(huì)先查看有沒(méi)有定義 prelint 和 postlint 兩個(gè)鉤子笔刹,如果有的話芥备,就會(huì)先執(zhí)行 npm run prelint,然后執(zhí)行 npm run lint舌菜,最后執(zhí)行npm run postlint萌壳。
全局模塊(在命令行的任何地方可以使用) 局部模塊
- 為什么全局模塊可以直接在任何地方使用
全局的模塊
- 必須使用package.json 中配置bin參數(shù)
-
! /usr/bin/env node
npm link
就是將當(dāng)前的目錄臨時(shí)的放到全局下。
開發(fā) NPM 模塊的時(shí)候日月,有時(shí)我們會(huì)希望讶凉,邊開發(fā)邊試用,比如本地調(diào)試的時(shí)候山孔,require('myModule') 會(huì)自動(dòng)加載本機(jī)開發(fā)中的模塊懂讯。Node規(guī)定,使用一個(gè)模塊時(shí)台颠,需要將其安裝到全局的或項(xiàng)目的 node_modules 目錄之中褐望。對(duì)于開發(fā)中的模塊,解決方法就是在全局的 node_modules 目錄之中串前,生成一個(gè)符號(hào)鏈接瘫里,指向模塊的本地目錄。
npm link 就能起到這個(gè)作用荡碾,會(huì)自動(dòng)建立這個(gè)符號(hào)鏈接谨读。
請(qǐng)?jiān)O(shè)想這樣一個(gè)場(chǎng)景,你開發(fā)了一個(gè)模塊 myModule坛吁,目錄為 src/myModule劳殖,你自己的項(xiàng)目 myProject 要用到這個(gè)模塊,項(xiàng)目目錄為 src/myProject拨脉。首先哆姻,在模塊目錄(src/myModule)下運(yùn)行 npm link 命令。
src/myModule$ npm link
上面的命令會(huì)在NPM的全局模塊目錄內(nèi)玫膀,生成一個(gè)符號(hào)鏈接文件矛缨,該文件的名字就是 package.json 文件中指定的模塊名。
/path/to/global/node_modules/myModule -> src/myModule
這個(gè)時(shí)候帖旨,已經(jīng)可以全局調(diào)用 myModule 模塊了箕昭。但是,如果我們要讓這個(gè)模塊安裝在項(xiàng)目?jī)?nèi)解阅,還要進(jìn)行下面的步驟落竹。
切換到項(xiàng)目目錄,再次運(yùn)行 npm link 命令瓮钥,并指定模塊名筋量。
src/myProject$ npm link myModule
上面命令等同于生成了本地模塊的符號(hào)鏈接烹吵。
src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule
然后,就可以在你的項(xiàng)目中桨武,加載該模塊了肋拔。
var myModule = require('myModule');
這樣一來(lái),myModule 的任何變化呀酸,都可以直接反映在 myProject 項(xiàng)目之中凉蜂。但是,這樣也出現(xiàn)了風(fēng)險(xiǎn)性誉,任何在myProject目錄中對(duì)myModule的修改窿吩,都會(huì)反映到模塊的源碼中。
如果你的項(xiàng)目不再需要該模塊错览,可以在項(xiàng)目目錄內(nèi)使用 npm unlink 命令纫雁,刪除符號(hào)鏈接。
src/myProject$ npm unlink myModule
npm bin
# 項(xiàng)目根目錄下執(zhí)行
$ npm bin
./node_modules/.bin
npm adduser
$ npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: YOUR_EMAIL@domain.com
npm publish
npm publish用于將當(dāng)前模塊發(fā)布到npmjs.com倾哺。執(zhí)行之前轧邪,需要向npmjs.com申請(qǐng)用戶名。
# 需要向npmjs.com申請(qǐng)用戶名
$ npm adduser
# 登錄
$ npm login
# 發(fā)布
$ npm publish
# 如果當(dāng)前模塊是一個(gè)beta版羞海,比如1.3.1-beta.3忌愚,那么發(fā)布的時(shí)候需要使用tag參數(shù),將其發(fā)布到指定標(biāo)簽却邓,默認(rèn)的發(fā)布標(biāo)簽是latest
$ npm publish --tag beta
# 如果發(fā)布私有模塊硕糊,模塊初始化的時(shí)候,需要加上scope參數(shù)腊徙。只有npm的付費(fèi)用戶才能發(fā)布私有模塊简十。
$ npm init --scope=<yourscope>
# 如果你的模塊是用ES6寫的,那么發(fā)布的時(shí)候昧穿,最好轉(zhuǎn)成ES5勺远。首先,需要安裝Babel时鸵。
$ npm install --save-dev babel-cli@6 babel-preset-es2015@6
然后,在package.json里面寫入build腳本厅瞎。
"scripts": {
"build": "babel source --presets babel-preset-es2015 --out-dir distribution",
"prepublish": "npm run build"
}
運(yùn)行上面的腳本饰潜,會(huì)將 source 目錄里面的ES6源碼文件,轉(zhuǎn)為 distribution 目錄里面的 ES5 源碼文件和簸。然后彭雾,在項(xiàng)目根目錄下面創(chuàng)建兩個(gè)文件 .npmignore 和 .gitignore,分別寫入以下內(nèi)容锁保。
// .npmignore
source
// .gitignore
node_modules
distribution
npm deprecate
如果想廢棄某個(gè)版本的模塊薯酝,可以使用 npm deprecate 命令半沽。
$ npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"
github / npm
npm版本號(hào)管理的問(wèn)題
- semver規(guī)范 規(guī)定了版本號(hào) 由3位組成 MAJOR MINOR PATCH
- MAJOR 可能不在兼容老版本
- MINOR 新增了一些兼容舊版本的api vue.observable
- PATCH 修復(fù)bug
都是git的tag 對(duì)應(yīng)著npm的版本
npm version major minor patch
會(huì)自動(dòng)和git進(jìn)行關(guān)聯(lián)
版本號(hào)含義
- 2.2.0 必須是2.2.0
- ^2.2.0 限定大版本,后面更新只要不超過(guò)2盡可以
- ~2.2.0 限定前兩個(gè)版本吴菠,后面的版本只要比0大就可以
=2.0 大于這個(gè)版本
- <=2.0
- 1.0.0 - 2.0.0
預(yù)發(fā)版本
- alpha 預(yù)覽版 內(nèi)部測(cè)試版
- beta 測(cè)試版 公開測(cè)試版
- rc 最終測(cè)試版本
scripts
- 可以配置腳本的命令 快捷鍵(可以把很長(zhǎng)的命令放到scripts中)
- 執(zhí)行命令 會(huì)將當(dāng)前的node_modules目錄下的.bin文件夾放到全局中(所以可以直接使用)
- npm run start 可以簡(jiǎn)寫成 npm start
npx
- npx和script一致可以幫我們直接運(yùn)行 .bin目錄下的內(nèi)容
- 如果.bin目錄下存在 會(huì)執(zhí)行對(duì)應(yīng)腳本者填,如果不存在會(huì)下載運(yùn)行
npx 只是一個(gè)臨時(shí)的使用方案。 npm5.2 之后產(chǎn)生的
源的切換 (npm nrm nvm)
- npm install nrm -g
- nrm ls / nrm use
包的發(fā)布
- 如何發(fā)布一個(gè)包 先注冊(cè)npm賬號(hào)
- 一定要在官方源上發(fā)
- npm addUser 添加用戶
- npm publish 發(fā)布包