Skip to main content

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の方が良い、 ということはありません。

ただ、手法として知っておくと良いでしょう。

参考