1. 依靠commonJs规范建立模块机制

commonJs规范:
引入 require
导出 exports,且exports只能是一个对象,暴露的API只能作为此对象的属性

2. 于commonJs的区别

nodejs中,真正的对外暴露的是module.exports 这个特殊对象
exports只是个普通变量,默认绑定module.exports
知乎上一个回答: (也可参考狼书1)
image.png

2.1模块并不一定返回实例化的对象,而是可以是任何合法的js对象:boole、string、obj、date等等。

3 最佳实践

module.exports 和 exports 一起使用可能会出现问题,比如

  1. exports.a = function() { console.log("a")} // a API 并没有被导出
  2. module.exports = 'hello world'

3.1 如果模块是一个特定类型,用module.exports

  1. module.exports = function() {}

3.2 如果模块是一个典型实例化对象,则用exports

  1. exports.name = "tom"
  2. exports.call = function() {}