Node中的模块系统

703 阅读2分钟

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 这个用来重新建立引用关系的