`
天梯梦
  • 浏览: 13732941 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

Node.js: exports 和 module.exports 的区别

 
阅读更多

我理解的exports 和 module.exports 的区别,欢迎大家吐槽~

为了更好的理解 exportsmodule.exports 的关系,我们先来补点 js 基础。示例:

 

app.js

var a = {name: 'nswbmw 1'};
var b = a;

console.log(a);
console.log(b);

b.name = 'nswbmw 2';
console.log(a);
console.log(b);

var b = {name: 'nswbmw 3'};
console.log(a);
console.log(b);

 

运行 app.js 结果为:

D:\>node app
{ name: 'nswbmw 1' }
{ name: 'nswbmw 1' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 3' }

D:\>

 

解释一下:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一个对象,即 a 和 b 指向同一块内存地址,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当对 b 完全覆盖时,b 就指向了一块新的内存地址(并没有对原先的内存块作修改),a 还是指向原来的内存块,即 a 和 b 不再指向同一块内存,也就是说此时 a 和 b 已毫无关系,所以最后两个输出不一样。

明白了上述例子后,我们进入正题。 我们只需知道三点即可知道 exportsmodule.exports 的区别了:

  1. exports 是指向的 module.exports 的引用
  2. module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
  3. require() 返回的是 module.exports 而不是 exports

所以:

我们通过

  var name = 'nswbmw';
  exports.name = name;
  exports.sayName = function() {
    console.log(name);
  }

 

exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:

  var name = 'nswbmw';
  module.exports.name = name;
  module.exports.sayName = function() {
    console.log(name);
  }

 

我们通常这样使用 exportsmodule.exports

一个简单的例子,计算圆的面积:

 

使用 exports

app.js

  var circle = require('./circle');
  console.log(circle.area(4));

 

circle.js

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

 

使用 module.exports

app.js

  var area = require('./area');
  console.log(area(4));

area.js

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

 上面两个例子输出是一样的。你也许会问,为什么不这样写呢?

 

app.js

  var area = require('./area');
  console.log(area(4));

 

area.js

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

 

运行上面的例子会报错。这是因为,前面的例子中通过给 exports 添加属性,只是对 exports 指向的内存做了修改,而

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

 

其实是对 exports 进行了覆盖,也就是说 exports 指向了一块新的内存(内容为一个计算圆面积的函数),也就是说 exportsmodule.exports 不再指向同一块内存,也就是说此时 exportsmodule.exports 毫无联系,也就是说 module.exports 指向的那块内存并没有做任何改变,仍然为一个空对象 {} ,也就是说 area.js 导出了一个空对象,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function 的错误。

 

所以,一句话做个总结:当我们想让模块导出的是一个对象时, exportsmodule.exports 均可使用(但 exports 也不能重新覆盖为一个新的对象),而当我们想导出非对象接口时,就必须也只能覆盖 module.exports

 

我们经常看到这样的用写法:

exports = module.exports = somethings

 

上面的代码等价于

  module.exports = somethings
  exports = module.exports

 

原因也很简单, module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exportsexports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exportsexports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports

原文:https://cnodejs.org/topic/5231a630101e574521e45ef8

 

实例:

 

exports

 

app.js

var iKeepStudying = require('ikeepstudying'); //注意路径
iKeepStudying.echo('this is my testing !');

 

 

ikeepstudying.js

exports.echo = function(words){ console.log(words); };

 

 

module.exports

 

app.js

var iKeepStudying = require('ikeepstudying'); //注意路径
iKeepStudying('this is my testing !');

 

 

ikeepstudying.js

 

module.exports = ikeepstudying;

function ikeepstudying(words)
{
    console.log(words);
}

 

 

另外module.exports还可以到处类:

 

app.js

var iKS = require('ikeepstudying'); // 注意路径
var gd  = new iKS();
gd.echo('this is my testing !');
gd.echo(gd.current_dir_name);

 

 

ikeepstudying.js

 

module.exports = ikeepstudying;

function ikeepstudying()
{
    console.log('hello...');
}

ikeepstudying.prototype.echo             = function(words){ console.log(words); };
ikeepstudying.prototype.current_dir_name = __dirname;

 

 

 

原文转自:Node.js: exports 和 module.exports 的区别

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Node.js: JavaScript based framework. Easy Guide Book

    Node.js: JavaScript based framework. Easy Guide Book by Rick L. English | April 13, 2016 | ASIN: B01E8KVNVW | 75 Pages | AZW3/MOBI/EPUB/PDF The following topics are discussed in this book:  A ...

    node.js module

    Node.js 模块是构成 Node.js 应用程序的基础组件,它们允许开发者通过导入和导出来组织和重用代码。Node.js 的模块系统是其强大功能之一,它遵循 CommonJS 规范,使得代码可以模块化,提高了代码的可读性和可维护性...

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

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

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

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

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

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

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

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

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

    对于Vue.js项目,尤其是由`@vue/cli`生成的Vue3项目,`package.json`中的`main`、`module`和`exports`字段用于指定不同环境下的入口文件,这有助于优化加载和打包过程。本文将深入探讨这三种方式的使用以及如何...

    node.js最新手册

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

    node.js安装包集成版本

    2. 模块系统:Node.js使用CommonJS模块规范,通过`require`引入模块,`module.exports`或`exports`导出模块。 3. 文件和流:Node.js的fs模块提供了对文件系统的操作,流模块则可用于高效地处理大文件和网络数据。 4....

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

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

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

    了解CommonJS规范,以及如何使用require和module.exports来导入和导出模块,是深入学习Node.js的必经之路。 五、Node.js进阶 1. Express框架:Express是基于Node.js的最流行的Web应用框架,简化了路由、中间件和...

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

    当你在文件中使用`require('some_module')`时,Node.js会返回该模块的导出对象,这个对象是`module.exports`的值。 `module.exports`是每个模块都有的一个全局变量,它的初始值是一个空对象`{}`。这个对象用于存放...

    Node.js-基于nodemongodbexpressejs技术栈搭建的一套完整功能的后台管理系统

    - CommonJS模块化:Node.js使用CommonJS规范,通过`require`导入模块,`module.exports`或`exports`导出模块。 - 文件系统操作:Node.js内置文件系统模块,方便进行文件读写和目录管理。 - HTTP服务器:Node.js...

    Node.js API详解之 module模块用法实例分析

    总的来说,Node.js的`module`模块是其模块系统的核心,它使得代码组织和复用变得简单高效,同时也提供了诸如`require()`、`exports`、`module.exports`等工具,以及`__filename`和`__dirname`这样的便利变量,以支持...

    Node.js-Nodejs学习笔记以及经验总结

    1. CommonJS:Node.js的模块系统遵循CommonJS规范,通过`require`引入模块,`module.exports`或`exports`导出模块。 2. Node.js内置模块:如fs(文件系统)、http(HTTP服务器)、path(路径处理)等,提供了一系列...

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

    首先,需要明确一点,exports和module.exports虽然看似相似,但它们在Node.js中有着明确的区别。module.exports是用来导出模块的,而exports是module.exports的一个引用。在Node.js中,每个文件都被视为一个独立的...

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

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

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

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

Global site tag (gtag.js) - Google Analytics