nodejs中exports与module.exports的实践

只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等>”怪异的串联用法,一问原因,貌似都是云里雾里,如此写法更像是保守的防止性写法。

这种问题除了看源代码外,只能写点代码进行求证。

写了两个模块文件,provider.js产生任意类型的对象, customer.js返回并输出provider对象。

第一种情况:

provider.js,直接在exports上设置任意类型的对象。

exports = {name:‘kxh‘}
/*exports = function(){
  console.log(‘kxh‘);
};
exports = ‘kxh‘;*/

console.log(‘*******provider-module***********‘);
console.log(module);
console.log(‘*******provider-exports***********‘);
console.log(exports);

customer.js

var p = require(‘./provider‘);

console.log(‘*******customer-result***********‘);
console.log(p);

执行customer.js结果:

*******provider-module***********
{ id: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  exports: {},
  parent:
   { id: ‘.‘,
     exports: {},
     parent: null,
     filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\customer.js‘,
     loaded: false,
     children: [ [Circular] ],
     paths:
      [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\node_modules‘,
        ‘D:\\ProgramDemos\\node_modules‘,
        ‘D:\\node_modules‘ ] },
  filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  loaded: false,
  children: [],
  paths:
   [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\node_modules‘,
     ‘D:\\ProgramDemos\\node_modules‘,
     ‘D:\\node_modules‘ ] }
*******provider-exports***********
{ name: ‘kxh‘ }
*******customer-result***********
{}

从结果看,直接向exports上设置任意类型的对象都不会被require返回给调用模块。require返回的是module.exports的空对象。

第二种情况:

provider.js,为exports设置任意类型的属性。

exports.name = {firstName:‘xh‘, lastName:‘k‘};
//exports.name = "kxh";
/*exports.printName = function(){
  console.log("kxh");
};*/

console.log(‘*******provider-module***********‘);
console.log(module);
console.log(‘*******provider-exports***********‘);
console.log(exports);

customer.js不变。

执行customer.js结果:

*******provider-module***********
{ id: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  exports: { name: { firstName: ‘xh‘, lastName: ‘k‘ } },
  parent:
   { id: ‘.‘,
     exports: {},
     parent: null,
     filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\customer.js‘,
     loaded: false,
     children: [ [Circular] ],
     paths:
      [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\node_modules‘,
        ‘D:\\ProgramDemos\\node_modules‘,
        ‘D:\\node_modules‘ ] },
  filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  loaded: false,
  children: [],
  paths:
   [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\node_modules‘,
     ‘D:\\ProgramDemos\\node_modules‘,
     ‘D:\\node_modules‘ ] }
*******provider-exports***********
{ name: { firstName: ‘xh‘, lastName: ‘k‘ } }
*******customer-result***********
{ name: { firstName: ‘xh‘, lastName: ‘k‘ } }

从结果看,为exports设置任意类型的属性,module.exports保持同步,能被require返回出去。

第三种情况:

provider.js,为exports设置任意类型的属性,并且为module.exports设置同名的或不同名的任意类型的属性。

exports.name = {firstName:‘xh‘, lastName:‘k‘};
//exports.name = "kxh";
/*exports.printName = function(){
  console.log("kxh");
};*/
//module.exports.name = {firstName:‘wf‘, lastName:‘z‘};
module.exports.mail = "[email protected]";

console.log(‘*******provider-module***********‘);
console.log(module);
console.log(‘*******provider-exports***********‘);
console.log(exports);

customer.js不变。

执行customer.js结果:

*******provider-module***********
{ id: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  exports:
   { name: { firstName: ‘xh‘, lastName: ‘k‘ },
     mail: ‘[email protected]‘ },
  parent:
   { id: ‘.‘,
     exports: {},
     parent: null,
     filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\customer.js‘,
     loaded: false,
     children: [ [Circular] ],
     paths:
      [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\node_modules‘,
        ‘D:\\ProgramDemos\\node_modules‘,
        ‘D:\\node_modules‘ ] },
  filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  loaded: false,
  children: [],
  paths:
   [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\node_modules‘,
     ‘D:\\ProgramDemos\\node_modules‘,
     ‘D:\\node_modules‘ ] }
*******provider-exports***********
{ name: { firstName: ‘xh‘, lastName: ‘k‘ },
  mail: ‘[email protected]‘ }
*******customer-result***********
{ name: { firstName: ‘xh‘, lastName: ‘k‘ },
  mail: ‘[email protected]‘ }

从结果看,如果设置不同名的属性,则为合并到module.exports并返回,如果是同名属性则require返回的全是module.exports。

第四种情况:

provider.js,不论为exports设置社么样类型的属性,直接为module.exports设置了任意类型对象。

exports.name = {firstName:‘xh‘, lastName:‘k‘};
//exports.name = "kxh";
/*exports.printName = function(){
  console.log("kxh");
};*/

//module.exports = {name:‘kxh‘};
module.exports = function(){
  console.log(‘kxh‘);
};

console.log(‘*******provider-module***********‘);
console.log(module);
console.log(‘*******provider-exports***********‘);
console.log(exports);

customer.js不变。

执行customer.js结果:

*******provider-module***********
{ id: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  exports: [Function],
  parent:
   { id: ‘.‘,
     exports: {},
     parent: null,
     filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\customer.js‘,
     loaded: false,
     children: [ [Circular] ],
     paths:
      [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
        ‘D:\\ProgramDemos\\Web\\node_modules‘,
        ‘D:\\ProgramDemos\\node_modules‘,
        ‘D:\\node_modules‘ ] },
  filename: ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\provider.js‘,
  loaded: false,
  children: [],
  paths:
   [ ‘D:\\ProgramDemos\\Web\\nodejs\\TestNode\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\nodejs\\node_modules‘,
     ‘D:\\ProgramDemos\\Web\\node_modules‘,
     ‘D:\\ProgramDemos\\node_modules‘,
     ‘D:\\node_modules‘ ] }
*******provider-exports***********
{ name: { firstName: ‘xh‘, lastName: ‘k‘ } }
*******customer-result***********
[Function]

从结果看,不论为exports设置社么样类型的属性,直接为module.exports设置了任意类型对象,则require一律返回module.exports。

从上面的四种实践结果来看:

require返回的是module.exports,在module.exports上可以设置函数、对象实例、基本类型的变量等,因此,一般就是module.exports作为模块的到处就行了。

如果想用exports作为模块的返回,那么就为它设置一个属性,并且不要在module.exports上设置同名的属性。

end

^-^

时间: 2024-10-01 04:56:01

nodejs中exports与module.exports的实践的相关文章

nodejs模块中exports和module.exports的区别

通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心模块具有最高的加载优先级(有模块与核心模块同名时会体现) 文件模块访问方式通过require('/文件名.后缀') require('./文件名.后缀') requrie('../文件名.后缀') 去访问,文件后缀可以省略:以"/"开头是以绝对路径去加载,以"./"开头

深入理解nodejs 中 exports与module.exports

在Javascript 中,有2种作用域,分为 全局作用域 ,和函数作用域, 在 浏览器端 , 全局作用域 就是 window对象的属性, 函数作用域 就是 ,某个 函数 生成的对象的属性: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script> var name

nodejs中exports与module.exports的区别

node中exports模块对象相信大家一定不陌生: 如studentModule.js: exports.student = function() { console.log("this is student module!"); } 在另一个模块中这样引用: var student = require('./studentModule.js'); student.student(); // this is student module! 那么问题来了:module.exports是

nodeJS exports – exports vs module.exports

require, exports, module.exports 区别: require 用来加载代码(模块),而 exports 和 module.exports 则用来导出代码. exports 是指向的 module.exports 的引用 module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {} require() 返回的是 module.exports 而不是 exports nodejs中exports与module.exports的区别: Mo

Node.js中exports,module.exports以及require方法

在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是,如果直接给exports赋值的话,exports就与module.exports没有任何关联了,比如: exports = { hello: false }; // Not exported, only available in the module 此时,exports是没有导出任何变量的. 要弄

nodejs(第三篇):nodejs中的文件模块、nodejs中的require与exports、http模块补充、JavaScript Standard Style

一.nodejs中的文件模块 在nodejs中,用户自己编写的模块,称为文件模块. 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/.../.../xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/.../.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹加载. (1)在Node.js中,require是一个方法,只有通过requir

node.js中的exports和module.exports

不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式. 首先怎么创建node中的modules. 可以直接创建一个文件作为module,如下module.js function writeLine(){ console.log("module.js"); } export

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

原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html 你肯定对Node.js模块中用来创建函数的exports对象很熟悉(假设一个名为rocker.js的文件): exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 然后你在另一个文件中调用: var rocker = require('./rocker.js'); r

node.js模块中exports和module.exports的区别

Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即module.exports)是对外的接口.加载某个模块,其实是加载该模块的module.exports属性. var x = 5; var addX = function (value) { return

nodejs exports与module.exports的区别

exports和module.exports的作用都是将文件模板的方法和属性暴露给require返回的对象进行调用.但是两者有本质的区别,exports的属性和方法都可以被module.exports替代. 如下代码是一样的: exports.name='iwang' module.exports.name = 'iwang' 但是exports不能替代module.exports的方法,所有的exports对象最终都是通过module.exports传递执行的.可以理解exports是给mod