来自本人论坛:www.tnodejs.com tnodejs.com
最近大家都说两者是一样的,其实不然,本文来自
http://www.hacksparrow.com/node-js-exports-vs-module-exports.html翻译相信大家都很熟悉exports的用法了,你可以创建一个function在你的模块中如下:
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
我们可以通过如下方法执行访问:
var rocker = require('./rocker.js');
rocker.name(); // 'My name is Lemmy Kilmister'
那么module.exports存在的意义是什么?他是否在编码中也是正确合法的?在开源的node.js代码中可以看出,module.exports才是真正的模块export,而exports仅仅是module.exports的一个帮手。你的所有模块export的,最终都是通过module.exports返回出去的。Exports的作用主要是将所有的属性和方法整理、连接给module.exports,当module.exports还未执行。如果module.exports执行以后,所有的exports方法都将失效。下面的例子就是说明上面一点创建一个rocker.js:module.exports = 'ROCK IT!';
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
创建另外一个文件,并且执行:var rocker = require('./rocker.js');
rocker.name(); // TypeError: Object ROCK IT! has no method 'name'
可以看到执行结果中无法获取name这个function。rocker.js中最开始就执行了module.exports,根据之前我们介绍的,在module.exports执行后他将拒绝所有的exports模块,因此我们的exports.name将会失效。从而我们无法在require模块后获取该方法。你可能意识到,你的模块并不总是有“模块实例”。你的模块可能是任何的类型的JavaScript对象boolean,
number, date, JSON, string, function, array等等。你可以通过module.exports任何的对象。If you don't set module.exports to anythingexplicitly, the properties of exports and attached to it and returned.In this case, your module is a class:module.exports = function(name, age) {
this.name = name;
this.age = age;
this.about = function() {
console.log(this.name +' is '+ this.age +' years old');
};
};
and you'd use it this way:var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old
In
this case, your module is an array:module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
and you may use it this way:var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio
So
you get the point now - if you want yourmodule to be of a specific object type, use module.exports; if you want yourmodule to be a typical module instance, use exports.The result of attaching properties tomodule.exports is akin to attaching properties to exports. For example this:module.exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
does
the same thing as:exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
But note that, they are not the same thing.As I said earlier module.exports is the real deal, exports is just its littlehelper.
Having said that, exports is the recommended object unless you areplanning to change the object type of your module from the traditional 'module instance'to something else.I hope this post helped you understand thedifference between exports and module.exports, and learn a bit more about howmodules work in Node.js. Any questions, ping me in
the comments.加上官网的介绍
The exports object is created by the Modulesystem. Sometimes this is not acceptable, many want their module to be aninstance of some class. To do this assign the desired export object to module.exports. For example suppose we were making amodule called a.js
var EventEmitter = require('events').EventEmitter;
module.exports = new EventEmitter();
// Do some work, and after some time emit
// the 'ready' event from the module itself.
setTimeout(function() {
module.exports.emit('ready');
}, 1000);
Then in another file we could dovar a = require('./a');
a.on('ready', function() {
console.log('module a is ready');
});
Note that assignment to [font='Lucida Console']module.exports must be done immediately. It cannotbe done in any callbacks. This does not work:
x.js:
setTimeout(function() {
module.exports = { a: "hello" };
}, 0);
y.js:
var x = require('./x');
console.log(x.a);
分享到:
相关推荐
7. **`exports` 与 `module.exports` 的区别**:虽然通常情况下两者可以互换使用,但当需要导出一个完整的对象或函数时,应优先使用 `module.exports`。因为如果 `exports` 被赋值为一个新对象,原来的 `module....
前言Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用。Node.js中只有模块作用域
对于Vue.js项目,尤其是由`@vue/cli`生成的Vue3项目,`package.json`中的`main`、`module`和`exports`字段用于指定不同环境下的入口文件,这有助于优化加载和打包过程。本文将深入探讨这三种方式的使用以及如何...
首先,需要明确一点,exports和module.exports虽然看似相似,但它们在Node.js中有着明确的区别。module.exports是用来导出模块的,而exports是module.exports的一个引用。在Node.js中,每个文件都被视为一个独立的...
Node.js 引入了模块(Module)概念,一个模块可以通过module.exports 或 exports 将函数、变量等导出,以使其它 JavaScript 脚本通过require() 函数引入并使用。 module.exports 初始值为一个空对象 {},所以 ...
2. **模块系统**:Node.js使用模块化设计,每个`.js`文件都可以视为一个模块,通过`require`和`exports`或`module.exports`来导入和导出模块。 3. **V8引擎**:Node.js使用Google的V8引擎,使得JavaScript的执行速度...
Node.js是基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O、事件驱动的特性在服务器端编程领域独树一帜,尤其适合构建高性能的网络应用。本书通过115个关键技巧的讲解,全面覆盖了Node.js的基础到高级应用...
在Node.js中,模块的导出和导入是通过CommonJS规范实现的,而exports和module.exports则是实现模块导出的关键概念。虽然在日常开发中经常使用这两个概念,但很多开发者可能会忽视它们之间的区别,这可能会在模块的...
2. **模块系统**:Node.js的模块化设计是其强大之处,学习CommonJS规范,require()和module.exports的使用,以及如何创建和使用自定义模块。 3. **文件系统操作**:Node.js提供了便捷的文件系统API,学习如何读写...
Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写程序,从而打破了JavaScript只能在浏览器中运行的传统。Node.js通过事件驱动、非阻塞I/O模型,使其轻量且高效,非常...
`require()`函数用于导入模块,`exports`和`module.exports`用于导出模块内容。理解模块机制是深入学习Node.js的基础。 ### 4. 事件机制 Node.js的事件驱动模型是其高效处理并发的关键。事件循环监听各种事件,并...
了解CommonJS规范,以及如何使用require和module.exports来导入和导出模块,是深入学习Node.js的必经之路。 五、Node.js进阶 1. Express框架:Express是基于Node.js的最流行的Web应用框架,简化了路由、中间件和...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它让开发者能够在服务器端使用JavaScript进行编程。"Node.js编码风格指南"旨在提供一套统一的代码编写规范,以提高代码的可读性、可维护性和团队协作效率。...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了全栈开发的流行。Egg.js 是一个由阿里云开发的企业级 Node.js 框架,旨在提供一套高效...
2. **模块系统**: Node.js使用CommonJS模块规范,通过`require`导入模块,`module.exports`或`exports`导出模块。在源代码中,你可以看到如何组织代码并实现模块化。 3. **文件系统操作**: Node.js提供了丰富的文件...
Node.js是一种开源、跨平台的JavaScript运行环境,它允许开发者在服务器端运行JavaScript代码,极大地扩展了JavaScript的应用范围。Node.js基于Chrome V8引擎,因此它具有高效的性能和丰富的库支持。在本压缩包中,...
内置的 `module` 和 `exports` 对象使得模块间的通信变得简单。 3. **V8引擎**:Node.js 基于 Google 的 V8 JavaScript 引擎,使得 JavaScript 代码能够以接近原生速度运行,提高了性能。 4. **文件系统(FS)模块...
2. **模块系统**:Node.js 使用CommonJS模块规范,通过`require`引入模块,`module.exports`或`exports`导出模块。 3. **Express框架**:在Node.js中,Express是最流行的Web应用框架,简化了路由、中间件和HTTP...