当前位置: 首页 > 知识库问答 >
问题:

CommonJs模块系统中Module.Exports和Exports的区别

谷梁驰
2023-03-14

在这个页面(http://docs.nodejitsu.com/articles/getting-started/what-is-require)中,它指出“如果您想将exports对象设置为函数或新对象,您必须使用Module.exports对象。”

我的问题是为什么。

// right
module.exports = function () {
  console.log("hello world")
}
// wrong
exports = function () {
  console.log("hello world")
}

I console.log结果(codeResult=require(example.js)/code>),第一个是 ,第二个是

请您解释一下背后的原因好吗?我在这里读了这篇文章:module.exports vs exports in node.js。它是有帮助的,但没有解释为什么它是那样设计的原因。出口的参考直接退回会不会有问题?


共有3个答案

冷宏茂
2023-03-14

还有一件事可能有助于理解:

null

this.add = function (a, b) {
    return a + b;
};

client.js

var math = require('./math');
console.log(math.add(2,2); // 4;

太好了,在这种情况下:

console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true

因此,默认情况下,“this”实际上等于module.exports。

但是,如果将实现更改为:

null

var add = function (a, b) {
    return a + b;
};

module.exports = {
    add: add
};

在这种情况下,它将正常工作,但是,“this”不再等于Module.Exports,因为创建了一个新对象。

console.log(this === module.exports); // false
console.log(this === exports); // true
console.log(module.exports === exports); // false

现在,require返回的是模块内部定义的。exports,而不是this或exports。

另一种方法是:

null

module.exports.add = function (a, b) {
    return a + b;
};

或者:

Math.js

exports.add = function (a, b) {
    return a + b;
};
韩鸿波
2023-03-14

Reneee的回答很好地解释了。给答案加上一个例子:

节点对您的文件做了很多事情,其中一个重要的是包装您的文件。在nodejs内部返回源代码“module.exports”。让我们退一步来理解包装器。我想你有

greet.js

var greet = function () {
   console.log('Hello World');
};

module.exports = greet;

上面的代码在nodejs源代码中包装为IIFE(立即调用的函数表达式),如下所示:

(function (exports, require, module, __filename, __dirname) { //add by node

      var greet = function () {
         console.log('Hello World');
      };

      module.exports = greet;

}).apply();                                                  //add by node

return module.exports;                                      //add by node

html" target="_blank">html" target="_blank">调用上面的函数(。apply())并返回module.exports。此时Module.exports和exports指向相同的引用。

现在,假设您将greet.js重新编写为

exports = function () {
   console.log('Hello World');
};
console.log(exports);
console.log(module.exports);

输出将为

[Function]
{}

原因是:Module.Exports是一个空对象。我们没有为Module.exports设置任何内容,而是设置exports=function()....在新的greet.js中。因此,Module.Exports为空。

从技术上讲,exports和module.exports应该指向相同的引用(这是正确的)。但我们在分配函数()...时使用“=”。导出,它将在内存中创建另一个对象。所以,module.exports和exports产生了不同的结果。当涉及出口时,我们不能推翻它。

现在,假设您重新编写(这称为突变)greet.js(指Renee答案)为

exports.a = function() {
    console.log("Hello");
}

console.log(exports);
console.log(module.exports);

输出将为

{ a: [Function] }
{ a: [Function] }

如您所见,module.exports和exports指向相同的引用,这是一个函数。如果您在exports上设置一个属性,那么它将在module.exports上设置,因为在JS中,对象是通过引用传递的。

结论是始终使用module.exports以避免混淆。希望这能帮上忙。快乐编码:)

锺超英
2023-03-14

null

var module = { exports: {} };
var exports = module.exports;

// your code

return module.exports;

如果您在 上设置一个属性,比如 ,那么它也会设置 ,因为对象在JavaScript中是作为引用传递的,这意味着如果您为同一个对象设置多个变量,那么它们都是同一个对象;因此 是同一个对象。br>但是如果将 设置为新对象,则它将不再设置为 ,因此 不再是同一个对象。

 类似资料:
  • 问题内容: 声明“如果要将导出对象设置为函数或新对象,则必须使用module.exports对象。” 我的问题是为什么。 我console.logged结果()和第一个是。 问题答案: 是具有属性的普通JavaScript对象。是一个普通的JavaScript变量,碰巧设置为。在文件末尾,node.js基本上将“返回”该函数。在Node中查看JS文件的一种简化方法是: 如果在上设置,如,该属性也会

  • 本文向大家介绍详解Node.js中exports和module.exports的区别,包括了详解Node.js中exports和module.exports的区别的使用技巧和注意事项,需要的朋友参考一下 今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了。 我们知道,node.js的模块暴露有两种方法。 1. 方式一:用exports

  • 本文向大家介绍详解Sea.js中Module.exports和exports的区别,包括了详解Sea.js中Module.exports和exports的区别的使用技巧和注意事项,需要的朋友参考一下 一、官方解释 exports require 从require导入方式去理解,关键有两个变量(全局变量module.exports,局部变量exports)、一个返回值(module.exports)

  • require 用来加载代码,而 exports 和 module.exports 则用来导出代码。 很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例: test.js var a = {name: 1} var b = a console.log(a) c

  • require 用来加载代码,而 exports 和 module.exports 则用来导出代码。 很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例: test.js var a = {name: 1}; var b = a; console.log(a)

  • 本文向大家介绍module.exports与exports的区别是什么?相关面试题,主要包含被问及module.exports与exports的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 exports 返回的是模块函数 module.exports 返回的是模块对象本身,返回的是一个类 使用上的区别是 exports的方法可以直接调用 module.exports需要new对象之后才