使用 webpack 构建 Angular 9

asz*_*ien 6 webpack angular

我有一个 Angular 应用程序,我定期更新并使用最新的 Webpack 打包器构建它。
几天前,我将项目升级到 Angular 9,遇到了一些我无法解决的问题。

  1. npm run build:prod
    错误 TS2307:找不到模块“./app/app.module.ngfactory”。
    我认为这是由 webpack 配置的这一部分引起的,因为模块导入在 Angular 9 中发生了变化。但是,我并不确定。
  plugins: [
    new ngw.AngularCompilerPlugin({
      tsConfigPath: path.resolve(rootPath, 'tsconfig.aot.json'),
      entryModule: path.resolve(rootPath, 'src', 'app', 'app.module#AppModule')
    })
  ]
Run Code Online (Sandbox Code Playgroud)
  1. npm run test
    File not found: ./node_modules/jest-preset-angular/InlineHtmlStripStylesTransformer(解析为:.../angular-webpack-build/node_modules/jest-preset-angular/InlineHtmlStripStylesTransformer)
    这个错误对我来说有点神秘. 我读过一些关于类似问题的帖子,但这些建议没有奏效。

你可以在下面找到我的配置文件,但整个项目都可以在 GitHub 上找到:https : //github.com/aszidien/angular-webpack-build

package.json

...
  "scripts": {
    "build:dev": "cross-env NODE_ENV=development webpack --mode development",
    "build:prod": "cross-env NODE_ENV=production webpack --mode production",
    "test": "jest"
  }
...
Run Code Online (Sandbox Code Playgroud)

tsconfig.aot.json

{
  "compilerOptions": {
    "module": "es2015",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ]
  },
  "angularCompilerOptions": {
    "skipMetadataEmit": true
  }
}
Run Code Online (Sandbox Code Playgroud)

webpack.config.common.js

const webpackMerge = require('webpack-merge');

const commonConfig = require('./webpack.config.common');

module.exports = webpackMerge(commonConfig, {
  devtool: 'cheap-module-eval-source-map',
  output: {
    publicPath: '/',
    filename: 'bundle.js',
    chunkFilename: '[id].chunk.js'
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: [
          {
            loader: 'awesome-typescript-loader', options: {
              transpileOnly: true
            }
          },
          { loader: 'angular2-template-loader' },
          { loader: 'angular-router-loader' }
        ]
      }
    ]
  },
  devServer: {
    historyApiFallback: true,
    stats: 'minimal'
  }
});
Run Code Online (Sandbox Code Playgroud)

webpack.config.prod.js

const webpackMerge = require('webpack-merge');

const commonConfig = require('./webpack.config.common');

module.exports = webpackMerge(commonConfig, {
  devtool: 'cheap-module-eval-source-map',
  output: {
    publicPath: '/',
    filename: 'bundle.js',
    chunkFilename: '[id].chunk.js'
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: [
          {
            loader: 'awesome-typescript-loader', options: {
              transpileOnly: true
            }
          },
          { loader: 'angular2-template-loader' },
          { loader: 'angular-router-loader' }
        ]
      }
    ]
  },
  devServer: {
    historyApiFallback: true,
    stats: 'minimal'
  }
});
Run Code Online (Sandbox Code Playgroud)

小智 0

  1. 在带有 Ivy 的 Angular 9 中,不再有 ngfactory 文件,您应该删除 main-aot.ts 文件