【问题标题】:Angular2 AOT with Lazy loading Can't resolve [path to lazy module].ngfactory.ts具有延迟加载的 Angular2 AOT 无法解析 [延迟模块的路径].ngfactory.ts
【发布时间】:2017-03-16 18:38:26
【问题描述】:

我正在尝试将已经使用延迟加载模块的应用程序转换为 AOT。我正在使用 @ngtools/webpack 工具包编译 AOT 代码,但是我遇到了一个错误,即 Angular 无法找到看起来延迟加载的模块的代码。

ERROR in ./src/ngfactory async
Module not found: Error: Can't resolve '/Library/WebServer/Documents/envato-teams/src/ngfactory/src/app/components/container/projects.ngfactory.ts' in '/Library/WebServer/Documents/envato-teams/src/ngfactory'
@ ./src/ngfactory async
@ ./~/@angular/core/src/linker/system_js_ng_module_factory_loader.js
@ ./src/ngfactory/src/app/app.module.ngfactory.ts
@ ./src/main.aot.ts
@ multi main

在我的应用程序路由定义中值得一提的是,这个项目的模块是延迟加载的:

{
  path: 'projects', loadChildren: './components/container/projects#ProjectModule'
},

这是我的设置的样子:

tsconfig:

...
"angularCompilerOptions": {
  "genDir": "./src/ngfactory",
  "entryModule": "src/app/app.module#AppModule"
}
...

网页包:

new ngtools.AotPlugin({
    tsConfigPath: './tsconfig.aot.json',
}),

Main.aot.ts

/*
* Providers provided by Angular
*/
import { platformBrowser } from '@angular/platform-browser';
import { AppModuleNgFactory } from './ngfactory/src/app/app.module.ngfactory';

import { Servicesconfig } from './app/services/index';

platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);

在 webpack 中,我正在使用 @ngtools/Webpack 编译 ts 文件:

// Support for .ts files.
{
  test: /\.ts$/,
  loaders: ['@ngtools/webpack'],
  exclude: [/\.(spec|e2e)\.ts$/]
},

感谢您的帮助!

【问题讨论】:

  • 遇到同样的问题...到目前为止,没有找到修复...
  • 我目前在 Angular gitter chanel 中得到的答案是 AOT 和延迟加载不能很好地配合使用。尽管github.com/angular/angular-cli/commit/… 尚未合并,但很快就会修复它,但很快它应该会被发布并在@ngtools/webpack 中工作

标签: angular angular2-routing angular2-aot


【解决方案1】:

我一直在为 AOT 和延迟加载的模块而苦苦挣扎。

选择其中一个并不是产品构建的真正选择。

即使我真的需要这些功能,但我无法获得它们并不得不放弃。直到今天!

angular-cli 两天前发布:1.0.0-beta.21 支持 AOT 和延迟加载!

在你的 angular-cli 项目中:

npm cache clean  
npm install --save-dev angular-cli@latest  
ng init

享受吧!

PS : 非常感谢 angular-cli 团队在这里做了很棒的工作......!

编辑:
我做了一些基准测试:

+-----------------------+-------------+--------------+-----------+-------------+
|                       | Main bundle |   Chunk 0    | Scripting | First paint |
+-----------------------+-------------+--------------+-----------+-------------+
| ng serve              | 4.5 MB      | Not splitted | 6075 ms   | 5500+ ms    |
| ng serve --prod       | 334 KB      | Not splitted | 5587 ms   | 4750+ ms    |
| ng serve --aot        | 3.3 MB      | 326 KB       | 4011 ms   | 4400+ ms    |
| ng serve --prod --aot | 243 KB      | 18.1 Kb      | 3860 ms   | 4250+ ms    |
+-----------------------+-------------+--------------+-----------+-------------+

(结果不是很好,因为我打开了很多东西,3 个显示器,我的笔记本电脑很痛苦 ^__^)。

我们可以从中记住以下内容:
- --prod --aot 构建大小比--prod 构建
小27% - 在编写脚本时,--prod --aot 构建比--prod 构建快31%
- AOT 很酷!
- 可能存在没有aot 标志的错误,因为除非我错过了什么,否则我找不到我期望的延迟加载块,并且我在主包中找到了假定的延迟加载代码。我在 Github 上开了一个issue

【讨论】:

  • 谢谢。每个想法都对我有用,即使是延迟加载的模块也会按预期加载。
  • 如果您使用 npmjs.com/package/@ngtools/webpack 包,AOT 和延迟加载现在运行良好,就像我在之前的评论中提到的那样,这在我发布问题时已得到修复。
  • 您能否告诉我是否仍然需要遵循 The angular Cookbook:link 中概述的配置步骤?我还需要构建、引导模块工厂吗?你使用单独的 tsconfig,aot 吗?对于一个新的 cli 项目,ng build --prod 生成的大小与 ng build --prod --aot 的大小相同。我将 beta.30 用于 cli 和 angular 2.4.7。感谢您提供的所有重要信息。
  • 由于 beta 28 或 30 现在使用 --prod 构建时默认启用 AOT。所以ng build --prod --aotng build --prod 是一样的:)。尝试使用ng build --prod --no-aotng build --prod 你应该会看到不同。要知道您的项目是否使用 AOT 编译,只需查看您的 dist 并查看已编译的 JS。例如,如果您看到带有 ngFor 的模板,则它不是 AOT ;)
猜你喜欢
  • 2017-08-21
  • 2017-04-04
  • 1970-01-01
  • 2017-05-16
  • 2018-05-22
  • 1970-01-01
  • 2017-02-22
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多