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