npm 超詳細(xì)教程

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 --savenpm 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ō)缚态,全局安裝只適用于工具模塊,比如eslintgulp堤瘤∶德“本地安裝”指的是將一個(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ā)布包

參考鏈接:npm模塊管理器(阮一峰)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末做葵,一起剝皮案震驚了整個(gè)濱河市占哟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酿矢,老刑警劉巖榨乎,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘫筐,居然都是意外死亡蜜暑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門策肝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)史煎,“玉大人,你說(shuō)我怎么就攤上這事驳糯∑螅” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酝枢,是天一觀的道長(zhǎng)恬偷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帘睦,這世上最難降的妖魔是什么袍患? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮竣付,結(jié)果婚禮上诡延,老公的妹妹穿的比我還像新娘。我一直安慰自己古胆,他們只是感情好肆良,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逸绎,像睡著了一般惹恃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棺牧,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天巫糙,我揣著相機(jī)與錄音,去河邊找鬼颊乘。 笑死参淹,一個(gè)胖子當(dāng)著我的面吹牛醉锄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浙值,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恳不,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了亥鸠?” 一聲冷哼從身側(cè)響起妆够,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎负蚊,沒(méi)想到半個(gè)月后神妹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡家妆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鸵荠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伤极。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛹找,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哨坪,到底是詐尸還是另有隱情庸疾,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布当编,位于F島的核電站届慈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏忿偷。R本人自食惡果不足惜金顿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲤桥。 院中可真熱鬧揍拆,春花似錦、人聲如沸茶凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慧妄。三九已至顷牌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塞淹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工罪裹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饱普,地道東北人运挫。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像套耕,于是被迫代替她去往敵國(guó)和親谁帕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裆甩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容