Npm 安装速度很慢,几乎每个库之后都会出现大量“缓存缺失”

问题描述 投票:0回答:2

虽然一切似乎都在我的本地计算机上运行;

每当我在 docker (docker run node:18) 中运行 nodejs 并克隆一个项目时,输入

npm install
来获取所有库并使用它们,速度非常慢。好像慢了10秒。

虽然它在最初的碰撞后工作得很快,但我还注意到每个库(据我所知)在计时(大约 10 秒)后都附加了一个

(cache miss)
。发生了什么事这是一个问题/我可以解决它吗?

强调一下:它发生在任何 docker 中,无论我使用 node-alpine、node docker,甚至只是 ubuntu docker 并手动安装节点。


在 @NaorTedgi 的一些提示之后,我注意到这确实是因为该包位于 docker 外部并通过卷链接。我还注意到时间本身(15 秒)取决于它尝试加载的包的数量。对于单个包,它太快了,太明显了,而对于一些包,它只有半秒。

因此,为了测试它,我采取了以下步骤:

创建一个新目录(

~/javascript-test
)并将以下内容放入
package.json
文件中:

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "NODE_ENV=production node ./javascript/app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcryptjs": "^2.4.3",
    "connect-redis": "^6.1.3",
    "cookie-parser": "^1.4.6",
    "date-fns": "^2.28.0",
    "debug": "^4.3.3",
    "express": "^4.17.2",
    "express-session": "^1.17.2",
    "http-errors": "^2.0.0",
    "knex": "^2.1.0",
    "morgan": "^1.10.0",
    "multer": "^1.4.5-lts.1",
    "nanoid": "^3.3.4",
    "node-cron": "^3.0.1",
    "objection": "^3.0.1",
    "pg": "^8.7.1",
    "redis": "^4.2.0",
    "typescript": "^4.7.4",
    "uuid": "^8.3.2"
  }
}

打开此目录的 shell 并运行(初始化

package.json

npm install
rm -rf node_modules

然后使用该卷运行 docker(如果需要,显然可以使用 sudo):

docker run --name node-test --rm -it -v ~/javascript-test:/javascript node:18

打开second shell(因为默认入口点不是来自节点泊坞窗的

sh
)并执行:

docker exec -it node-test sh

docker shell 内部:

cd javascript && npm install

通过这些步骤,我注意到 2 秒后缓存未命中。

最后我注意到,如果我确实删除了node_modules并在docker中再次重新安装模块(

npm install
),则不会发生缓存丢失。因此,要第二次测试,必须结束节点 docker 并重新运行它(在第一个 shell 中
docker run...
)。


对于那些喜欢 dockerfile 的人来说,这是仍然显示错误的最简单的文件(再次确保绑定包含上述 `package.json` 和相应的 `package-lock.json` 的卷)
FROM node:18
WORKDIR /javascript
ENTRYPOINT npm install

Dockerfile
package.json
/
package-lock.json
文件的git存储库:https://github.com/pulli23/docker-npm-test

运行它(如果克隆到

~/dockertest

sudo docker build -t nodetest .  && sudo docker run --name node-test --rm -it -v ~/dockertest/javascript-test:/javascript nodetest
node.js docker
2个回答
5
投票

您需要检查的几件事:

  1. 如果您使用多个注册表,请确保
    npm
    是您的默认注册表

npm config set registry=https://registry.npmjs.com/

  1. 如果您的项目存储库有 package-lock.json
  • 然后确保您没有使用卷到当前目录
    node_modules
    dir到您的图像,如果是这样,在安装之前删除node_modules会更快
  • 运行安装
    ci
    =>
    npm ci
  1. 确保您的 package-lock.json 是通过容器内部的“npm i”命令生成的!在本地运行
    npm i
    将生成与您的本地节点版本兼容的库,如果是 C++ 附加组件,则会根据您的操作系统生成 dll、so 或 dylib 文件

2
投票

我的猜测是与网络(例如代理)或身份验证(例如与企业存储库的连接)相关的问题。您的本地连接有一些您的容器缺少的东西,也许是一些证书。

您应该进入容器并测试是否可以访问存储库。

© www.soinside.com 2019 - 2024. All rights reserved.