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