Angular _为什么AoT会删除此值?

Angular _为什么AoT会删除此值?,angular,Angular,我有一个带有环境变量的angular 5项目。。我在环境/文件夹中使用了一个common.ts文件,如下所示: 环境产品 使用--prod构建会导致公共值未定义(这非常明显,因为来自公共的environment.startupProject属性定义了应用程序路由中的默认路由),但我们发现这很奇怪,因为我们可以在编译的javascript中看到Object.assign,并且它的值在那里: 在主道深处的某个地方 它被定义了!它只是从environment.prod本身的上下文中没有定义 如果我使

我有一个带有环境变量的angular 5项目。。我在环境/文件夹中使用了一个common.ts文件,如下所示:

环境产品 使用
--prod
构建会导致公共值未定义(这非常明显,因为来自公共的environment.startupProject属性定义了应用程序路由中的默认路由),但我们发现这很奇怪,因为我们可以在编译的javascript中看到Object.assign,并且它的值在那里:

在主道深处的某个地方 它被定义了!它只是从environment.prod本身的上下文中没有定义


如果我使用调试器并打开sourcemaps,然后在environment.prod中的环境对象初始化时设置断点,我可以看到common(或者更确切地说,它的基础uglified变量)实际上是未定义的。所以我猜上面的那个片段,实际上并没有执行。至少在我们的routes模块中访问环境之前并没有。显然,在某个地方,同样代码的另一个副本也在生成,并且它正在运行那个副本。坦白说,这让我觉得AoT做得不是很好

这几乎就像是在我们的项目中嵌入了一点遗留下来的树抖动,其行为与编译期间发生的树抖动不同

为什么会发生这种情况

更糟糕的是,我无法用任何常规方法修复它:

避免导出默认值没有任何作用

将其转换为类并添加到应用程序模块不起作用!:

@Injectable()
export class Common {
  static startupProject = '/dashboard';
}

//... and in app.module
...
providers: [
  Common,
...

//... then in environment.prod:
import { Common as common } from ...

export environment: any = {
  ...common, // this works without --prod, of course, but not with it
}
上述两种方法,再加上将文件夹
common/
迁移到
app/
下,也不起作用

避免像
Object.assign({},common,{/*…env…*/})这样的splat操作符。。。这也行不通

将值指定给
(窗口如有)。common
不起作用(这已被规定为在角度报告中防止树在答案中晃动的一种方法)。事实上,即使我也使用
…(window as any).common,
而不是环境中导入的副本,这仍然不起作用


除了关闭AoT之外,还有什么方法可以让它正常工作,这样我们就不必保留信息的副本了吗?到底是怎么回事——为什么文件存在于编译后的JS输出中,但在运行时它仍然是未定义的?

如果查看angular.json,您会发现这样的配置

"fileReplacements": [
      {
        "replace": "src/environments/environment.ts",
        "with": "src/environments/environment.prod.ts"
      }
    ],

witch丢弃了你的environment.ts,而是用environment.prod.ts构建你的应用程序。要解决您的问题,我想您只需要从配置中删除“fileReplacements”部分

如果我不清楚,很抱歉。这在environment.prod.ts文件中。但是请注意,我文章中的第二个片段一直清楚地显示common.ts的内容在编译代码的该位置与环境文件的内容合并,所以我不知道你为什么认为这是答案。你能检查一下是aot还是更简洁的优化,这会破坏你的配置吗?尝试ng发球——aot;或者ng serve--prod--optimization=false和ng serve--prod--aot=falsesure,这是一个好主意:)
ng serve--aot
会产生相同的错误(与
--optimization=false
组合时也是如此)。同样地,
ng serve--prod--aot=false继续表现出相同的行为。。。我不确定“错误”开关是否能按您希望的方式工作<代码>ng serve--env=prod--optimization=true
有效。我必须注意的是,aot触发了这个问题,但它并没有从编译后的代码中剥离公共文件,正如我在文章中的代码片段所示。我认为这只是我在以下方面的一个输入错误:
ng serve--prod--aot=false
。。我刚刚重做了它,它正在工作,其余部分仍如报告所示
环境.prod.ts
环境.ts
通用方面有什么区别?没有什么。它们在前几行中是相同的。我们有一个公共文件的原因是,我们不想在每个文件中设置相同的变量,而是希望避免重复,只需设置一次
"fileReplacements": [
      {
        "replace": "src/environments/environment.ts",
        "with": "src/environments/environment.prod.ts"
      }
    ],
@Injectable()
export class Common {
  static startupProject = '/dashboard';
}

//... and in app.module
...
providers: [
  Common,
...

//... then in environment.prod:
import { Common as common } from ...

export environment: any = {
  ...common, // this works without --prod, of course, but not with it
}
"fileReplacements": [
      {
        "replace": "src/environments/environment.ts",
        "with": "src/environments/environment.prod.ts"
      }
    ],