【问题标题】:Angular Compiler optionsAngular 编译器选项
【发布时间】:2017-08-19 16:03:37
【问题描述】:

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

  • useDebug - 打开调试
  • useJit - 不清楚(仅用于one place
  • defaultEncapsulation - 设置默认样式封装
  • providers - 不是很清楚(ngModule 装饰器也一样吗?)
  • missingTranslation - 策略如果缺少翻译键该怎么办
  • enableLegacyTemplate - 支持template 标签(已弃用)

【问题讨论】:

    标签: angular angular-compiler


    【解决方案1】:

    使用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) 覆盖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 注射器。

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

    【讨论】:

    • 非常感谢您提供如此详细的答复!几句话:“代码生成或解释性” - 仍然不清楚,对不起。 “我知道三个地方”——但这不是源代码。关于提供者:我认为我们可以对 ngModule 提供者做同样的事情,不是吗?
    • @StepanSuvorov 更新答案
    • @StepanSuvorov 你是对的。仅用于 jit 编译
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    相关资源
    最近更新 更多