亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

Javascript:npm模塊安裝機制簡介

來源:阮一峰 發(fā)布時間:2018-07-02 15:18:33 閱讀量:1510

npm 是 Node 的模塊管理器,功能極其強大。它是 Node 獲得成功的重要原因之一。 
這里寫圖片描述 
正因為有了npm,我們只要一行命令,就能安裝別人寫好的模塊 。

$ npm install1

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

一、從 npm install 說起 
npm install 命令用來安裝模塊到node_modules目錄。

$ npm install <packageName>1

安裝之前,npm install會先檢查,node_modules目錄之中是否已經(jīng)存在指定模塊。如果存在,就不再重新安裝了,即使遠程倉庫已經(jīng)有了一個新版本,也是如此。

如果你希望,一個模塊不管是否安裝過,npm 都要強制重新安裝,可以使用-f或–force參數(shù)。

$ npm install <packageName> --force1

二、npm update 
如果想更新已安裝模塊,就要用到npm update命令。

$ npm update <packageName>1

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

三、registry 
npm update命令怎么知道每個模塊的最新版本呢?

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

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

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

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

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

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

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

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

四、緩存目錄 
npm installnpm update命令,從 registry 下載壓縮包之后,都存放在本地的緩存目錄。

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

$ npm config get cache$HOME/.npm12

你最好瀏覽一下這個目錄。

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

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

每個模塊的每個版本,都有一個自己的子目錄,里面是代碼的壓縮包package.tgz文件,以及一個描述文件package/package.json。

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

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

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

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

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

$ rm -rf ~/.npm/*# 或者$ npm cache clean123

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

  1. 發(fā)出npm install命令

  2. npm 向 registry 查詢模塊壓縮包的網(wǎng)址

  3. 下載壓縮包,存放在~/.npm目錄

  4. 解壓壓縮包到當(dāng)前項目的node_modules目錄

注意,一個模塊安裝以后,本地其實保存了兩份。一份是~/.npm目錄下的壓縮包,另一份是node_modules目錄下解壓后的代碼。

但是,運行npm install的時候,只會檢查node_modules目錄,而不會檢查~/.npm目錄。也就是說,如果一個模塊在~/.npm下有壓縮包,但是沒有安裝在node_modules目錄中,npm 依然會從遠程倉庫下載一次新的壓縮包。

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

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

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

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

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

上面命令指定,只有超過999999分鐘的模塊,才從 registry 下載。實際上就是指定,所有模塊都從緩存安裝,這樣就大大加快了下載速度。

它還有另一種寫法。

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

但是,這并不等于離線模式,這時仍然需要網(wǎng)絡(luò)連接。因為現(xiàn)在的--cache-min實現(xiàn)有一些問題。

(1)如果指定模塊不在緩存目錄,那么 npm 會連接 registry,下載最新版本。這沒有問題,但是如果指定模塊在緩存目錄之中,npm 也會連接 registry,發(fā)出指定模塊的 etag ,服務(wù)器返回狀態(tài)碼304,表示不需要重新下載壓縮包。

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

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

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

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

解決方案大致分成三類。

第一類,Registry 代理。

npm-proxy-cachelocal-npm(用法)
npm-lazy123

上面三個模塊的用法很類似,都是在本機起一個 Registry 服務(wù),所有npm install命令都要通過這個服務(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.io1234567891011

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

第二類,npm install替代。

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

$ npm-cache install1

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

這個方案的思路是,不使用.npm緩存,而是使用項目的node_modules目錄作為緩存。

Freight 
npmbox 
上面兩個工具,都能將項目的node_modules目錄打成一個壓縮包,以后安裝的時候,就從這個壓縮包之中取出文件。


原文地址http://www.ruanyifeng.com/blog/2016/01/npm-install.html

標(biāo)簽: HTML JS
分享:
評論:
你還沒有登錄,請先