Почему статический и динамический импорт в node.js обрабатывается по-другому только для чтения?

#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