【问题标题】:Angular 2 / 4 / 5 - Ahead-of-time compilation how toAngular 2 / 4 / 5 - 提前编译如何
【发布时间】:2016-12-20 07:23:12
【问题描述】:

我正在尝试按照本指南引导我的 Angular 2 RC5 应用程序 https://angular.io/docs/ts/latest/guide/ngmodule.html 下面是我的代码

import { AppModuleNgFactory } from './app.module.ngfactory';
import {platformBrowser} from "@angular/platform-browser";

platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);

但是,当我尝试编译 typescript 代码时,出现以下错误

app\main.ts(1,36): 错误 TS2307: 找不到模块 './app.module.ngfactory'.

如何生成 app.module.ngfactory 文件?我应该使用哪个工具?

【问题讨论】:

  • 对于准系统解决方案 github.com/blacksonic/angular2-aot-webpack ,以及使用 Webpack 插件的替代方案(无需修改入口点)github.com/blacksonic/angular2-aot-cli- webpack-plugin(内部使用插件 og Angular CLI)

标签: angular typescript


【解决方案1】:

JIT 和 AOT 编译器都从相同的 AppModule 源代码生成 AppModuleNgFactory 类。

JIT 编译器在内存中和浏览器中动态创建该工厂类。 AOT 编译器将工厂输出到一个物理文件中,我们在此处以静态版本的 main.ts 导入该文件

在高层次上,@angular/compiler-cli 提供了一个围绕 Typescript 的 tsc 编译器的包装器,并且 AoT 都会编译您的应用程序代码,然后将您应用程序的 Typescript 转换为 Javascript:

$ ngc -p src

这会为每个组件和模块生成一个新文件(称为 NgFactory

要在 AoT 模式下运行您的应用, 所需要的只是更改您的 main.ts 文件

import {platformBrowserDynamic} from ‘@angular/platform-browser-dynamic’
import {MyAppModule} from ‘./app’
platformBrowserDynamic().bootstrapModule(MyAppModule);

import {platformBrowser} from ‘@angular/platform-browser’
import {MyAppModuleNgFactory} from ‘./app.ngfactory’ //generated code
platformBrowser().bootstrapModuleFactory(MyAppModuleNgFactory);

编辑:

要使用ngc命令,首先安装这些-

$ npm install @angular/compiler-cli typescript@next @angular/platform-server @angular/compiler

ngctsc 的直接替代品,您可以在./node_modules/.bin/ngc 文件夹中找到它。

【讨论】:

  • 你知道如何安装ngc吗?似乎 -p 用于打字稿配置文件而不是源代码文件夹?
  • @ToanNguyen 检查我的编辑答案。有关更多详细信息,请参阅此链接上的安装和使用部分 - github.com/angular/angular/tree/master/modules/%40angular/…
  • 运行 ngc 时,它不会生成 .ngfactory 文件,而是只生成 .metadata.json 文件。
  • 我发现了这个:github.com/angular/angular/issues/10792。许多用户报告说 ngc 不能在 Windows 上运行。
  • @Sanket 我不清楚您回答中的事件顺序。在运行ngc 之前是否修改了main.ts?如果是这样,您会收到有关不存在的MyAppModuleNgFactory 的错误。另一方面,在运行ngc 之后是否修改main.ts?如果是这样,Javascript 文件将不会反映新的main.ts。我陷入了循环引用逻辑
【解决方案2】:

2017 年更新

截至 2017 年 1 月 如果使用 angular-cli,AOT 编译现在是运行以下命令 ng build --prod 时的默认编译方法,无需更改代码。

如果您想禁用 AOT 而在生产中使用 JIT,那么您可以使用 ng build --prod --no-aot

来源:https://github.com/angular/angular-cli/issues/4138


这意味着您仍然可以在使用 ng build 进行开发时使用 JIT 编译(编译速度更快,非常方便),并将您的 .ts 保留为如下所示:

// The browser platform with a compiler
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

// The app module
import { AppModule } from './app/app.module';

// Compile and launch the module
platformBrowserDynamic().bootstrapModule(AppModule);


总结:
ng build                    // build with JIT
ng build --prod --no-aot    // build with JIT 
ng build --prod             // build with AOT

【讨论】:

  • 如何使用 Webpack 进行配置?
  • @Atieh 你指的是什么?
  • @Zze 这是否意味着我们不必使用角度文档angular.io/guide/aot-compiler#compile-with-aot 中提到的这些步骤来实现aot?我找不到任何关于此的明确声明。你能指出我的细节吗?提前致谢!
  • @AshwiniMaddala 我同意这有点矛盾。您确实必须编辑.tsconfig。 angular-cli 为你处理这个过程。 “AoT 编译是一种很好的技术,它已经集成为 angular-seed 和 angular-cli 的一部分” - blog.mgechev.com/2016/08/14/…
猜你喜欢
  • 2017-03-17
  • 2017-12-10
  • 2018-09-07
  • 2018-06-28
  • 2018-02-07
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多