Angular 通用内部 docker: 无法读取未定义的 属性 'getOptionsDiagnostics'

Angular Universal inside docker: Cannot read property 'getOptionsDiagnostics' of undefined

我有 Angular 启用了通用渲染的 5.2 应用程序(主要根据 this article 实现)。一切都适用于我的本地环境,但是当我尝试在 docker 中构建应用程序时,它失败并出现此错误:

$ node --max-old-space-size=4096 ./node_modules/.bin/webpack -p
/app/node_modules/typescript/lib/typescript.js:91633
       return program.getOptionsDiagnostics(cancellationToken).concat(program.getGlobalDiagnostics(cancellationToken));
                      ^

TypeError: Cannot read property 'getOptionsDiagnostics' of undefined
    at Object.getCompilerOptionsDiagnostics (/app/node_modules/typescript/lib/typescript.js:91633:28)
    at provideCompilerOptionDiagnosticErrorsToWebpack (/app/node_modules/ts-loader/dist/after-compile.js:39:29)
    at Compiler.<anonymous> (/app/node_modules/ts-loader/dist/after-compile.js:17:9)
    at next (/app/node_modules/tapable/lib/Tapable.js:204:14)
    at Compiler.<anonymous> (/app/node_modules/webpack/lib/CachePlugin.js:78:5)
    ...

我尝试使用 node:carbon 图像构建并使用 ubuntu:16.04 + 通过 apt 安装 node,两个图像中的错误相同。

此错误是在构建的最后阶段引起的,我在该阶段使用 webpack 构建服务器应用程序 ($ node --max-old-space-size=4096 ./node_modules/.bin/webpack -p)。

我使用 webpack 3.11,配置如下:

const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  entry: {
    server: './src/server.ts',
  },
  resolve: {
    extensions: ['.ts', '.js'],
    alias: {
      'main.server': path.join(__dirname, 'dist', 'server', 'main.bundle.js'),
    },
  },
  target: 'node',
  externals: [nodeExternals({
    whitelist: [
      /^@ng-bootstrap\/ng-bootstrap/,
      /ngx-translate-messageformat-compiler/,
    ],
  })],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].js',
  },
  module: {
    rules: [
      { test: /\.ts$/, loader: 'ts-loader' },
    ],
  },
};

自己找到了一个解决方案,在 webpack 配置中我启用了 ts-loadertranspileOnly 选项,这个错误神奇地消失了。在这种情况下,代码已经过类型检查,所以无论如何都不需要。

{ test: /\.ts$/, loader: 'ts-loader', options: { transpileOnly: true } },