nodejs 包引用的终极结论
通常我们用exports 或module.exports 来导出一个文件中的接口和字段,用require来引用导出的对象.那么这个exports 和 module.exports到底有啥关联呢?
1.新建app.js 然后写代码 :console.log({} instanceof Object) 结果是true 说明{} 是一个Object 的实例对象,这里是字面量的形式.
2.在app.js 中写上 console.log(module)
然后运行,结果类似下面的:可知module.exports 是一个{} 形式的对象.
Module { id: '.', exports: {}, parent: null, filename: '/Users/johnson/Documents/app.js', loaded: false, children: [], paths: [ '/Users/johnson/Documents/node_modules', '/Users/johnson/node_modules', '/Users/node_modules', '/node_modules' ] }
3. 而单独运行console.log(exports) 结果是 {}
4. 不过console.log(exports ==={}) ,console.log(module.exports ==={}) 都是false,说明{}是一个全新的Object 对象.
5.再写个: console.log(exports === module.exports) 结果是true 可以知道module.exports 和 exports 是相同的对象.
注意:{}表示创建了一个新的对象, 这种是Object 对象的字面量形式,比较对象的时候,比较的还是地址.
由以上结论可以知道,平时我导出接口的时候,用exports 和 module.exports 没有什么区别,应为它们的指向是一样的,类似下面的代码:
module.exports = exports = {}
不过还有一点,require 的时候,我们用的究竟是module.exports 呢还是 exports 呢?
新建js文件test.js:
module.exports.minus = function(a,b){ return a - b; } exports.multiply = function(a,b){ return a * b; } // exports = {} // module.exports = {}
新建js文件app.js:
var t = require('./test') console.log(t.minus(3,2)) console.log(t.multiply(3,2))
经过测试exports = {} 注释或不注释都不会影响结果 ,但是如果把下面的那句注释去掉,则运行报错,找不到导出的接口.
这说明,require 引用的是module.exports 对应的对象. 而exports 的意义就在于省略了一个module而已.