繁体   English   中英

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

[英]Angular dead code of conditional provider in production bundle

我需要根据环境变量用模拟服务替换服务。 为此,我在我的模块中的提供程序区域中使用了 ?-operator,如下所示:

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

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

@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"
  },
  ...
],

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM