使用 AoT 编译的 useFactory 与 useValue

useFactory vs useValue with AoT compilation

我使用 window.location 设置注射剂。 在我靠近导入的模块中,我定义了变量

const flag = window.location.search.includes('flag');
...
{ provide: FLAG, useValue: flag },

并且它在 JIT 编译中按预期工作 但是当我切换到 AoT 时它坏了 useFactory 在这两种情况下都有效

export function flagFactory() {
  return window.location.search.includes('flag');;
}
...
{ provide: FLAG, useFactory: flagFactory },

为什么 useValue 得到 undefineduseFactory 得到 true

我的猜测是 AoTNgModule 结构之外静态分析您的代码。所以它看到 window.location.search.includes 并提前执行。但是在编译时,这显然会returnundefined。在使用 factory 的情况下,它不会尝试提前执行正文,只会在 运行 时间执行。

这是 AOT 的(许多)陷阱之一。始终尝试让每个符号都可以静态分析