Angular 12 - 生成浏览器应用程序包(阶段:封装)非常缓慢。

43

我将我的Angular应用程序从 Angular 11.2.12 更新到 Angular 12.0.0

Angular CLI: 12.0.0
Node: 14.15.4
Package Manager: npm 6.14.10
OS: win32 x64

Angular: undefined
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1200.0 (cli-only)
@angular-devkit/core         12.0.0 (cli-only)
@angular-devkit/schematics   12.0.0 (cli-only)
@schematics/angular          12.0.0 (cli-only)
typescript                   4.2.4

ng serve 生成浏览器应用程序包 需要非常长的时间。

Build at: 2021-05-28T06:03:02.008Z - Hash: 3b63141b76ac88698d67 - Time: 63941ms <- change one line in template
Build at: 2021-05-28T06:08:04.424Z - Hash: e684399b5f80b2b4d785 - Time: 59834ms <- change property name
Build at: 2021-05-28T06:10:05.725Z - Hash: 8125e1bdc31a25d398b5 - Time: 65621ms <- change one line in model

目前我尝试使用不同的属性来运行 ng serve ,我使用的是:

ng serve --source-map=true --hmr --live-reload

升级到 Angular 12.0.0 后,我创建了一个全新的 Angular 应用程序,并将 angular.json 文件应用到我的应用程序 myapp

angular.json

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "myapp": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "myapp",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/myapp",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.json",
            "inlineStyleLanguage": "scss",
            "assets": ["src/favicon.ico", "src/assets"],
            "styles": ["./node_modules/@angular/material/_theming.scss", "src/styles.scss"],
            "scripts": []
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "500kb",
                  "maximumError": "1mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "2kb",
                  "maximumError": "4kb"
                }
              ],
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "buildOptimizer": false,
              "optimization": {
                "scripts": true,
                "styles": false,
                "fonts": false
              },
              "vendorChunk": true,
              "extractLicenses": false,
              "sourceMap": true,
              "namedChunks": true
            }
          },
          "defaultConfiguration": "production"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "myapp:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "myapp:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "myapp:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "inlineStyleLanguage": "scss",
            "assets": ["src/favicon.ico", "src/assets"],
            "styles": ["./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "src/styles.scss"],
            "scripts": []
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"],
            "exclude": ["**/node_modules/**"]
          }
        },
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "myapp:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "myapp:serve:production"
            }
          }
        }
      }
    }
  },
  "defaultProject": "myapp"
}

有没有什么方法可以加快 生成浏览器应用程序包(阶段:密封) 的速度?


@Simon_Weaver 感谢您的建议,不幸的是我需要sourceMap进行调试。但是知道我不是唯一遇到这个问题的人,也是件好事。 - Mar Tin
1
有一些关于性能的问题仍然存在。https://github.com/angular/angular-cli/issues/20792 https://github.com/angular/angular-cli/issues/20713 - Simon_Weaver
1
也尝试将 aot="false"。确保只在开发构建中执行此操作,并在部署之前打开测试。目前我的 aot 构建需要 109 秒,而非 aot 构建需要 69 秒。 - Simon_Weaver
我已经好几年没有使用sourceMap了。它只会让事情变得太慢,增加大约10秒的时间。即使我的代码被重新排列,我仍然可以在调试器中识别出来!而且我只需搜索就能找到需要的行。无论如何,祝你好运! - Simon_Weaver
我刚刚意识到你没有具体回复如何将“scripts”设置为false。如果你将“scripts”设置为false,我认为你根本不应该看到“sealing”。我还添加了一个答案,虽然有点离题,但如果你有很多SASS,这可能是它变慢的另一个原因。 - Simon_Weaver
显示剩余6条评论
7个回答

49

我尝试了很多方法来解决这个问题,但希望只需要做两个重要的更改:

  1. angular 12.0.0 更新为 angular 12.0.2
  2. angular.json 中设置 defaultConfigurationdevelopment ("defaultConfiguration": "development")

"defaultConfiguration": "production"

Build at: 2021-05-29T06:49:51.461Z - Hash: 9d68fbaa715d790c89ed - Time: 29446ms <- change one character in string
Build at: 2021-05-29T06:50:31.850Z - Hash: cc2399413ce6f0800553 - Time: 32195ms <- change one character in string

"defaultConfiguration": "development"

Build at: 2021-05-29T06:52:16.258Z - Hash: b9b4991fa89ef1e785fc - Time: 781ms <- change one character in string
Build at: 2021-05-29T06:52:27.484Z - Hash: 3838e3c45e33228591f9 - Time: 622ms <- change one character in string

最终的 angular.json

  • "sourceMap": true 对我很重要
  • 只需简单调用 ng serve,无需其他参数
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "dotbot": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "dotbot",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/dotbot",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.json",
            "inlineStyleLanguage": "scss",
            "assets": ["src/favicon.ico", "src/assets"],
            "styles": ["./node_modules/@angular/material/_theming.scss", "src/styles.scss"],
            "scripts": []
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "500kb",
                  "maximumError": "1mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "2kb",
                  "maximumError": "4kb"
                }
              ],
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "buildOptimizer": false,
              "optimization": {
                "scripts": false,
                "styles": false,
                "fonts": false
              },
              "vendorChunk": true,
              "extractLicenses": false,
              "sourceMap": true,
              "namedChunks": true
            }
          },
          "defaultConfiguration": "development"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "dotbot:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "dotbot:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "dotbot:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "inlineStyleLanguage": "scss",
            "assets": ["src/favicon.ico", "src/assets"],
            "styles": ["./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "src/styles.scss"],
            "scripts": []
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"],
            "exclude": ["**/node_modules/**"]
          }
        },
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "dotbot:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "dotbot:serve:production"
            }
          }
        }
      }
    }
  },
  "defaultProject": "dotbot"
}

