我正在尝试在构建过程阶段加快npm安装。我的package.json包含了几乎包含锁定修订的软件包列表。我还使用命令
配置了缓存目录npm config set cache /var/tmp/npm-cache --global
但是,在尝试使用npm install -g --cache
进行安装时,我发现此步骤并没有像我期望的那样只通过从缓存加载包来减少安装时间。事实上,我怀疑它是否甚至使用本地缓存来首先查找包。
答案 0 :(得分:9)
根据@Daniel Serodio的建议
您还可以在存储库中包含 node_modules 文件夹,但您可能首先压缩它,而不是添加到 repo ,安装时你可以解压缩它只是
@Component({
selector: 'my-app',
template: `
<div *ngIf="_config">
...
</div>`
...
)}
export class MyApp {
private _config;
constructor(configService:ConfigService) {
configService.change.subscribe(value) => {
this.config = value;
});
}
}
(跨平台工作)它非常快。
这也可以让您完全控制所有依赖项。
此外,您可以将进程标记设置为 false ,以将速度提高2倍。
npm rebuild
答案 1 :(得分:4)
对于纯npm解决方案,您可以尝试
npm install --prefer-offline --no-audit --progress=false
首选离线运行可能对第一次运行没有帮助。
答案 2 :(得分:3)
您还可以在您的存储库中包含您的node_modules
文件夹(您可能正在使用git),并且在构建/部署过程中只包含npm rebuild
(跨平台工作),而且速度非常快。 / p>
这也可以让您完全控制所有依赖项(我知道通常应该使用的是shrinkwrap)
修改强>
此外,您可以将进度标记设置为false,以将速度提高至少 20%。这只适用于npm@v3.x.x,很快就会有解决方法(见第二个链接)
npm set progress=false
答案 3 :(得分:3)
提出另外两种现代方法:
1)npm ci
使用npm ci
,它可以从npm版本5.7.0
中获得(尽管由于broken release,我建议使用5.7.1
及更高版本)-这需要package-lock.json
出现,并且会跳过package.json
文件之外的依赖树的生成,并遵守锁定文件中已经解析的依赖项URL。
非常快
增强您的CI / CD环境(我们的构建时间减少到原来的四分之一!)和/或确保在开发过程中所有开发人员都使用相同版本的依赖项(而不必对严格的版本进行硬编码)您的package.json
文件)。
但是请注意,npm ci
在安装之前会删除node_modules/
目录,因此它不会从任何缓存策略中受益。
2)npm i --prefer-offline
将--prefer-offline
标志与常规npm install
/ npm i
一起使用。使用这种方法,您需要确保在构建之间(在CI / CD环境中)缓存了node_modules/
目录。如果无法在本地找到具有特定版本的软件包,它将安全地退回到网络。
答案 4 :(得分:2)
作为非常现代的解决方案,您可以开始使用Docker。 Docker允许您将代码的当前状态虚拟化并预定义为映像,包括已安装的npm-modules和其他好东西。
基础架构/ env的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的人进行一些学习,但在我的拙见中,这是解决问题的最佳方法。
答案 5 :(得分:1)
在2:30到1分钟之内,没有什么比禁用防病毒(我的情况下是Windows Defender)更能帮助我。 使用npm-cache包,我得到了约30秒。 我尝试使用非常快的纱线,但在我的情况下随机失败。
答案 6 :(得分:1)
最好使用以下命令安装pnpm
软件包:
npm i -g pnpm
pnpm使用硬链接和符号链接仅一次将一个版本的模块保存在磁盘上。例如,当使用npm或Yarn时,如果有100个项目使用相同版本的lodash,则磁盘上将有100个lodash副本。使用pnpm,lodash将保存在磁盘上的单个位置,并且硬链接会将其放入应该安装它的node_modules中。
作为示例,我可以提到,只要您想安装package.json
文件的依赖项,您要做的就是简单地输入pnpm i
并由它自己处理其他事情。
答案 7 :(得分:0)
我们一直在尝试解决此问题,以加快部署速度。
我们已经决定使用pac,它遵循其他答案中的原则。它会压缩npm模块并将它们包含在您的仓库中,这样您在提交和代码审查中就不会有一百万个文件,您只需解压缩/重建目标机器。