在node.js里经常看到两者混用,如果两者意义相同为什么看到有的项目里既有exports又有module.exports
exports
module.exports
业精于勤,荒于嬉;行成于思,毁于随。
唉,不会google, 难成合格的程序员啊..... 拿你标题直接去搜, 前10结果的标题都匹配上了
挑3个给你
Node.js中exports与module.exports的区别
Node.js 系列之 —— module.exports 与 exports
NodeJS学习笔记-exports和module.exports的区别
原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
Node.js中exports和module.exports有什么不同?
你肯定对Node.js模块中用来创建函数的exports对象很熟悉(假设一个名为rocker.js的文件):
exports.name = function() { console.log('My name is Lemmy Kilmister'); };
然后你在另一个文件中调用:
var rocker = require('./rocker.js'); rocker.name(); // 'My name is Lemmy Kilmister'
但是module.exports到底是个什么玩意儿? 它合法吗?
令人吃惊的是-module.exports是真实存在的东西。exports只是module.exports的辅助方法。你的模块最终返回module.exports给调用者,而不是exports。exports所做的事情是收集属性,如果module.exports当前没有任何属性的话,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'
rocker模块完全忽略了exports.name,然后返回了一个字符串'ROCK IT!'。通过上面的例子,你可能认识到你的模块不一定非得是模块实例(module instances)。你的模块可以是任何合法的JavaScript对象 - boolean,number,date,JSON, string,function,array和其他。你的模块可以是任何你赋予module.exports的值。如果你没有明确的给module.exports设置任何值,那么exports中的属性会被赋给module.exports中,然后并返回它。
在下面的情况下,你的模块是一个类:
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +' is '+ this.age +' years old'); }; };
然后你应该这样使用它:
var Rocker = require('./rocker.js'); var r = new Rocker('Ozzy', 62); r.about(); // Ozzy is 62 years old
在下面的情况下,你的模块是一个数组:
module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
var rocker = require('./rocker.js'); console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio
现在你应该找到要点了 - 如果你想要你的模块成为一个特别的对象类型,那么使用module.exports;如果你希望你的模块成为一个传统的模块实例(module instance),使用exports。
把属性赋予module.exports的结果与把属性赋予给exports是一样的。看下面这个例子:
module.exports.name = function() { console.log('My name is Lemmy Kilmister'); };
下面这个做的是一样的事情:
但是请注意,它们并不是一样的东西。就像我之前说的module.exports是真实存在的东西,exports只是它的辅助方法。话虽如此,exports还是推荐的对象,除非你想把你模块 的对象类型从传统的模块实例(module instance)修改为其他的。
简单说就是exports引用了modules.exports 所以 exports.fn = function(){}; 时,modules.exports.fn也指向了该匿名函数
另外,值得注意的 执行exports = null后,modules.exports仍然指向原始的值,而非等于null
有图有真相,图文揭秘exports和module.exports的用法:http://qifuguang.me/2015/11/11/%E6%8F%AD%E7%A7%98Node-js%E4%B8%ADexports%E5%92%8Cmodule-exports/
可否简单的理解为:以下所说的模块的名称,就是文件名,假如这个文件名是abc.js,这个模块叫abc模块。
exports是把某个方法导出到以文件名命名的模块对象中,也就是把某个方法导入到abc这个模块对象中Module.exports导出的其实是整个模块对象
Module.exports
当用exports导出的时候必须是exports.methodName = xxx();,外部调用时
exports.methodName = xxx();
var abc = require("abc.js"); abc.methodName();
当用Module.exports导出的时候,导出的是一个对象{methodName: xxx()},外部调用时
{methodName: xxx()}
详细的请看http://sabrinaluo.com/tech/2015/12/16/difference-between-Module-exports-with-exports-in-NodeJS/
... 手册看看,试一试,什么都就明白了
唉,不会google, 难成合格的程序员啊..... 拿你标题直接去搜, 前10结果的标题都匹配上了
挑3个给你
Node.js中exports与module.exports的区别
Node.js 系列之 —— module.exports 与 exports
NodeJS学习笔记-exports和module.exports的区别
原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
Node.js中exports和module.exports有什么不同?
你肯定对Node.js模块中用来创建函数的exports对象很熟悉(假设一个名为rocker.js的文件):
然后你在另一个文件中调用:
但是module.exports到底是个什么玩意儿? 它合法吗?
令人吃惊的是-module.exports是真实存在的东西。exports只是module.exports的辅助方法。你的模块最终返回module.exports给调用者,而不是exports。exports所做的事情是收集属性,如果module.exports当前没有任何属性的话,exports会把这些属性赋予module.exports。如果module.exports已经存在一些属性的话,那么exports中所用的东西都会被忽略。
把下面的内容放到rocker.js:
然后把下面的内容放到另一个文件中,执行它:
rocker模块完全忽略了exports.name,然后返回了一个字符串'ROCK IT!'。通过上面的例子,你可能认识到你的模块不一定非得是模块实例(module instances)。你的模块可以是任何合法的JavaScript对象 - boolean,number,date,JSON, string,function,array和其他。你的模块可以是任何你赋予module.exports的值。如果你没有明确的给module.exports设置任何值,那么exports中的属性会被赋给module.exports中,然后并返回它。
在下面的情况下,你的模块是一个类:
然后你应该这样使用它:
在下面的情况下,你的模块是一个数组:
然后你应该这样使用它:
现在你应该找到要点了 - 如果你想要你的模块成为一个特别的对象类型,那么使用module.exports;如果你希望你的模块成为一个传统的模块实例(module instance),使用exports。
把属性赋予module.exports的结果与把属性赋予给exports是一样的。看下面这个例子:
下面这个做的是一样的事情:
但是请注意,它们并不是一样的东西。就像我之前说的module.exports是真实存在的东西,exports只是它的辅助方法。话虽如此,exports还是推荐的对象,除非你想把你模块 的对象类型从传统的模块实例(module instance)修改为其他的。
简单说就是exports引用了modules.exports
所以
exports.fn = function(){}; 时,modules.exports.fn也指向了该匿名函数
另外,值得注意的
执行exports = null后,modules.exports仍然指向原始的值,而非等于null
有图有真相,图文揭秘exports和module.exports的用法:
http://qifuguang.me/2015/11/11/%E6%8F%AD%E7%A7%98Node-js%E4%B8%ADexports%E5%92%8Cmodule-exports/
可否简单的理解为:
以下所说的模块的名称,就是文件名,假如这个文件名是abc.js,这个模块叫abc模块。
exports
是把某个方法导出到以文件名命名的模块对象中,也就是把某个方法导入到abc这个模块对象中Module.exports
导出的其实是整个模块对象当用exports导出的时候必须是
exports.methodName = xxx();
,外部调用时当用
Module.exports
导出的时候,导出的是一个对象{methodName: xxx()}
,外部调用时详细的请看
http://sabrinaluo.com/tech/2015/12/16/difference-between-Module-exports-with-exports-in-NodeJS/
... 手册看看,试一试,什么都就明白了