我正在寻找此处列出的一些Angular 编译器选项的解释:
- useDebug - 打开调试
- useJit - 不清楚(仅在一处使用)
- defaultEncapsulation - 设置默认样式封装
- 提供者- 不是很清楚(ngModule 装饰器是否相同?)
- missingTranslation - 如果缺少翻译键该怎么办
- enableLegacyTemplate - 支持
template
标签(已弃用)
是使用 codegen 还是解释模式。
Codegen是默认模式,所以我们可以在浏览器开发工具中看到输出。在这种模式下,角度将编译期间收集的所有语句转换为浏览器内存中具有可执行代码的文件。
我知道三个使用此选项的地方
模块工厂生成https://github.com/angular/angular/blob/4.3.x/packages/compiler/src/jit/compiler.ts#L146
ng:///AppModule/module.ngfactory.js
组件工厂生成https://github.com/angular/angular/blob/4.3.x/packages/compiler/src/jit/compiler.ts#L282
ng:///AppModule/Component_Host.ngfactory.js
ng:///AppModule/Component.ngfactory.js
.
styleUrls
代码生成https://github.com/angular/angular/blob/4.3.x/packages/compiler/src/jit/compiler.ts#L307
ng:///css/0app/app.css.ngstyle.js
解释模式意味着 Angular 将像解释器一样工作。前面步骤(词法分析、解析、语义分析、优化)中生成的语句将被直接执行。Angular 不像在 codegen 模式下那样将代码转换为组件和模块 ngfactories。相反,角度使用工厂的特殊包装,即
function _declareFn(
varNames: string[], statements: o.Statement[], ctx: _ExecutionContext,
visitor: StatementInterpreter): Function {
return (...args: any[]) => _executeFunctionStatements(varNames, args, statements, ctx, visitor);
}
然后它会在每次需要时执行这些包装器。(例如,当你处理事件时,当 Angular 运行updateDirectives
时updateRenderer
等)并且每次都StatementVisitor
将用于遍历所有语句。
最初解释模式也用于DART
https://github.com/angular/angular/commit/2b34c88b69af8b0031fdb7006327bb8260e23dda#diff-ba3d6dc88c6e1cef871391a7843a614eR167但现在这种模式几乎不使用 AFAIK。
如果我们有两个具有相同令牌的提供者,则第二个提供者“获胜”。
所以providers
选项是一个很好的功能来覆盖默认的COMPILER_PROVIDERS
例如我们可以
1) 定制DomElementSchema
2)使用特定DirectiveResolver
覆盖模板
3) 覆盖ResourceLoader
4) override Parser
,TemplateParser
可视化编译器的工作
等等...
我们不能对 NgModule 提供者做同样的事情,因为编译器使用专用的注入器(下图中的 JitCompiler 注入器) https://github.com/angular/angular/blob/4.3.x/packages/compiler/src/jit/compiler_factory .ts#L115和编译发生在https://github.com/angular/angular/blob/4.3.x/packages/core/src/application_ref.ts#L326-L329在@NgModule
提供者被解析之前https://github.com /angular/angular/blob/4.3.x/packages/core/src/application_ref.ts#L297
假设我们有这样的应用程序:
my-app
level1
level2
level3
然后依赖解析算法将如下所示:
如果我们对所有级别都使用延迟加载https://plnkr.co/edit/AYExeiYRSQ4H8LiQEgKo?p=preview
my-app
router-outlet
level1
router-outlet
level2
router-outlet
level3
它将被转换为
为了简化,我在图中省略router-outlet
了喷油器。
有关更多详细信息,请参阅设计文档: