#node.js #node-modules #es6-modules
#node.js #узлы-модули #es6-модули
Вопрос:
Почему бы node.js 15.4.0 по-разному относиться к статическому и динамическому импорту из-за их поведения только для чтения?
У меня есть файл test.mjs, который гласит
let a = {x: 1};
export default a;
Когда я использую это при динамическом импорте:
async function run () {
var m = await import ("./test.mjs");
m.d=45;
console.log (m);
}
run();
он жалуется, что объект не является расширяемым (и это соответствует моему прочтению стандарта, согласно которому импорт предоставляет привязки только для чтения).
Однако, когда я использую это статически, как в
import m from './test.mjs';
m.d = 44;
console.log (m);
это хорошо работает и выводит {x:1, d:44}
.
Почему это работает? Разве это не нарушает стандарт?
Вопрос имеет особое значение для принятия проектного решения, и я боюсь, что в конечном итоге node также будет обрабатывать статический импорт как доступный только для чтения.
Ответ №1:
То же самое назначение работает для динамического импорта:
(async function() {
const { default: m } = await import("./test.mjs");
// ^^^^^^^^^^^^^^
m.d = 45;
console.log(m);
})();
Вам нужно добавить свойство к экспортируемому по умолчанию объекту, а не к неизменяемому пространству имен.
Вы получите ту же ошибку при использовании импорта статического пространства имен:
import * as m from './test.mjs';
m.d = 44;
// ^ ReferenceError