在浏览器端 js 里面,为了解决各模块变量冲突等问题,每每借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块至关的自由,开发者只须要关注 require,exports,module 等几个变量就足够,而为了保持模块的可读性,很推荐把不一样功能的代码块都写成独立模块,减小各模块耦合。node
每个node.js执行文件,都自动建立一个module对象,同时,module对象会建立一个叫exports的属性,初始化的值是 {}浏览器
module.exports = {};
在 node 的 js 模块里能够直接调用 exports 和 module 两个“全局”变量,可是 exports 是 module.exports 的一个引用。闭包
//plus.js function plus(a,b){ return a+b; } // 这样导出的 plus 是做为 exports 的一个方法被导出的 exports.plus = plus; // main.js var Plus = require('plus'); console.log(Plus.plus(1,2)); // 左边的 Plus 是 require 过来的模块名,右边的是它的 plus 方法。
在 node 编译的过程当中,会把 js 模块封装成以下形式:函数
// require 是对 Node.js 实现查找模块的 Module._load 实例的引用 // __finename 和 __dirname 是 Node.js 在查找该模块后找到的模块名称和模块绝对路径 (function(exports,require,module,__filename,__dirname){ function plus(a,b){ return a+b; } exports.plus = plus; })
为了将函数直接导出成模块,而不是模块的一个方法,须要ui
module.exports = plus;code
// plus.js function plus(a,b){ return a+b ; } module.exports = plus; // main.js var plus = require('plus'); console.log(plus(1,2));
exports = module.exports = {};对象
例子一:内存
var name = 'rainbow'; exports.name = name; exports.sayName = function(){ console.log(name); } // 给 exports 赋值至关于给 module.exports 这个空对象添加了两个属性,至关于: var name = 'rainbow'; module.exports.name = name; module.exports.sayName = function(){ console.log(name); }
例子二:开发
exports = module.exports = somethings // 等价于 module.exports = somethings exports = module.exports // module.exports = somethings 是对 mudole.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,mudole.exports 指向了新的内存块,而exports 仍是指向原来的内存块,为了让 module.exports 和 exports 仍是指向同一个内存或者说指向同一个"对象",因此咱们就 exports = module.exports.
例子三:io
exports = function(){}; // 这样就是从新给 exports 赋值,它将再也不是 module.exports 的引用,两者将无任何联系。
例子四:
module.exports.something = function(){}; exports.something = function(){}; // 上面两个方程是等价的
例子五:
// index.js var something = require('./requireMe'); something(); // requireMe.js exports.something = function(){ console.log('am a function'); } // 以上代码会报错,由于 require 出来的 module.exports 是一个object,不能直接执行 //修改方式一 // requireMe.js module.exports = function(){ console.log('am a function'); } // 当把代码改为上面这样,就不会报错,由于此时的 module.exports 是一个 function,能够直接执行。 // 修改方式二 // index.js var something = require('./requireMe'); something.something(); // 由于这时候 require 出来的是一个 object,有一个 something 的属性,因此能够这样调用执行。
other:
reference 是 引用的意思,就是两个变量引用同一个值,是指向同一个内存地址。