RN精進(jìn)筆記(十三)npm命令和機(jī)制

[toc]

NPM 模塊安裝機(jī)制簡介

npm是Node的模塊管理器粒竖,功能很強(qiáng)大。它是Node獲得成功的原因之一籍琳。正因?yàn)橛辛薾pm先舷,我們只要一行命令 npm install,就能安裝別人寫好的模塊前方。

參考文檔
  1. http://www.ruanyifeng.com/blog/2016/01/npm-install.html
從nam install說起

npm install 命令用來安裝模塊到node_modules目錄狈醉。

$ npm install <packageName>

安裝之前,npm install會(huì)先檢查惠险,node_modules目錄之中是否已經(jīng)存在指定模塊苗傅。如果存在,就不再重新安裝了班巩,即使遠(yuǎn)程倉庫已經(jīng)有了一個(gè)新版本渣慕,也是如此。

如果你希望,一個(gè)模塊不管是否安裝過逊桦,npm 都要強(qiáng)制重新安裝眨猎,可以使用-f--force參數(shù)。

$ npm install <packageName> --force
npm update

如果想更新已安裝模塊强经,就要用到npm update命令睡陪。

$ npm update <packageName>

它會(huì)先到遠(yuǎn)程倉庫查詢最新版本,然后查詢本地版本匿情。如果本地版本不存在兰迫,或者遠(yuǎn)程版本較新,就會(huì)安裝码秉。

registry

npm update命令怎么知道每個(gè)模塊的最新版本呢逮矛?

答案是 npm 模塊倉庫提供了一個(gè)查詢服務(wù),叫做 registry 转砖。以 npmjs.org 為例须鼎,它的查詢服務(wù)網(wǎng)址是 https://registry.npmjs.org/

這個(gè)網(wǎng)址后面跟上模塊名府蔗,就會(huì)得到一個(gè) JSON 對象晋控,里面是該模塊所有版本的信息。比如姓赤,訪問 https://registry.npmjs.org/react赡译,就會(huì)看到 react 模塊所有版本的信息。

它跟下面命令的效果是一樣的不铆。

$ npm view react

# npm view 的別名
$ npm info react
$ npm show react
$ npm v react

registry 網(wǎng)址的模塊名后面蝌焚,還可以跟上版本號(hào)或者標(biāo)簽,用來查詢某個(gè)具體版本的信息誓斥。比如只洒, 訪問 https://registry.npmjs.org/react/v0.14.6 ,就可以看到 React 的 0.14.6 版劳坑。

返回的 JSON 對象里面毕谴,有一個(gè)dist.tarball屬性,是該版本壓縮包的網(wǎng)址距芬。

dist: {
  shasum: '2a57c2cf8747b483759ad8de0fa47fb0c5cf5c6a',
  tarball: 'http://registry.npmjs.org/react/-/react-0.14.6.tgz' 
},

到這個(gè)網(wǎng)址下載壓縮包涝开,在本地解壓,就得到了模塊的源碼框仔。npm installnpm update命令舀武,都是通過這種方式安裝模塊的。

緩存目錄

npm installnpm update命令离斩,從 registry 下載壓縮包之后银舱,都存放在本地的緩存目錄衷旅。

這個(gè)緩存目錄,在 Linux 或 Mac 默認(rèn)是用戶主目錄下的.npm目錄纵朋,在 Windows 默認(rèn)是%AppData%/npm-cache。通過配置命令茄袖,可以查看這個(gè)目錄的具體位置操软。

$ npm config get cache
$ /Users/gaolong/.npm
$ ls ~/.npm 
# 或者
$ npm cache ls

你會(huì)看到里面存放著大量的模塊,儲(chǔ)存結(jié)構(gòu)是{cache}/{name}/{version}宪祥。

$ npm cache ls react
~/.npm/react/react/0.14.6/
~/.npm/react/react/0.14.6/package.tgz
~/.npm/react/react/0.14.6/package/
~/.npm/react/react/0.14.6/package/package.json

每個(gè)模塊的每個(gè)版本聂薪,都有一個(gè)自己的子目錄,里面是代碼的壓縮包package.tgz文件蝗羊,以及一個(gè)描述文件package/package.json藏澳。

除此之外,還會(huì)生成一個(gè){cache}/{hostname}/{path}/.cache.json文件耀找。比如翔悠,從 npm 官方倉庫下載 react 模塊的時(shí)候,就會(huì)生成registry.npmjs.org/react/.cache.json文件野芒。

這個(gè)文件保存的是蓄愁,所有版本的信息,以及該模塊最近修改的時(shí)間和最新一次請求時(shí)服務(wù)器返回的 ETag 狞悲。

