我在一个模块中有一组组件,在同一个项目中的不同模块下有一个示例应用程序。我有一个现有的JIT构建工作正常,我正在尝试过渡到AOT构建,我正在遇到问题。具体而言,/src/index.aot.ts (2,34): Cannot find module './aot/app/examples/app.module.ngfactory'
。
如何使用AotPlugin
设置webpack以正确构建我的应用程序的AOT版本到本地dist
目录?
/src/index.aot.ts
在此文件中,AppModuleNgFactory无法解析,因为它不存在。目前任何目录都没有生成任何内容,我不确定原因。
import 'core-js/client/shim';
import 'zone.js/dist/zone';
import '@angular/common';
import 'rxjs';
import {enableProdMode} from '@angular/core';
import {AppModuleNgFactory} from '../aot/app/examples/app.module.ngfactory';
import {platformBrowser} from '@angular/platform-browser';
enableProdMode();
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
/tsconfig.json
{
"compilerOptions": {
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false,
"typeRoots": [
"node_modules/@types/"
],
"target": "ES5",
"types": [
"node",
"jasmine",
"es6-shim"
]
},
"compileOnSave": false,
"filesGlob": [
"src/**/*.ts",
"src/**/*.tsx",
"!node_modules/**"
],
"exclude": [
"node_modules",
"dist/",
"**/*.spec.ts"
],
"angularCompilerOptions": {
"genDir": "aot/",
"skipMetadataEmit": true
}
}
webpack-dist.conf
...imports
module.exports = {
entry: {
app: './src/index.aot.ts'
},
module: {
loaders: [
{
test: /\.json$/,
loaders: [
'json-loader'
]
},
{
test: /\.(ttf|otf|eot|svg|png|jpg|woff(2)?)(\?[a-z0-9]+)?$/,
loader: 'file-loader'
},
{
test: /\.ts$/,
exclude: /node_modules/,
loader: 'tslint-loader',
enforce: 'pre'
},
{
test: /\.css$/,
loaders: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: 'css-loader?minimize!sass-loader!postcss-loader'
})
},
{
test: /\.scss$/,
loaders: ['raw-loader', 'sass-loader']
},
{
test: /\.ts$/,
exclude: /node_modules/,
loaders: [
'@ngtools/webpack'
]
},
{
test: /\.html$/,
loaders: [
'html-loader'
]
}
]
},
plugins: [
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
FailPlugin,
new HtmlWebpackPlugin({
template: conf.path.src('index.html')
}),
new webpack.ContextReplacementPlugin(
/angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
conf.paths.src
),
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"'
}),
new ExtractTextPlugin('index-[contenthash].css'),
new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}),
new webpack.LoaderOptionsPlugin({
options: {
postcss: () => [autoprefixer],
resolve: {},
ts: {
configFileName: 'tsconfig.json'
},
tslint: {
configuration: require('../tslint.json')
}
}
}),
new CopyWebpackPlugin([
{from: 'index.html'}
]),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery',
Tether: 'tether'
}),
new AotPlugin({
tsConfigPath: './tsconfig.json',
entryModule: './src/app/examples/index.ts#AppModule'
}),
new webpack.optimize.UglifyJsPlugin({
output: {comments: false},
compress: {unused: true, dead_code: true, warnings: false} // eslint-disable-line camelcase
})
],
output: {
path: path.join(process.cwd(), conf.paths.dist, 'aot'),
filename: '[name]-[hash].js'
},
resolve: {
extensions: [
'.webpack.js',
'.web.js',
'.js',
'.ts'
]
}
};
我错过了什么?为什么我需要引用index.aot.ts
等引导文件中不存在的文件?
完整错误输出:
ERROR in ~/work/project/src/index.aot.ts (2,34): Cannot find module './aot/app/examples/app.module.ngfactory'.
ERROR in Could not resolve "./src/app/examples/app.module" from "./src/app/examples/app.module".
ERROR in ./src/index.aot.ts
Module not found: Error: Can't resolve './aot/app/examples/app.module.ngfactory' in '~/work/project/src'
@ ./src/index.aot.ts 4:29-79
编辑:删除platformBrowser()和生成的导入后,我遇到了这个莫名其妙的错误:
ERROR in ./src/index.ts
Module not found: Error: Can't resolve './../$$_gendir/src/app/examples/app.module.ts.ngfactory'
答案 0 :(得分:1)
您不需要将以下内容放入main.ts
:
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
您必须在main.ts
中保留与非AOT构建相同的引导代码:
platformBrowserDynamic().bootstrapModule(AppModule)
Angular AOT加载器会在生成AOT构建时将代码重构为bootstrapModuleFactory
。见here in the sources。重要的是skipCodeGeneration
选项应为false
- 这是默认选项。