`
hbthlw
  • 浏览: 1651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Node.js中的什么时候用module.exports,什么时候用exports,区别是什么

阅读更多
官方文档的一开头,给出的例子是这样的:
http://nodejs.org/api/modules.html
var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is ' + circle.area(4));

var PI = Math.PI;
exports.area = function (r) {
  return PI * r * r;
};

官方文档中的另一段话:
引用
As a guideline, if the relationship between exports and module.exports seems like magic to you, ignore exports and only use module.exports.
当你对module.exports和exports的关系感到困惑的时候,一直使用module.exports,并且忽略exports

于是问题出来了,module.exports是怎么回事儿?我们什么时候使用module.exports,什么时候使用exports呢?

如果你的模块属于“模块实例(module instances)”,就像官方文档中给出的示例那样,那么exports足以满足要求。

但是事实上,require()返回的是module.exports,exports只是module.exports的一个引用,exports的作用只在module.exports没有指定的时候,收集属性并附加到module.exports。
引用
The exports variable that is available within a module starts as a reference to module.exports.


你的模块总是返回module.exports,而不是exports。

module.exports = '孙悟空';
exports.name = function() {
    console.log('我是白骨精');
};

这个模块会完全忽略exports.name,因为module.exports被指定了另一个对象。你的模块不一定是模块实例(module instances),你的模块可以是任意的,你设置成module.exports的Javascript对象。如果你不显示的指定module.exports,那么返回的将是exports和exports附加的值。

也可以这样认为,一个模块刚开始的时候,module.exports和exports是一样的,exports只是module.exports的一个别名,两者都是{}。

当你给module.exports指定一个对象的时候,两者就不再一样的,而模块导出的一定是module.exports。

如果你想你的模块是指定的一种对象类型,那就使用module.exports,如果你想让你的模块是典型的模块实例,那就用exports就可以了。

下面介绍一种module.exports的典型用法,将模块导出来类或者对象。

在Javascript中创建对象有多种方式。
引用
《JavaScript高级程序设计(第3版)》第6章第2节

我们使用其中介绍的第三种方式——原型模式来创建一个对象

function Person(){
}
Person.prototype.sayName = function(){
    console.log('我叫唐僧');
};
module.exports = new Person();

在其他代码中require引用此模块时,将返回一个Person的对象,并调用其中的方法。
var person = require('./person');
person.sayName();

当然也可以用
module.exports = Person;
导出Person,在需要时候使用
var Person = require('./person');
var person = new Person();
person.sayName();

来创建对象。



尊重他人劳动成果,转载请注明作者和出处。
分享到:
评论

相关推荐

    node.js module

    7. **`exports` 与 `module.exports` 的区别**:虽然通常情况下两者可以互换使用,但当需要导出一个完整的对象或函数时,应优先使用 `module.exports`。因为如果 `exports` 被赋值为一个新对象,原来的 `module....

    pubdreamcc#Node.js#06.Node.js中module.exports和exports的区别1

    前言Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用。Node.js中只有模块作用域

    node.js最新手册

    2. **模块系统**:Node.js使用模块化设计,每个`.js`文件都可以视为一个模块,通过`require`和`exports`或`module.exports`来导入和导出模块。 3. **V8引擎**:Node.js使用Google的V8引擎,使得JavaScript的执行速度...

    Node.js硬实战 115个核心技巧.pdf

    书中会探讨`require`和`module.exports`的使用,以及如何自定义模块。 4. **文件系统(File System,简称FS)**:Node.js提供了丰富的文件系统API,如读写文件、创建删除目录等。书中会详细讲解这些API的用法,以及...

    Node.js 中文手册 中文文档 chm

    9. **错误处理**:Node.js 中错误处理是异步的,通常通过回调函数的错误参数或者使用 `try...catch` 结构来捕获错误。 10. **Promise 和 async/await**:Node.js 从 v6 版本开始支持 ES6 的 Promise,以及后来的 ...

    node.js实战(第2版)PDF&源码.zip

    2. **模块系统**:Node.js的模块化设计是其强大之处,学习CommonJS规范,require()和module.exports的使用,以及如何创建和使用自定义模块。 3. **文件系统操作**:Node.js提供了便捷的文件系统API,学习如何读写...

    Node.js 中文手册

    通过`require`函数,我们可以加载并使用其他模块,而通过`module.exports`或`exports`,我们可以导出模块中的功能供其他模块使用。 **4. 文件系统操作** Node.js 提供了一套丰富的文件系统API,允许开发者进行文件...

    node.js中module.exports与exports用法上的区别

    Node.js 引入了模块(Module)概念,一个模块可以通过module.exports 或 exports 将函数、变量等导出,以使其它 JavaScript 脚本通过require() 函数引入并使用。  module.exports 初始值为一个空对象 {},所以 ...

    package.json中main,module,exports三种方式的使用,自定义入口文件index.js

    综上所述,理解和正确使用`package.json`中的`main`、`module`和`exports`字段,以及自定义入口文件,对于构建高效、可维护的Vue.js项目至关重要。结合其他配置文件,我们可以构建出适应各种环境和需求的现代Web应用...

    Node.js-node.js中文资料导航

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够使用 JavaScript 来进行服务器端编程。这个"Node.js中文资料导航"可能是为了帮助中文用户更方便地学习和掌握 Node.js 相关的知识,提供了...

    Node.js基础开发指南.pdf 清晰中文完整版

    1. JavaScript在Node.js中的使用:Node.js遵循ECMAScript规范,但有一些特定的全局对象和模块,如process和module,需要了解它们的功能和用法。 2. 文件系统模块:Node.js内置了fs模块,用于进行文件和目录操作,如...

    Node.js初级+进阶

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它让JavaScript可以在服务器端执行,打破了JavaScript只能在浏览器中运行的传统。本教程旨在帮助初学者及有一定基础的学习者深入理解并掌握Node.js的核心概念...

    node.js源码 node-v21.0.0.tar.gz

    Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写程序,从而打破了JavaScript只能在浏览器中运行的传统。Node.js通过事件驱动、非阻塞I/O模型,使其轻量且高效,非常...

    详解nodejs中exports和module.exports的区别

    在Node.js模块化编程中,经常使用的两个核心概念是exports和module.exports。了解这两个概念的区别和使用场景对于编写可维护和可复用的Node.js代码非常关键。 首先,需要明确一点,exports和module.exports虽然看似...

    Node.js-Node.js编码风格指南

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它让开发者能够在服务器端使用JavaScript进行编程。"Node.js编码风格指南"旨在提供一套统一的代码编写规范,以提高代码的可读性、可维护性和团队协作效率。...

    Node.js入门经典源代码

    2. **模块系统**: Node.js使用CommonJS模块规范,通过`require`导入模块,`module.exports`或`exports`导出模块。在源代码中,你可以看到如何组织代码并实现模块化。 3. **文件系统操作**: Node.js提供了丰富的文件...

    详解Node.js中exports和module.exports的区别

    在Node.js中,模块的导出和导入是通过CommonJS规范实现的,而exports和module.exports则是实现模块导出的关键概念。虽然在日常开发中经常使用这两个概念,但很多开发者可能会忽视它们之间的区别,这可能会在模块的...

    node.js安装程序

    Node.js是一种开源、跨平台的JavaScript运行环境,它允许开发者在服务器端运行JavaScript代码,极大地扩展了JavaScript的应用范围。Node.js基于Chrome V8引擎,因此它具有高效的性能和丰富的库支持。在本压缩包中,...

    Node.js权威指南源代码

    2. **模块系统**:在chapter2中,可能涉及Node.js的模块系统,包括如何使用require()加载模块,以及exports和module.exports的区别,还可能涵盖CommonJS规范和npm(Node包管理器)的使用。 3. **网络编程**:...

Global site tag (gtag.js) - Google Analytics