众所周知,nodejs使用的是commonjs规范
- Module.exports 暴露接口
- require引入模块
- 服务器端
- 同步执行
module对象
每个模块内部,都有一个module
对象,代表当前模块
module.id //模块的识别符,通常是带有绝对路径的模块文件名。
module.filename //模块的文件名,带有绝对路径。
module.loaded //返回一个布尔值,表示模块是否已经完成加载。
module.parent //返回一个对象,表示调用该模块的模块。可通过是否为null来判断当前模块是否是入口文件
module.children //返回一个数组,表示该模块要用到的其他模块。
module.exports //表示模块对外输出的值。
exports和module.exports
Node为每个模块提供一个exports变量,指向module.exports(exports=module.exports=xxxx)。所以当先使用exports.a=1,再使用module.exports={b:2}时,最后只会暴露b;直接使用module.exports=xxx时,会覆盖掉exports.xx=xx
当模块只有唯一输出时,使用module.exports- exports.a = a 相当于 module.exports = {a:a}
- 一次性导出多个属性或方法使用module.exports
require
-
第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的
module.exports
属性。 -
缓存是以绝对路径存储的
-
在下一次import之前使用require.cache.delete[modulename]来删除某个模块的缓存
//删除所有模块缓存 Object.keys(require.cache).map((i)=>{delete require.cache[i]})
-
当 Node.js 直接运行一个文件时,
require.main
会被设为它的module
。 这意味着可以通过require.main === module
来判断一个文件是否被直接运行: