2016-03-10 15 views
5

TypeScript'te yazılan node.js uygulamasına sahibim ve yapılandırma dosyasına göre iki arabirim uygulaması arasında geçiş yapmam gerekiyor. Şu anda çalışıyor gibi görünen bu kod var.Uygulama değiştirmek için koşullu içe aktarma

"use strict"; 

import { config } from "../config"; 

let Something; 
if (config.useFakeSomething) { 
    Something = require("./FakeSomething").FakeSomething; 
} else { 
    Something = require("./RealSomething").RealSomething; 
} 
... 
let s = new Something(); 
s.DoStuff(); 
... 

Ama kötü bağırsağı (karıştırma yükleme modülleri için ve ithalat gerektiren başlıca nedeniyle) bu konuda duygu var. Her iki modülü de içe aktarmadan yapılandırma dosyasına dayalı uygulama geçişini gerçekleştirmenin başka bir yolu var mı?

cevap

2

Yaklaşımınızla ilgili yanlış bir şey göremiyorum.

const config = require('../config'); 

yüzden etkili bir aynıdır ve farklı modül yükleme teknikleri karıştırma değildir:

import { config } from "../config"; 

gibi aslında satırlarda hedefleme commonjs aşağıdaki javascript (ES6) için derlenmiş olacak zaman.

0

Something sınıfınızın istemci kodunu temiz tutmak isterseniz, koşullu içe aktarmayı tek bir dosyaya taşıyabilirsiniz. Eğer bir şey modülü için aşağıdaki dizin yapısına sahip olabilir:

import { config } from '../config'; 

const Something = config.useFakeSomething ? 
    require('./FakeSomething').FakeSomething : 
    require('./RealSomething').RealSomething; 

export default Something; 

Ve müşteri kodunuza

, sadece Something alabilirsiniz:
/Something 
    RealSomething.ts 
    FakeSomething.ts 
    index.ts 

Ve index.ts içinde

, aşağıdakilere sahip olabilir :

import Something from './Something/index'; 
+0

Ama bu her zaman her iki modülleri yükleyecektir, böyle olmaz? RealSomething modülünü dev ortamına yükleyemiyorum çünkü orada olmayan özel donanımı başlatıyor. –

+0

Evet, haklısın. Cevabımı güncelleyeceğim. Bu dinamik davranışı desteklemek için bir TypeScript modülü içinde yanlış bir şey olduğunu düşünmüyorum. Farklı bir modül yükleyiciye geçtiğinizde sorun ortaya çıkacaktır, ancak bu sık olmamalıdır. –

0

böyle yapabilirsiniz:

let moduleLoader:any; 

if(pladform == 1) { 
    moduleLoader = require('./module1'); 
} else { 
    moduleLoader = require('./module2'); 
} 

ve sonra

if(pladform === 1) { 
    platformBrowserDynamic().bootstrapModule(moduleLoader.module1, [ languageService ]); 
} 
else if (pladform === 2) { 
    platformBrowserDynamic().bootstrapModule(moduleLoader.module2, [ languageService ]); 
} 
İlgili konular