2017-12-01 3 views
1

このような状況があります。動的な理由は、特定のコマンドラインタスクを実行するためにロードする必要があるコードの量を10倍にするのを防ぐためです。私は動的ロードのインポートコールをしようとした場合プロミスを使用しないダイナミックタイプスクリプトのインポート

if (diagnostics) { 
    require('./lib/cli-commands/run-diagnostics').run(sumanOpts); 
} 
else if (script) { 
    require('./lib/cli-commands/run-scripts').run(sumanConfig, sumanOpts); 
} 
else if (tscMultiWatch) { 
    require('./lib/cli-commands/run-tscmultiwatch').run(sumanOpts); 
} 
else if (repair) { 
    require('./lib/cli-commands/run-repair').run(sumanOpts); 
} 
else if (postinstall) { 
    require('./lib/cli-commands/postinstall').run(sumanOpts); 
} 
else{ 
    // etc etc 
} 

、私はこれを取得:

enter image description here

は、明確にPromiseないmodule.exports値を返すために起こっています。

動的インポート構文を非同期ロードなしで使用する方法はありますか?

+0

基本的に私は "非同期動的インポート"の代わりに "同期動的インポート"を探しています –

+0

実際にはすべてを含むだけでパフォーマンスが低下していることに気が付きましたか? – JLRishe

+0

@JLRisheヒットがありますが、小さくても、たくさんのファイルが読み込まれ、ログに記録されたくないものがログに記録される可能性があります。 –

答えて

2

Unionalの正解に追加するだけで、Promiseの動的インポート構文を返すことで非常に簡単に作業できます。

(async function() { 
    if (diagnostics) { 
    const run = await import('./lib/cli-commands/run-diagnostics'); 
    run(sumanOpts); 
    } 
    else if (script) { 
    const run = await import('./lib/cli-commands/run-scripts'); 
    run(sumanConfig, sumanOpts); 
    } 
}()); 

あなたが--module commonjsモジュールを使用している場合、それはおそらく最高の必要に固執するであることに注意してください。しかし、上記は--module amd--module system、もちろん--module esnextには完璧です。

+1

はい私は率直に言って、なぜダイナミック*同期*インポートをサポートできないのか分かりませんが、TSがTSを遵守しなければならないという制限があると思います –

+1

はい、それは良い制限です。動的な同期インポートが必要です。私はむしろトップレベルの 'await'構造を見たいと思います。しかし、やはり、ランタイムは、ノード追加のような特別な機能を追加することができるので、問題はありません。 –

2

動的インポートの性質上、非同期です。

require()はサーバー側に存在するため同期しています。たとえば、fs.readFileSync()を使用してファイルを同期して読み取ることができます。

新しい動的インポートでは、クライアント側で動作するように設計されているため、サーバーにインポートを実行するためのajax要求が返されます。

したがって、非同期である必要があります。

+0

この回答を受け入れるには –

+3

なぜ非同期にしたくないのですか?プロミスの構文に満足していないのですか? – unional

関連する問題