簡體   English   中英

加速 npm 安裝

[英]Speeding up the npm install

我正在嘗試在構建過程階段加快 npm install 的速度。 我的 package.json 有很多包含鎖定修訂的包列表。 我還使用命令配置了緩存目錄

npm config set cache /var/tmp/npm-cache --global

然而,在嘗試使用npm install -g --cache進行npm install -g --cache ,我發現這一步並沒有像我預期的那樣通過從緩存加載包來減少安裝時間。 事實上,我懷疑它是否首先使用本地緩存來查找包。

提出兩種更現代的方法:

1) npm ci

使用npm ci ,它可以從 npm 版本5.7.0 (盡管我推薦5.7.1及更高版本,因為版本損壞) - 這需要package-lock.json存在並且它跳過從你的package.json構建你的依賴樹package.json文件,尊重鎖定文件中已解析的依賴項 URL。

快速提升您的 CI/CD 環境(我們的構建時間減少到原來的四分之一!)和/或確保您的所有開發人員在開發過程中使用相同版本的依賴項(無需硬編碼package.json文件中的嚴格版本)。

但是請注意, npm ci在安裝之前刪除了node_modules/目錄,因此它不會從任何緩存策略中受益。

2) npm i --prefer-offline

--prefer-offline標志與常規npm install / npm i 使用這種方法,您需要確保在構建之間緩存了node_modules/目錄(在 CI/CD 環境中)。 如果無法在本地找到具有特定版本的軟件包,則它會安全地回退到網絡。

正如@Daniel Serodio 所建議的

您還可以將node_modules文件夾包含在您的存儲庫中,但您可能應該先將其壓縮而不是添加到repo 中,並且在安裝時您可以解壓縮它,然后

 npm rebuild

(跨平台工作)它非常快。

這也將使您可以完全控制所有依賴項。

您也可以將進程標志設置為false以將速度提高 2 倍。

npm set progress=false

閱讀來源以獲取更多信息

更新:您也可以為此使用 pnpm

npm i -g pnpm

這基本上使用本地緩存模塊(我聽說它比 YARN 更好)

對於純 npm 解決方案,您可以嘗試

npm install --prefer-offline --no-audit --progress=false

首選離線可能對第一次運行沒有用。

最好使用以下命令安裝pnpm包:

npm i -g pnpm

pnpm 使用硬鏈接和符號鏈接在磁盤上只保存一個版本的模塊一次。 例如,當使用 npm 或 Yarn 時,如果您有 100 個項目使用相同版本的 lodash,則磁盤上將有 100 個 lodash 副本。 使用 pnpm,lodash 將被保存在磁盤上的一個位置,並且一個硬鏈接會將它放入應該安裝它的 node_modules 中。

舉個例子,我可以提到,每當你想安裝package.json文件的依賴項時,你應該做的就是輸入pnpm i ,它自己處理其他事情。

您還可以在您的存儲庫中包含您的node_modules文件夾(您可能正在使用 git),並且只在構建/部署過程中使用npm rebuild (跨平台工作),並且速度非常快。

這也將使您完全控制所有依賴項的好處(我知道這通常應該用於shrinkwrap)

編輯:

您也可以將進度標志設置為 false 以將您的速度提高至少20%。 這僅適用於 npm@v3.xx,並且有望很快修復(請參閱第二個鏈接)

npm set progress=false

作為非常現代的解決方案,您可以開始使用 Docker。 Docker 允許您將代碼的當前狀態虛擬化並預定義為鏡像,包括已安裝的 npm 模塊和其他好東西。

一旦您的基礎設施/環境的 docker 鏡像在本地構建,或從遠程存儲庫中檢索,它將存儲在主機上,您可以在幾秒鍾內啟動服務器。 它的另一個好處是您可以在部署代碼的任何機器上使用相同的虛擬化代碼基礎架構。 Docker 加快了安裝/部署過程,是一種廣泛使用的技術。

開始使用 docker 就足夠了(所有代碼片段只是用於預設置的模擬/示例,絕不是最強大/優雅的解決方案):

1) 使用手冊安裝docker 和 docker -compose 並在docker.com上對其有一些基本的了解

2) 在應用程序的根目錄中寫入 Dockerfile 文件

FROM node:6.9.5
RUN mkdir /usr/local/app
WORKDIR  /usr/local/app
COPY package.json package.json
RUN npm install

3)在項目的根目錄中創建 docker-compose.yml ,內容如下:

version: "2"
server:
  hostname: server
  container_name: server
  image: server
  build: .
  command: sh -c 'NODE_ENV=development PORT=8080 node app.js' 
  ports:
    - "8080:8080"
  volumes: #list of folders and files to use 
    - ${PWD}/server:/usr/local/server
    - ${PWD}/app.js:/usr/local/app.js

4) 要啟動服務器,您需要docker-compose up -d 要查看日志docker-compose logs -f server 如果您將重新啟動服務器,它會在幾秒鍾內完成一次構建映像。 然后它將在本地緩存構建層,以便下次運行只需幾秒鍾。

我知道這可能是一個強大的解決方案,但我相信它具有最大的潛力/靈活性並且在工業中被廣泛使用。 雖然對於之前沒有使用過 Docker 的任何人來說,它都需要一些學習,但在我看來,它是解決您問題的最佳選擇。

我們一直在努力解決這個問題以加快我們的部署。

我們已經決定使用 pac,它遵循其他答案中的原則。 它壓縮 npm 模塊並將它們包含在您的存儲庫中,因此您的提交和代碼審查中沒有一百萬個文件,您只需為目標機器解壓/重建即可。

https://www.npmjs.com/package/pac

沒有什么比從 2:30 到 1 分鍾禁用防病毒軟件(在我的情況下為 Windows Defender)更能幫助我的了。 使用npm-cache包,我達到了大約 30 秒。 我嘗試使用速度非常快的紗線,但在我的情況下隨機失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM