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是渣呢?还是痴情呢?
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
网友评论