为什么 node.js 中的静态和动态导入以只读方式区别对待?

Why are static and dynamic imports in node.js treated differently wrt read-only?

为什么 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}

为什么这行得通?这不违反标准吗?

这个问题对于现在要做出的设计决定特别重要,恐怕最终节点也会将静态导入视为只读。

相同的分配适用于动态导入:

(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