久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 張小龍net館藏 2018-03-29

npm 是 Node 的模塊管理器,,功能極其強(qiáng)大,。它是 Node 獲得成功的重要原因之一,。

正因?yàn)橛辛薾pm,,我們只要一行命令,就能安裝別人寫好的模塊 ,。


$ npm install 

本文介紹 npm 模塊安裝機(jī)制的細(xì)節(jié),,以及如何解決安裝速度慢的問題。

一,、從 npm install 說起

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


$ npm install <packageName>

安裝之前,npm install會先檢查,,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>

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

三,、registry

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

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

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

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


$ npm view react

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

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

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


dist: {
  shasum: '2a57c2cf8747b483759ad8de0fa47fb0c5cf5c6a',
  tarball: 'http://registry./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
$HOME/.npm

你最好瀏覽一下這個(gè)目錄,。


$ ls ~/.npm 
# 或者
$ npm cache ls

你會看到里面存放著大量的模塊,,儲存結(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,。

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

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


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

對于一些不是很關(guān)鍵的操作(比如npm searchnpm view),,npm會先查看.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í)候,,只會檢查node_modules目錄,,而不會檢查~/.npm目錄。也就是說,,如果一個(gè)模塊在~/.npm下有壓縮包,,但是沒有安裝在node_modules目錄中,npm 依然會從遠(yuǎn)程倉庫下載一次新的壓縮包,。

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

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

六,、--cache-min 參數(shù)

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

--cache-min參數(shù)指定一個(gè)時(shí)間(單位為分鐘),只有超過這個(gè)時(shí)間的模塊,才會從 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 會連接 registry,,下載最新版本。這沒有問題,,但是如果指定模塊在緩存目錄之中,,npm 也會連接 registry,發(fā)出指定模塊的 etag ,,服務(wù)器返回狀態(tài)碼304,,表示不需要重新下載壓縮包,。

(2)如果某個(gè)模塊已經(jīng)在緩存之中,,但是版本低于要求,npm會直接報(bào)錯,,而不是去 registry 下載最新版本,。

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

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

七,、離線安裝的解決方案

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

解決方案大致分成三類,。

第一類,,Registry 代理。

上面三個(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)離線使用。

第二類,,npm install替代,。

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


$ npm-cache install

第三類,,node_modules作為緩存目錄。

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

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

(完)

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多