生产包中条件提供程序的死代码



我需要根据环境变量用模拟服务替换服务。为此,我在模块的provider区域中使用了?-操作符,如下所示:

@NgModule({
imports: [
...
],
providers: [
...
environment.e2e ? { provide: MyService, useClass: MyServiceMock} : MyService
],
})
export class DemoModule {
}

此方法目前为止是有效的——如果'e2e'变量为真,则使用模拟,否则将加载实际服务。然而,这个解决方案有一个问题。如果我在生产模式下构建(e2e=false),那么mock的代码仍然包含在编译后的包中。我还尝试在可注入装饰器内通过工厂替换Service。使用此解决方案时,服务会以正确的方式被替换,但是mock会再次出现在生产包中。

@Injectable({
providedIn: 'root',
useFactory: (dep1, dep2) => environment.e2e ? new MyServiceMock(dep1, dep2) : new MyService(dep1, dep2),
deps: [dep1, dep2]
})
export class MyService {
...
}

有没有人知道我如何根据环境替换服务,并且模拟服务也不会在生产包中结束?

感觉像是运行时构建变量初始化的问题。如果您将environment.e2e更改为最终值,如truefalse,则它将按预期工作。

出于这个原因,我发现只有一个解决方案来防止在最终包中出现无用的代码:更改angular.json构建配置。您可以在这里进行文件替换,它可以根据需要工作:

"fileReplacements": [
{
"replace": "src/app/services/my-service.service.ts",
"with": "src/app/services/mocks/my-service-mock.service.ts"
},
...
],

相关内容

最新更新