【问题标题】:angular-cli: Conditional Imports using an environment variableangular-cli:使用环境变量的条件导入
【发布时间】:2017-02-22 23:37:37
【问题描述】:

有没有办法根据 angular-cli@1.0.0-beta.16 中的环境变量有条件地更改导入?我正在尝试以一种不需要更改在客户端代码中导入服务的方式进行代码更改的方式来执行此操作,但是当需要时,我可以指定一个构建标志来交换模拟服务。

我尝试使用this post 中的一种模式:

文件结构:

MyService
    MyServiceMock.ts
    MyServiceReal.ts
    index.ts

在你的 index.ts 中,你可以有以下内容:

import { environment} from '../environments/environment';

export const MyService = environment.mock ?
    require('./MyServiceMock').MyServiceMock:
    require('./MyServiceReal').MyServiceReal;

然后在您的客户端代码中,导入 MyService:

import MyService from './myservice/index';

页面加载,我可以看到在单步执行代码时注入了依赖项,但是在 Cannot find name 'MyService' 的行中存在编译错误(我认为是 TypeScript 错误)。

【问题讨论】:

    标签: angular typescript webpack angular-cli


    【解决方案1】:

    你完全错了。当您配置 providers

    时,Angular 可以使用 factories 来处理这个用例
    providers: [
      Any,
      Dependencies
      {
        provide: MyService, 
        useFactory: (any: Any, dependencies: Dependencies) => {
          if (environment.production) {
            return new MyService(any, dependencies);
          } else {
            return new MockMyService(any, dependencies);
          }
        },
        deps: [ Any, Dependencies ]
    ]
    

    现在由于provide: MyService,您可以在任何地方注入MyService,但在开发中,您将获得模拟,在生产中您将获得真正的服务。

    另请参阅:

    【讨论】:

    • 这种方法效果很好,但有一个缺点,即模拟服务包含在生产包中
    • 以这种方式创建提供程序时,我究竟如何注入提供程序?通常我会从服务所在的文件中导入,但在这种情况下,它可以是两个文件之一。如何告诉 Angular 我想要提供的工厂函数中的提供者?
    • @Valevalorin 通过令牌(provide),即MyService。这就是你注入的东西。
    • 我需要具体了解以import 开头的行是什么样子的。
    • @Enargit 列出模块中的模拟和真实服务,然后在导入部分有条件地加载该模块。也看看,我从哪里得到这个答案:stackoverflow.com/a/51772549/2733437
    【解决方案2】:

    将您的 MyService 导入更改为:

    import { MyService } from './myservice/index';

    周围的{} 将告诉编译器从文件中导入单个导出。如果您希望能够像这样导入:

    import MyService from './myservice/index';

    那么你必须在index.ts中有一个默认导出,例如:

    export default MyService;

    更多关于 TypeScript 模块的信息可以在这里找到:https://www.typescriptlang.org/docs/handbook/modules.html

    【讨论】:

    • 感谢您的想法。我仍然遇到同样的错误,Cannot find name 'MyService'。还可能需要注意:VS Code 中打字稿的静态分析回显了相同的错误,表明导入正在解析,但是当尝试在构造函数中进行依赖注入时,它没有解析名称。
    猜你喜欢
    • 2018-11-14
    • 2017-01-27
    • 2019-04-27
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2017-05-11
    • 2020-11-11
    • 2013-01-11
    相关资源
    最近更新 更多