Node里面的模块系统遵循的是CommonJS规范。
1、CommonJS模块的特点:
- 所有代码都运行在模块作用域,不会污染全局作用域。
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
- 模块加载的顺序,按照其在代码中出现的顺序。
2、module对象
- 每个模块内部,都有一个module对象,代表当前模块。它的属性:
- module.id 模块的识别符,通常是带有绝对路径的模块文件名。
- module.filename 模块的文件名,带有绝对路径。
- module.loaded 返回一个布尔值,表示模块是否已经完成加载。
- module.parent 返回一个对象,表示调用该模块的模块。
- module.children 返回一个数组,表示该模块要用到的其他模块。
- module.exports 表示模块对外输出的值。
那么问题来了,module.exports和exports的区别?
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令:var exports = module.exports;
所以,对每个模块来说,module.exports和exports是相关联的,所以可以向exports对象添加方法,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
所以,当两者同时存在,require眼里只有module.exports,只有exports存在时,在require眼里,它不过是module.exports的一个影子而已,无论什么时候,require眼里其实只有module.exports。我滴天!require是渣呢?还是痴情呢?
3、require函数及其辅助方法主要如下:
- require(): 加载外部模块
- require.resolve():将模块名解析到一个绝对路径
- require.main:指向主模块
- require.cache:指向所有缓存的模块
- require.extensions:根据文件的后缀名,调用不同的执行函数
参考链接:
http://javascript.ruanyifeng.com/nodejs/module.html
https://www.runoob.com/nodejs/nodejs-module-system.html