Каков эффект ключевого слова await при импорте модулей ESM
Документация по криптовалютному модулю Node.js docs использует верхний уровень
await
для импорта, но это явно не динамический импорт
В чем разница между двумя приведенными ниже утверждениями (похоже, они делают то же самое)
import * as fs from 'fs'
const fs_ = await import('fs'); // why use this?
1 ответ
[Не повторяется]
- Await импортирует модуль EC статически (вместо
import()
импортирует динамически), он очень похож на модуль CommonJSrequire()
синтаксис, это единственная цель ключевого слова await верхнего уровня
Поддерживается: (node.js 14.8.0) (chrome 89) (Firefox 89) на момент написания этого
- Так зачем его использовать, если у нас уже есть все эти прекрасные синтаксисы статического импорта? (нравиться:
import * as imp from './someModule.mjs
) - Ну, это проще написать и легче запомнить (например:
await import('./someModule.mjs')
статически требует 'someModule' и возвращает его экспортированные данные как{default:'someDefVal'[, ...]}
объект
// static import -----------------------------------// blocks this module untill './module1.mjs' is fully loaded
// traditional static import in EC modules
import * as imp from './module1.mjs';
console.log( imp ); // -> {default:'data from module-1'}
// static import with await import() (does the same as above but is prettier)
console.log( await import('./module1.mjs') ); // -> {default:'data from module-1'}
function importFn1(){ // the await import() is a satic import so cannot be used in a function body
// await import('./module1.mjs'); // this would throw a SyntaxError: Unexpected reserved word
}
// dynamic import ----------------------------------// does not block this module, the './module2.mjs' loads once this module is fully loaded (not asynchronous)
import('./module2.mjs')
.then((res)=>{ console.log(res) }) // -> {default:'data from module-2'}
.catch((err)=>{ console.log(err) });
(function ImporFn2(){
import('./module2.mjs') // dynamic import inside a function body
.then((res)=>{ console.log(res) }) // -> {default:'data from module-2'}
.catch((err)=>{ console.log(err) });
})();
console.log( '----- MAIN MODULE END -----' );
- результат в консоли
{ default: 'data from module-1' }
{ default: 'data from module-1' }
----- MAIN MODULE END -----
{ default: 'data from module-2' }
{ default: 'data from module-2' }