生产环境下 Angular 构建耗费过多内存?

4
我使用 Docker 将我的 Node.js/Angular 应用程序打包,并设置了 GitLab Runner,以便一键部署更改到实时服务器。
docker-compose.yml:
version: "3"
services:
    client:
        build: 
           context: ...
           dockerfile: ...
           ...
    server:
        build:
           context: ...
           dockerfile: ...
           ...

问题在于,当构建到 Dockerfile 的以下部分时:

ng build --prod

它总是失败,并且在服务器上出现内存不足错误(1GB RAM)。

"build-prod": "ng build --prod --aot=true --buildOptimizer=true",

除了在本地机器上构建文件并将其提交到仓库中,然后只需复制/粘贴这些文件之外,还有没有其他解决方法?

clientDockerfile

# STAGE 1 - Build app

FROM node:12-alpine as client

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build-prod

#STAGE 2: Run NGINX

FROM nginx

COPY --from=client /app/dist/* /var/www/html

COPY default.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

更新:

我尝试了使用max_old_space_size的建议,但是构建仍然失败了,虽然这次出现了不同的错误:

enter image description here

在使用max_old_space_size之前,构建通常在Browserslist:caniuse-lite已过时,请运行下一个命令npm update后立即失败,但是在这里,它成功通过了那一步。


3
也许可以参考这个链接:https://dev59.com/ZVYN5IYBdhLWcg3w2rSU#46807408。还有这个GitHub问题链接:https://github.com/angular/angular-cli/issues/5618#issuecomment-450151214。 - Stefan Golubović
@Aravind 谢谢您的回复,请查看我上面的更新。 - herondale
@herondale,你的内存消耗过多的错误解决了吗? - Aravind
@Aravind 嗯,我不是很确定。我谷歌了一下这个新的错误,看起来它似乎仍然与内存耗尽有关(https://dev59.com/Z18e5IYBdhLWcg3wAWjs)。即使服务器只有1GB的RAM,`--max_old_space_size=5048`真的能起作用吗? - herondale
1
绝对不行。你不能消耗比你拥有的内存更多的内存。如果你只有1GB而且不够用,那就是你的问题。我不知道交换内存是否能帮助你解决这个问题。 - Stefan Golubović
显示剩余3条评论
1个回答

0

在一台机器上,可以为所有NodeJS进程设置内存限制,这意味着在一个开发者的机器上构建的内容可能在另一个开发者的机器上无法构建,因为他们可能已经增加/降低了内存限制。 与上述类似,某些托管的构建代理(例如Azure Devops、Github Actions等)可能将内存限制设置得比您想象的要低/高,这意味着在这里构建成功/失败,而在其他机器上则不会。 您的Angular项目的非生产构建(例如仅使用ng serve)可以正常构建,但是使用生产标志进行构建会消耗更多内存,因此只有在生产环境中构建时才可能崩溃。 幸运的是,有一个非常简单的解决方法可以解决上述所有问题。虽然您可以在自述文件中留下一条注释,说“嘿,你需要增加内存到XYZ”,但更好的选择是创建一个npm构建脚本,仅为该构建设置内存限制,并保持机器上的其他内容不变。

例如,我最近的一个项目在package.json中有以下一组脚本:

"scripts": {
  "ng": "ng",
  "start": "ng serve",
  "build": "ng build",
  "test": "ng test",
  "lint": "ng lint",
  "e2e": "ng e2e",
  "build-prod": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng build --prod",
}

注意最后一个脚本。它看起来很复杂,但实际上非常简单。
启动Node进程。 将“max old space size”设置为8000MB。 在您的节点模块文件夹中找到Angular CLI。 运行生产环境的Angular构建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接