3
谢谢,你节省了我们的时间! - B.Habibzadeh
1
当在更新Angular后出现此问题时,请确保您的package.json不会覆盖配置。我使用了ng serve --configuration=dev和一个名为dev的配置,该配置没有“新”的Angular配置,但是构建仍然默认为production - Adrian Jandl
我刚从Angular 10升级到14,发现热重载时间从约3秒增加到约17秒,但在实施您的配置后,它又回到了约3秒。谢谢! - JW_
我的解决方案是运行 ng serve --configuration=development。我猜拼写可能因 angular.json 中的设置而异(我正在使用 Angular ^14.2.0)。谢谢! - DeFeNdog
适用于 Angular 13.3.9。 - diegot

5
我也将一个Angular 8应用程序升级到13,并且注意到在编辑编译周期中密封阶段的时间大大降低(几乎一整分钟)。我的解决方法如下,因为我遇到的建议都没有帮助我:

无论您更新到哪个新的Angular版本,都要执行以下操作:

  1. 在您正在升级的版本中生成一个新的应用程序(例如ng new proj13)。在此处,保持旧项目中执行的项目创建默认设置不变(例如使用scss而不是css,路由器或无路由器...)
  2. 将新的angular.json文件原样从新的一次性项目复制到升级后的项目中,或者至少确保您重写旧文件以看起来与新文件完全相同。
  3. 确保项目名称是在projectsbrowserTargetoutputPath等属性下使用的名称,以防文件名更改发生。

完成后,编辑编译周期符合预期,毫秒级别的即时。

我认为在这种升级过程中,angular.json文件没有得到它所需的适当的新版本格式关注,如果您检查旧文件与新文件格式/键/属性之间的区别,您应该会发现这一点。


3
我认为速度变化主要是由于webpack 5引起的,除非Angular 12存在一些可怕的bug。
我安装了一个webpack插件SpeedMeasurePlugin。为此,您需要安装@angular-builders/custom-webpack
我使用的配置文件类似于以下内容:
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

const smp = new SpeedMeasurePlugin();

module.exports = smp.wrap({

  output: {
    scriptType: "module"
  },

  plugins: []
});

我的项目输出了以下内容。

enter image description here

正文:
如您所见,很多时间都花在了sass-loader上(可能还有css-loader)。
我正在寻找缓存sass的方法。我相信大部分来自Angular Material。
完全清空了我的styles.css文件,最终得到了:

enter image description here

“顺序不完全相同,但总体上花费在Sass上的时间似乎明显较少。我不太确定接下来该怎么做。Sass并非全部,我的AOT构建仍然非常慢。那是Webpack 5吗?不确定。”

1
对于任何使用 Windows 的人,如果看起来像是构建了两次,则可能是这个 bug https://github.com/angular/angular-cli/issues/20891。 - Simon_Weaver
如果“封存”阶段完全卡住了,我该怎么办?如何找出问题所在?我将我的解决方案从Angular 13升级到Angular 15,无论配置如何,都无法通过“封存”阶段。 - Alexander
@Alexander,我最近升级到了15版本,除了花了一周时间解决Angular Material问题之外,其他问题居然很少。我感觉好像已经有一段时间没有看到“封装”这个词了。我会从注释掉所有路由(和导入)开始,看看能否构建一个最小化的项目。 - Simon_Weaver
我已经调试了 "ng serve" 并且现在可以看到错误。但是不知道为什么在 Angular 升级后会出现这个错误,也不知道如何修复它:"Module parse failed: Unexpected token (1:0). You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file"。看起来现在 "css-loader" 不再看到 .css 文件了... - Alexander
你找到解决方案了吗?我也遇到了这个问题。 - Gui Brunow

2
使用npm upgrade升级我的软件包解决了我的问题。

对我来说有效。 - Nil Bor

1

我做了很多事情,但导出 node.js openssl-legacy-provider 解决了我的错误。

export NODE_OPTIONS=--openssl-legacy-provider(in git bash)

你是冠军。 - Ashok G

0

对我来说,在 angular.json 上禁用一些功能解决了问题,但这取决于您正在运行的配置。

这是我的开发配置:

"develop": {
          "fileReplacements": [
            {
              "replace": "src/environments/environment.ts",
              "with": "src/environments/environment.develop.ts"
            }
          ],
          "optimization": false,
          "aot": false,
          "outputHashing": "all",
          "sourceMap": true,
          "namedChunks": false,
          "extractLicenses": true,
          "vendorChunk": false,
          "buildOptimizer": false,
          "budgets": [
            {
              "type": "initial",
              "maximumWarning": "2mb",
              "maximumError": "5mb"
            },
            {
              "type": "anyComponentStyle",
              "maximumWarning": "6kb",
              "maximumError": "10kb"
            }
          ]
        }

这些是更改内容:

"optimization": false,
"aot": false,
"sourceMap": true,
"buildOptimizer": false,

0

对我来说,慢速处理是由错误的Tailwind配置引入的:

过于宽松的全局模式(非常缓慢):

let config = require('./node_modules/@my-library/tailwind.config.js');
config.content = [
  './apps/**/*.{html,ts,scss}',
  './libs/**/*.{html,ts,scss}',
  './node_modules/@my-library/**/*.*'
];

修复模式后:

let config = require('./node_modules/@my-library/tailwind.config.js');
config.content = [
  './apps/**/*.{html,ts,scss}',
  './libs/**/*.{html,ts,scss}',
  './node_modules/@my-library/**/*.{html,js,ts,scss}'
];

这个修复使构建过程时间缩短了约30秒。


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