Node中的模块系统
什么是模块化
- 文件作用域
- 通信规则
- 加载require
- 导出
Commonjs模块规范
在node中的js还有一个很重要的概念模块系统
- 模块作用域
- 使用require来加载模块
- 使用exports接口对象来导出模块中的成员
加载 require
语法:
var 自定义变量 = require('模块');
两个作用:
执行被加载模块中的代码
得到加载模块中的exports导出接口对象
导出 exports
node中是模块作用域,默认文件中的所有成员只在当前文件模块有效 对于可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports接口对象中就可以了
导出多个成员(必须在对象中):
expotrs.a = 123;
exports.b = "wwx";
exports.c = function () {
console.log('ccc');
}
exports.d = {
foo:'bar';
}
导出单个成员(拿到的就是数字,字符串)
module.exports = 'hello'
以下情况会覆盖:
module.exports = 'hello';
//以这个为准,后者会覆盖前者
module.exports = "asdasa"
也可以这样导出来多个成员
module.exports = {
add:add,
foo:foo
}
原理解析
exports 是 module.exports 的一个引用
//var module = {
// exports = {};
//}
//var exports = module.exports;
console.log(exports === module.exports); // => true
exports.foo = 'bar';
//等价于
module.exports.foo = 'bar';
//return module.exports;
exports 和 module.exports 的区别
-
每个模块中都有一个 module 对象
-
module 对象中有一个 exports 对象
-
我们可以把需要导出的成员都挂载到 module.exports 接口对象中
-
也就是:moudle.exports.xxx = xxx 的方式
-
但是每次都 moudle.exports.xxx = xxx 很麻烦,点儿的太多了
-
所以 Node 为了你方便,同时在每一个模块中都提供了一个成员叫:exports exports === module.exports 结果为 trues
-
所以对于:moudle.exports.xxx = xxx 的方式 完全可以:expots.xxx = xxx
-
当一个模块需要导出单个成员的时候,这个时候必须使用:module.exports = xxx 的方式
-
不要使用 exports = xxx 不管用
-
因为每个模块最终向外 return 的是 module.exports
-
而 exports 只是 module.exports 的一个引用
-
所以即便你为 exports = xx 重新赋值,也不会影响 module.exports
-
但是有一种赋值方式比较特殊:exports = module.exports 这个用来重新建立引用关系的