1

我正在寻找此处列出的一些Angular 编译器选项的解释:

  • useDebug - 打开调试
  • useJit - 不清楚(仅在一处使用)
  • defaultEncapsulation - 设置默认样式封装
  • 提供者- 不是很清楚(ngModule 装饰器是否相同?)
  • missingTranslation - 如果缺少翻译键该怎么办
  • enableLegacyTemplate - 支持template标签(已弃用)
4

1 回答 1

11

使用Jit

是使用 codegen 还是解释模式。

Codegen是默认模式,所以我们可以在浏览器开发工具中看到输出。在这种模式下,角度将编译期间收集的所有语句转换为浏览器内存中具有可执行代码的文件。

我知道三个使用此选项的地方

解释模式意味着 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 运行updateDirectivesupdateRenderer等)并且每次都StatementVisitor将用于遍历所有语句。

最初解释模式也用于DART https://github.com/angular/angular/commit/2b34c88b69af8b0031fdb7006327bb8260e23dda#diff-ba3d6dc88c6e1cef871391a7843a614eR167但现在这种模式几乎不使用 AFAIK。


提供者

如果我们有两个具有相同令牌的提供者,则第二个提供者“获胜”

所以providers选项是一个很好的功能来覆盖默认的COMPILER_PROVIDERS

例如我们可以

1) 定制DomElementSchema

2)使用特定DirectiveResolver覆盖模板

3) 覆盖ResourceLoader

4) override ParserTemplateParser可视化编译器的工作

等等...

我们不能对 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了喷油器。

有关更多详细信息,请参阅设计文档:

于 2017-07-28T09:58:26.770 回答