Node.js module.export和export之间有什么区别

Node.js module.export和export之间有什么区别,node.js,Node.js,模块导出和导出之间有什么区别 如果module.export对象中存在某些属性,该怎么办 export.xx会无效吗?首先它是导出和模块。导出而不是导出和模块。导出(JavaScript中还有一个导出关键字,但在节点中还不支持) 每个节点模块都使用此函数包装: (function (exports, require, module, __filename, __dirname) { // Your module code actually lives in here }); 见: 您的模块

模块导出
导出
之间有什么区别

如果module.export对象中存在某些属性,该怎么办
export.xx
会无效吗?

首先它是
导出
模块。导出
而不是
导出
模块。导出
(JavaScript中还有一个
导出
关键字,但在节点中还不支持)

每个节点模块都使用此函数包装:

(function (exports, require, module, __filename, __dirname) {
  // Your module code actually lives in here
});
见:

您的模块不会像某些人所想的那样从该函数返回导出的对象。它只能通过向提供的参数添加属性来将数据传递给调用者

module.exports
exports
最初是同一对象——但如果它们最终不是同一对象,则实际导出的是
module.exports

这意味着这将起到同样的作用:

module.exports.x = 1;
# or:
exports.x = 1;
module.exports = {x: 1};
因为它改变了同一对象的属性

但是这个将不一样:

module.exports.x = 1;
# or:
exports.x = 1;
module.exports = {x: 1};
因此:

exports = {x: 1};
最后一个将不导出
x
,因为它将替换
导出
中的对象(原来是
模块.exports
相同的
对象),同时将
模块.exports中的默认空对象保留为实际导出

module.exports={x:1}也会替换一个新对象,但它会将其放在实际导出所需的位置。请注意,此指令
更改
模块
对象的属性
,调用者可以在包含模块的隐式函数返回后看到该属性

现在这就行了:

exports = {x: 1};
module.exports = exports;
因为它用一个新的对象替换了
exports
中的对象,但它也将其放入
module.exports

请记住,始终是
module.exports
在最后起作用。如果您没有用新对象替换其中一个,则可以在设置其属性时互换使用它们:

exports.x = 1;
module.exports.y = 2;
有关更多信息,请参阅以下答案:


  • 模块是对象,导出是模块对象的属性(变量)

    const module = { 
       //property
       exports: {} 
    }; 
    
    导出模块的快捷方式。导出直到为其分配新对象

  • 导出===module.exports
  • 出口!==模块.出口 导出属性完全被新对象替换


  • module.exports
    实际上是
    require
    函数返回的内容,当您将脚本路径传递给require函数时,您的代码将包装并运行在一个函数表达式中,该函数表达式包含一个名为
    exports
    的空对象参数,然后
    module.exports
    将传递给它。通常它是
    模块的简写。导出
    ,换句话说,它是指向内存中同一对象的两个变量,所以看起来很相似,对吗

    但实际上有一个区别,
    导出
    在某些模式中的行为不同,让我们举一个关于此类模式的示例,假设我们有一个名为tada.js的脚本:

    exports = function(){
        console.log('Tada');
    }
    
    console.log(exports);
    console.log(module.exports);
    
    如果我在app.js中需要此脚本:

    var tada = require('./tada');
    
    那你希望看到什么

    这将是输出:

    console.log(exports); // [Function]
    console.log(module.exports); // {}
    
    它显示
    导出为函数和
    模块。将
    导出为空对象。但是,正如我告诉你们的,这两个变量只是指向内存中同一个对象的两个变量,通过引用传递,所以它们不应该有相同的值吗?嗯,也许在任何其他语言中,它都会这样做,但在JavaScript中情况有点不同

    在JavaScript中,如果我们使用
    =
    赋值,它实际上会在内存中创建一个新对象,换句话说,在我们的示例中,
    导出
    模块之间引用
    。导出
    将中断,这意味着
    导出
    模块。导出
    最初指向内存中的相同对象,但当我们这样做的时候:

    exports = function(){
        console.log('Tada');
    }
    
    该引用已断开,现在导出的
    指向内存中的新对象

    还请记住,require函数只返回
    module.exports
    ,而不是
    exports
    ,因此在我们的示例中,
    module.exports
    的对象为空。exports
    在引用中断后,
    module.exports
    exports
    不再指向同一对象

    要解决这个问题,你需要改变而不是覆盖。因此,如果我们将示例更改为此,那么
    导出
    模块。导出
    将具有相同的值:

    exports.tada = function(){
        console.log('Tada');
    }
    
    console.log(exports);
    console.log(module.exports);
    

    此示例将解释所有:

    //第2.js页

     exports = () => { console.log("Foo") };
     module.exports = () => { console.log("Bar") };
    
    //app.js

      const myFunc = require("./page2");
      myFunc();    //output : Bar
    
      const myFunc = require("./page2");
      myFunc();    //output : Bar