我理解的exports 和 module.exports 的区别,欢迎大家吐槽~
为了更好的理解 exports
和 module.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 已毫无关系,所以最后两个输出不一样。
明白了上述例子后,我们进入正题。 我们只需知道三点即可知道 exports
和 module.exports
的区别了:
-
exports
是指向的module.exports
的引用 -
module.exports
初始值为一个空对象{}
,所以exports
初始值也是{}
-
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); }
我们通常这样使用 exports
和 module.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
指向了一块新的内存(内容为一个计算圆面积的函数),也就是说 exports
和 module.exports
不再指向同一块内存,也就是说此时 exports
和 module.exports
毫无联系,也就是说 module.exports
指向的那块内存并没有做任何改变,仍然为一个空对象 {}
,也就是说 area.js 导出了一个空对象,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function
的错误。
所以,一句话做个总结:当我们想让模块导出的是一个对象时, exports
和 module.exports
均可使用(但 exports
也不能重新覆盖为一个新的对象),而当我们想导出非对象接口时,就必须也只能覆盖 module.exports
。
我们经常看到这样的用写法:
exports = module.exports = somethings
上面的代码等价于
module.exports = somethings exports = module.exports
原因也很简单, module.exports = somethings
是对 module.exports
进行了覆盖,此时 module.exports
和 exports
的关系断裂,module.exports
指向了新的内存块,而 exports
还是指向原来的内存块,为了让 module.exports
和 exports
还是指向同一块内存或者说指向同一个 “对象”,所以我们就 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 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 模块是构成 Node.js 应用程序的基础组件,它们允许开发者通过导入和导出来组织和重用代码。Node.js 的模块系统是其强大功能之一,它遵循 CommonJS 规范,使得代码可以模块化,提高了代码的可读性和可维护性...
Node.js 引入了模块(Module)概念,一个模块可以通过module.exports 或 exports 将函数、变量等导出,以使其它 JavaScript 脚本通过require() 函数引入并使用。 module.exports 初始值为一个空对象 {},所以 ...
前言Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用。Node.js中只有模块作用域
在Node.js中,模块的导出和导入是通过CommonJS规范实现的,而exports和module.exports则是实现模块导出的关键概念。虽然在日常开发中经常使用这两个概念,但很多开发者可能会忽视它们之间的区别,这可能会在模块的...
书中会探讨`require`和`module.exports`的使用,以及如何自定义模块。 4. **文件系统(File System,简称FS)**:Node.js提供了丰富的文件系统API,如读写文件、创建删除目录等。书中会详细讲解这些API的用法,以及...
对于Vue.js项目,尤其是由`@vue/cli`生成的Vue3项目,`package.json`中的`main`、`module`和`exports`字段用于指定不同环境下的入口文件,这有助于优化加载和打包过程。本文将深入探讨这三种方式的使用以及如何...
2. **模块系统**:Node.js使用模块化设计,每个`.js`文件都可以视为一个模块,通过`require`和`exports`或`module.exports`来导入和导出模块。 3. **V8引擎**:Node.js使用Google的V8引擎,使得JavaScript的执行速度...
2. 模块系统:Node.js使用CommonJS模块规范,通过`require`引入模块,`module.exports`或`exports`导出模块。 3. 文件和流:Node.js的fs模块提供了对文件系统的操作,流模块则可用于高效地处理大文件和网络数据。 4....
2. **模块系统**:Node.js的模块化设计是其强大之处,学习CommonJS规范,require()和module.exports的使用,以及如何创建和使用自定义模块。 3. **文件系统操作**:Node.js提供了便捷的文件系统API,学习如何读写...
了解CommonJS规范,以及如何使用require和module.exports来导入和导出模块,是深入学习Node.js的必经之路。 五、Node.js进阶 1. Express框架:Express是基于Node.js的最流行的Web应用框架,简化了路由、中间件和...
当你在文件中使用`require('some_module')`时,Node.js会返回该模块的导出对象,这个对象是`module.exports`的值。 `module.exports`是每个模块都有的一个全局变量,它的初始值是一个空对象`{}`。这个对象用于存放...
- CommonJS模块化:Node.js使用CommonJS规范,通过`require`导入模块,`module.exports`或`exports`导出模块。 - 文件系统操作:Node.js内置文件系统模块,方便进行文件读写和目录管理。 - HTTP服务器:Node.js...
总的来说,Node.js的`module`模块是其模块系统的核心,它使得代码组织和复用变得简单高效,同时也提供了诸如`require()`、`exports`、`module.exports`等工具,以及`__filename`和`__dirname`这样的便利变量,以支持...
1. CommonJS:Node.js的模块系统遵循CommonJS规范,通过`require`引入模块,`module.exports`或`exports`导出模块。 2. Node.js内置模块:如fs(文件系统)、http(HTTP服务器)、path(路径处理)等,提供了一系列...
首先,需要明确一点,exports和module.exports虽然看似相似,但它们在Node.js中有着明确的区别。module.exports是用来导出模块的,而exports是module.exports的一个引用。在Node.js中,每个文件都被视为一个独立的...
Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写程序,从而打破了JavaScript只能在浏览器中运行的传统。Node.js通过事件驱动、非阻塞I/O模型,使其轻量且高效,非常...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它让开发者能够在服务器端使用JavaScript进行编程。"Node.js编码风格指南"旨在提供一套统一的代码编写规范,以提高代码的可读性、可维护性和团队协作效率。...