JavaScript(NodeJS)のDynamic Import
昨今のjsでpackageのimportと言えば、 jsファイルの最上位に次のような形式でmoduleをimportします。
import * as someModule from './dir/someModule.js';
これを、dynamic importする場合どの様になるか。
const someModule = import('./dir/someModule.js')
と、書きたいところだが、この場合someModuleにはPromiseが渡るので、 次のように書く。
(async () => {
const someModule = await import('./dir/someModule.js')
})();
具体例
これで目的は達成されるが、このような場面があるか? はい、あります。
たとえば、テスト実行前に、ライブラリのimportをする場合があります。 テスト戦隊として必要な場合もあれば、不必要な場合もあります。
例として、FirebaseのCloud Functionを挙げてみると、
requrie
を用いて書かれたテストで
var adminInitStub;
before(() => {
admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
// 省略
});
があります。これをES6で記述すると、
let adminInitStub;
before(async () => {
admin = await import('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
// 省略
});
となります。Nodeのバージョンによっては、
そのままrequire
を使ったほうが良い場合もあるので、全部が全部async/awaitの方が良い、
ということはありません。
ただ、手法として知っておくと良いでしょう。
参考