{
  "time":{
    "modified":"2016-01-06T23:52:45.571Z",
    // ...
  },
  "_etag":"\"7S37I0775YLURCFIO8N85FO0F\""
}

對于一些不是很關(guān)鍵的操作(比如npm searchnpm view)撮抓,npm會(huì)先查看.cache.json里面的模塊最近更新時(shí)間,跟當(dāng)前時(shí)間的差距摇锋,是不是在可接受的范圍之內(nèi)丹拯。如果是的,就不再向遠(yuǎn)程倉庫發(fā)出請求荸恕,而是直接返回.cache.json的數(shù)據(jù)乖酬。

.npm目錄保存著大量文件,清空它的命令如下戚炫。

$ rm -rf ~/.npm/*
# 或者
$ npm cache clean
模塊的安裝過程

總結(jié)一下剑刑,Node模塊的安裝過程是這樣的。

1. 發(fā)出npm install命令
2. npm 向 registry 查詢模塊壓縮包的網(wǎng)址
3. 下載壓縮包双肤,存放在~/.npm目錄
4. 解壓壓縮包到當(dāng)前項(xiàng)目的node_modules目錄

注意施掏,一個(gè)模塊安裝以后,本地其實(shí)保存了兩份茅糜。一份是~/.npm目錄下的壓縮包七芭,另一份是node_modules目錄下解壓后的代碼。

但是蔑赘,運(yùn)行npm install的時(shí)候狸驳,只會(huì)檢查node_modules目錄预明,而不會(huì)檢查~/.npm目錄。也就是說耙箍,如果一個(gè)模塊在~/.npm下有壓縮包撰糠,但是沒有安裝在node_modules目錄中,npm 依然會(huì)從遠(yuǎn)程倉庫下載一次新的壓縮包辩昆。

這種行為固然可以保證總是取得最新的代碼阅酪,但有時(shí)并不是我們想要的。最大的問題是汁针,它會(huì)極大地影響安裝速度术辐。即使某個(gè)模塊的壓縮包就在緩存目錄中,也要去遠(yuǎn)程倉庫下載施无,這怎么可能不慢呢辉词?

另外,有些場合沒有網(wǎng)絡(luò)(比如飛機(jī)上)猾骡,但是你想安裝的模塊瑞躺,明明就在緩存目錄之中,這時(shí)也無法安裝兴想。

—cache-min參數(shù)

為了解決這些問題隘蝎,npm 提供了一個(gè)--cache-min參數(shù),用于從緩存目錄安裝模塊襟企。

--cache-min參數(shù)指定一個(gè)時(shí)間(單位為分鐘)嘱么,只有超過這個(gè)時(shí)間的模塊,才會(huì)從 registry 下載顽悼。

$ npm install --cache-min 9999999 <package-name>

上面命令指定曼振,只有超過999999分鐘的模塊,才從 registry 下載蔚龙。實(shí)際上就是指定冰评,所有模塊都從緩存安裝,這樣就大大加快了下載速度木羹。

它還有另一種寫法:

$ npm install --cache-min Infinity <package-name>

但是甲雅,這并不等于離線模式,這時(shí)仍然需要網(wǎng)絡(luò)連接坑填。因?yàn)楝F(xiàn)在的--cache-min實(shí)現(xiàn)有一些問題:

(1)如果指定模塊不在緩存目錄抛人,那么 npm 會(huì)連接 registry,下載最新版本脐瑰。這沒有問題妖枚,但是如果指定模塊在緩存目錄之中,npm 也會(huì)連接 registry苍在,發(fā)出指定模塊的 etag 绝页,服務(wù)器返回狀態(tài)碼304荠商,表示不需要重新下載壓縮包。
(2)如果某個(gè)模塊已經(jīng)在緩存之中续誉,但是版本低于要求莱没,npm會(huì)直接報(bào)錯(cuò),而不是去 registry 下載最新版本酷鸦。

npm 團(tuán)隊(duì)知道存在這些問題郊愧,正在重寫 cache。并且井佑,將來會(huì)提供一個(gè)--offline參數(shù),使得 npm 可以在離線情況下使用眠寿。

不過躬翁,這些改進(jìn)沒有日程表。所以盯拱,當(dāng)前使用--cache-min改進(jìn)安裝速度盒发,是有問題的。

離線安裝的解決方案

社區(qū)已經(jīng)為npm的離線使用狡逢,提出了幾種解決方案宁舰。它們可以大大加快模塊安裝的速度。

解決方案大致分成三類奢浑。

第一類蛮艰,Registry 代理:

npm-proxy-cache
local-npm(用法)
npm-lazy

上面三個(gè)模塊的用法很類似,都是在本機(jī)起一個(gè) Registry 服務(wù)雀彼,所有npm install命令都要通過這個(gè)服務(wù)代理壤蚜。

# npm-proxy-cache
$ npm --proxy http://localhost:8080 \
  --https-proxy http://localhost:8080 \
  --strict-ssl false \
  install

# local-npm
$ npm set registry http://127.0.0.1:5080

# npm-lazy
$ npm --registry http://localhost:8080/ install socket.io

有了本機(jī)的Registry服務(wù),就能完全實(shí)現(xiàn)緩存安裝徊哑,可以實(shí)現(xiàn)離線使用袜刷。

第二類,nom-cache install替代莺丑。

如果能夠改變npm install的行為著蟹,就能實(shí)現(xiàn)緩存安裝。npm-cache 工具就是這個(gè)思路梢莽。凡是使用npm install的地方萧豆,都可以使用npm-cache替代。

$ npm-cache install

第三類昏名,node_modules作為緩存目錄炕横。

這個(gè)方案的思路是,不使用.npm緩存葡粒,而是使用項(xiàng)目的node_modules目錄作為緩存份殿。

Freight
npmbox

上面兩個(gè)工具膜钓,都能將項(xiàng)目的node_modules目錄打成一個(gè)壓縮包,以后安裝的時(shí)候卿嘲,就從這個(gè)壓縮包之中取出文件颂斜。

npm -g 全局安裝包

npm -g 代表全局安裝

# 全局安裝webpack
$ npm -g webpack 

#查看全局安裝的包
$ npm list -g > Desktop/npm_g_list.txt

$ 全局包安裝的目錄路徑
$ /Users/gl/.nvm/versions/node/v8.11.1/lib

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拾枣,隨后出現(xiàn)的幾起案子沃疮,更是在濱河造成了極大的恐慌,老刑警劉巖梅肤,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件司蔬,死亡現(xiàn)場離奇詭異,居然都是意外死亡姨蝴,警方通過查閱死者的電腦和手機(jī)俊啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來左医,“玉大人授帕,你說我怎么就攤上這事「∩遥” “怎么了跛十?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秕硝。 經(jīng)常有香客問我芥映,道長,這世上最難降的妖魔是什么远豺? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任屏轰,我火速辦了婚禮,結(jié)果婚禮上憋飞,老公的妹妹穿的比我還像新娘霎苗。我一直安慰自己,他們只是感情好榛做,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布唁盏。 她就那樣靜靜地躺著,像睡著了一般检眯。 火紅的嫁衣襯著肌膚如雪厘擂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天锰瘸,我揣著相機(jī)與錄音刽严,去河邊找鬼。 笑死避凝,一個(gè)胖子當(dāng)著我的面吹牛舞萄,可吹牛的內(nèi)容都是我干的眨补。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼倒脓,長吁一口氣:“原來是場噩夢啊……” “哼撑螺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崎弃,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤甘晤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后饲做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體线婚,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年盆均,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞弊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缀踪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虹脯,到底是詐尸還是另有隱情驴娃,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布循集,位于F島的核電站唇敞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咒彤。R本人自食惡果不足惜疆柔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镶柱。 院中可真熱鬧旷档,春花似錦、人聲如沸歇拆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽故觅。三九已至厂庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間输吏,已是汗流浹背权旷。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贯溅,地道東北人拄氯。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓躲查,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坤邪。 傳聞我的和親對象是個(gè)殘疾皇子熙含,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • 作者: 阮一峰原文地址:http://www.ruanyifeng.com/blog/2016/01/npm-in...
    IT程序獅閱讀 840評論 0 6
  • 前言 js是從網(wǎng)頁小腳本演變過來的,至今艇纺,前端的js庫怎静,也不像一個(gè)真正的模塊。前端js經(jīng)歷了工具類庫黔衡、組件庫蚓聘、前端...
    白昔月閱讀 3,271評論 2 11
  • npm是什么 NPM的全稱是Node Package Manager,是隨同NodeJS一起安裝的包管理和分發(fā)工具...
    build1024閱讀 7,860評論 0 9
  • 描述 npm從以下來源獲取配置值盟劫,按優(yōu)先級(jí)排序: 命令行標(biāo)記 在命令行上放置--foo bar設(shè)置foo配置參數(shù)為...
    竹天亮閱讀 44,065評論 0 8
  • 有一個(gè)朋友夜牡,特漂亮的那種,有次問她侣签,長得好看有什么優(yōu)勢塘装?姑娘說,從小到大我喜歡的人都喜歡我影所。 瞬間讓我們各種羨慕嫉...
    我是蛋蛋閱讀 453評論 0 3