CommonJS 特性
- 每个文件是一个模块,有自己的作用域
- 在模块内部 module 变量代表模块本身
- module.exports 属性代表模块对外接口
require 规则
-
/ 表示绝对路径, ./ 表示相对于当前文件
-
支持js、json、node扩展名,不写时会依次尝试
-
不写路径则认为是build-in 模块或者各级 node_modules 内的第三模块
require 特性
- module 被加载的时候执行,加载后缓存
- 一旦出现某个模块被循环加载(互相引用),就只输出已经执行的部分,还未执行的部分不会输出
exports 是 module.exports 的简写形式,node文件编译模拟
const exports = module.exports
(
function (exports,require,module,__filename,__dirname){
//code...
}
)
所以我们可以直接在exports上挂载属性或方法,但是不能改变exports的指向
exports.test = 100 // 可以这样用
exports = { //改变指向,错误用法
a: 1,
b: 2,
test: 100
}
当我们想要直接导出一个对象时可以用module.exports
module.exports = {
a: 1,
b: 2,
test: 100
}
exports默认为mudule.exports的快捷方式,可以添加属性但是不能修改指向,修改指向后就会成为一个普通对象。因为在CommonJS中模块对外的输出永远都是module.exports。