【发布时间】:2020-09-09 07:30:47
【问题描述】:
我们最近在 app.module.ts 中遇到了奇怪的行为。我们使用 environment.ts 和 environemnt.prod.ts 文件在模块的导入数组中包含/排除特定库(库应该被排除在生产构建中)。它看起来像这样:
import { environment } from '../environments/environment'
//
@NgModule({
//
imports: [
CommonModule,
BrowserModule,
environment.production ? [] : libraryXXX,
HttpClientModule,
FormsModule
],
经过几天的调查后,我们发现 libraryXXX 每次都包含在构建中,即使带有 --prod 标志也是如此。我们测试了问题所在 - environment.ts/prod.ts 文件中的值被正确读取,但无论出于何种原因,比较总是返回 false。我的意思总是:将上面的片段替换为:
environment.production == true ? [] : libraryXXX
或
environment.production == false ? [] : libraryXXX
没有改变任何事情 - 图书馆总是包括在内。就像 if 语句被破坏了(?)。将其提取到变量并没有改变任何事情。我们最终做了半hacky的解决方案,比如:
环境.ts
import { libraryXXX } from 'whatever'
export const environment = {
production: false,
libraryXXX: libraryXXX
}
环境.prod.ts
export const environment = {
production: true,
libraryXXX: []
}
并简单地引用 app.module.ts 中的 environment.libraryXXX。但出于好奇 - 谁能向我解释为什么简单的 if 语句失败了?由于它是 app.module.ts 我无法调试它,甚至无法查看控制台输出,以了解发生了什么。有人有想法吗?
【问题讨论】:
-
条件语句和表达式肯定没有损坏。此外,您遇到的行为是可以预料的。编译器无法删除该库,因为它不知道生产标志的值在运行时将是什么。这不是条件捆绑的完成方式,您不能这样做
-
这应该可以。问题是,您是如何确定该库“始终包含”的?
-
@MikeOne 我们尝试简单地运行类似:“true ? [] : libraryXXX”和“false ? [] : libraryXXX”。不同之处在于输出文件。这个特定的库搞砸了捆绑文件。我们可以很容易地看到没有库的捆绑包工作正常,而带库的捆绑包被破坏了。因此,当离开上述任何类型的“if”语句时,构建总是一团糟。
-
好吧,尽管有这种情况,lib 仍然有一个导入。该语句只是阻止它在模块范围内导入。不过应该是树状的..除非那个模块有点狡猾..
标签: javascript angular typescript build environment