更新到Angular 9之后生成项目会导致错误“无法读取未定义的属性'length'

时间:2020-03-20 10:57:41

标签: angular npm migration angular9

我正在尝试按照update.angular.io迁移指南将项目更新为Angular 9。执行ng update @angular/core @angular/cli后,执行ng build --prod时,执行ng build后出现错误“无法读取未定义的属性'length'的错误”。 ng build --aot也在工作。

npm日志给出以下输出

   0 info it worked if it ends with ok
   1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'run', 'build', '--prod' ]
   2 info using npm@6.14.3
   3 info using node@v10.18.0
   4 verbose run-script [ 'prebuild', 'build', 'postbuild' ]
   5 info lifecycle my-project@0.1.0~prebuild: my-project@0.1.0
   6 info lifecycle my-project@0.1.0~build: my-project@0.1.0
   7 verbose lifecycle my-project@0.1.0~build: unsafe-perm in lifecycle true
   8 verbose lifecycle my-project@0.1.0~build: PATH: /usr/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/path/to/project/my-project/subproject/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
   9 verbose lifecycle my-project@0.1.0~build: CWD: /path/to/project/my-project/subproject
   10 silly lifecycle my-project@0.1.0~build: Args: [ '-c', 'ng build --prod' ]
   11 silly lifecycle my-project@0.1.0~build: Returned: code: 1  signal: null
   12 info lifecycle my-project@0.1.0~build: Failed to exec build script
   13 verbose stack Error: my-project@0.1.0 build: `ng build --prod`
   13 verbose stack Exit status 1
   13 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16)
   13 verbose stack     at EventEmitter.emit (events.js:198:13)
   13 verbose stack     at ChildProcess.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
   13 verbose stack     at ChildProcess.emit (events.js:198:13)
   13 verbose stack     at maybeClose (internal/child_process.js:982:16)
   13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5)
   14 verbose pkgid my-project@0.1.0
   15 verbose cwd /path/to/project/my-project/subproject
   16 verbose Linux 4.15.0-54-generic
   17 verbose argv "/usr/bin/node" "/usr/bin/npm" "run" "build" "--prod"
   18 verbose node v10.18.0
   19 verbose npm  v6.14.3
   20 error code ELIFECYCLE
   21 error errno 1
   22 error my-project@0.1.0 build: `ng build --prod`
   22 error Exit status 1
   23 error Failed at the my-project@0.1.0 build script.
   23 error This is probably not a problem with npm. There is likely additional logging output above.
   24 verbose exit [ 1, true ]

为解决该问题,我更新了npm,但无济于事。我也通过设置

关闭了所有的角度编译器检查
       "fullTemplateTypeCheck": false,
       "strictInjectionParameters": false
tsconfig.json中的

。这也没有用。删除node_modules和package-lock.json并创建新的npm install也不能解决问题。

npm version is 6.14.3 node version is 10.18.0

2 个答案:

答案 0 :(得分:1)

我发现,更改angular.json的配置可以解决问题。

在我拥有之前:

"optimization": true

我将其更改为:

"optimization": { "scripts": true, "styles": false }

现在它正在生产模式下构建。这不是真正的解决方案,而是一种解决方法。因此,如果有人知道如何解决问题并保持样式优化,请与我分享。

答案 1 :(得分:0)

Angular 9附带Ivy,并启用了默认aot。我也遇到了问题,我从angular.json中删除了我的构建配置中的所有“ aot”或“ buildOptimizer”设置。 例如:用于产品构建的生产配置。另外,请确保您在清理node_modules后尝试进行npm安装,如果一次执行不起作用。

可能是您遇到了一些依赖关系,这些依赖关系存在优化问题。这个技巧应该起作用。

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