Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.assign(module.exports,{…})与module.exports={…}_Javascript_Node.js_Commonjs - Fatal编程技术网

Javascript Object.assign(module.exports,{…})与module.exports={…}

Javascript Object.assign(module.exports,{…})与module.exports={…},javascript,node.js,commonjs,Javascript,Node.js,Commonjs,有人能举例说明module.exports={…}将如何导致意外行为吗 我在读你还不知道js我在 一些开发人员有替换默认导出的习惯 对象,如下所示: // defining a new object for the API module.exports = { // ..exports.. }; 这种方法有一些怪癖,包括意想不到的错误 如果多个这样的模块循环地相互依赖,则为。作为 因此,我建议不要替换对象。如果要分配 使用对象文字样式定义,可以同时进行多个导出 您可以这样做: Obj

有人能举例说明module.exports={…}将如何导致意外行为吗

我在读你还不知道js我在

一些开发人员有替换默认导出的习惯 对象,如下所示:

// defining a new object for the API
module.exports = {
    // ..exports..
};
这种方法有一些怪癖,包括意想不到的错误 如果多个这样的模块循环地相互依赖,则为。作为 因此,我建议不要替换对象。如果要分配 使用对象文字样式定义,可以同时进行多个导出 您可以这样做:

Object.assign(module.exports,{
   // .. exports ..
});
这里发生的事情是用 指定模块的公共API,然后指定Object.assign(..) 在现有数据库上执行所有这些属性的浅层复制 导出对象,而不是替换它,这是一个很好的平衡 方便和安全的模块行为


exports
对象是在模块运行之前为您的模块创建的,如果存在循环依赖项,则其他模块可能在您的模块可以填充该默认对象之前可以访问该对象。如果替换它,它们可能拥有旧的原始对象,并且(最终)看不到您的导出。如果您添加到它,那么即使该对象最初没有您的导出,最终它也将拥有它,即使其他模块在这些导出存在之前访问了该对象

更多信息,请参阅CJS模块文档的第页

我们可以调整该部分中的循环示例来演示:

a.js
(注意更改):

b.js
(未更改):

main.js
(未更改):

当您运行该命令时:

main starting a starting b starting in b, a.done = undefined b done in a, b.done = true a done in main, a.done = undefined, b.done = true (node:2025) Warning: Accessing non-existent property 'done' of module exports inside circular dependency (Use `node --trace-warnings ...` to show where the warning was created) 主起动 起点 b开始 在b中,a.done=未定义 b完成 在a中,b.done=true 完成 在main中,a.done=undefined,b.done=true (节点:2025)警告:访问循环依赖项内不存在的模块导出属性“done” (使用`node--trace warnings…`显示警告的创建位置)

旁注:JavaScript自己的模块系统(ESM)处理周期的方式不同,并且由于没有
导出
等效对象(您可以访问;在概念上有),因此不会出现此问题。我建议尽可能使用ESM。Node.js自v12以来一直以相当稳定的方式(尽管仍在发展)支持它。

在模块运行之前为您的模块创建
导出
对象,并且如果存在循环依赖项,则在您的模块填充之前,其他模块可能可以访问该默认对象。如果替换它,它们可能拥有旧的原始对象,并且(最终)看不到您的导出。如果您添加到它,那么即使该对象最初没有您的导出,最终它也将拥有它,即使其他模块在这些导出存在之前访问了该对象

更多信息,请参阅CJS模块文档的第页

我们可以调整该部分中的循环示例来演示:

a.js
(注意更改):

b.js
(未更改):

main.js
(未更改):

当您运行该命令时:

main starting a starting b starting in b, a.done = undefined b done in a, b.done = true a done in main, a.done = undefined, b.done = true (node:2025) Warning: Accessing non-existent property 'done' of module exports inside circular dependency (Use `node --trace-warnings ...` to show where the warning was created) 主起动 起点 b开始 在b中,a.done=未定义 b完成 在a中,b.done=true 完成 在main中,a.done=undefined,b.done=true (节点:2025)警告:访问循环依赖项内不存在的模块导出属性“done” (使用`node--trace warnings…`显示警告的创建位置)

旁注:JavaScript自己的模块系统(ESM)处理周期的方式不同,并且由于没有
导出
等效对象(您可以访问;在概念上有),因此不会出现此问题。我建议尽可能使用ESM。Node.js自v12以来一直以一种相当稳定(尽管仍在发展)的方式支持它。

不幸的是,他没有包括一个演示问题的示例。不幸的是,他没有包括一个演示问题的示例。如果你想知道循环如何在ESM(而不是CJS)中工作,我在新书的第13章中对它进行了深入的探讨;如果您感兴趣,请访问我个人资料中的链接。不知道您写了这本书,请购买。如果您对ESM(而不是CJS)中的循环工作方式感到好奇,我将在新书第13章中对其进行深入探讨;如果你对我的个人资料感兴趣,请在我的个人资料中添加链接。如果你不知道这本书是你写的,你必须购买它。
console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done);
main starting a starting b starting in b, a.done = undefined b done in a, b.done = true a done in main, a.done = undefined, b.done = true (node:2025) Warning: Accessing non-existent property 'done' of module exports inside circular dependency (Use `node --trace-warnings ...` to show where the warning was created)