[email protected]の環境変数に基づいてインポートを条件付きで変更する方法はありますか?クライアントコードでサービスをインポートする方法でコードを変更する必要がない方法でそれを実行しようとしていますが、必要に応じて、模擬サービスでスワップするビルドフラグを指定できます。
この投稿 から使ってみたパターンがあります:
ファイル構造:
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は、providers
を構成するときに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
を注入できますが、開発ではモックを取得し、本番環境では実際のサービスを取得します。
関連項目:
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