CommonJS随记
Posted muting
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CommonJS随记相关的知识,希望对你有一定的参考价值。
CommonJS的模块化
Node应用由模块组成,每个模块有自己的作用域,里面的函数、变量、类等都是私有的。
CommonJS规定,每个模块内部,module
变量(是个对象)代表当前模块,module.exports
是对外的接口。其他文件通过require
方法加载这个接口,获得该模块输出的数据。
CommonJS模块的特点:
- 所有代码都运行在模块作用域,不会污染全局作用域;
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后缓存结果,以后加载直接读取缓存结果;
- 模块加载的顺序按照其在代码中出现的顺序
module对象
Node内部提供一个Module
构建函数,所有模块都是Module
的实例;每个模块内部,都有一个Module
对象代表当前模块,具有以下属性:
- id --通常是带有绝对路径的模块文件名
- filename -- 模块文件名
- loaded -- Boolean,是否已完成加载
- parent -- 调用该模块的模块对象
- children --引用到的其他模块构成的数组
- exports --模块对外输出的值
require命令
基本功能:读入并执行一个javascript文件,返回该模块的exports对象;如没有找到指定模块会报错;
require
加载文件后缀名默认为.js
;
路径加载规则:
- “/”开头 --绝对路径的模块文件;
- “./”开头 -- 相对于当前执行脚本的模块所在目录的相对路径;
- 不是“/”或“./”开头的路径,先找到第一个标识的位置,再以此为参数找到后续路径;
- 如果指定的模块文件没有发现,Node会尝试为文件名添加
.js
,.json
,.node
后重新搜索,并按对应的文件类型解析;
目录加载:require
的参数字符串指向一个目录时,会自动查看该目录的package.json
文件,然后加载main
字段指定的入口文件;如果没有main
字段或没有package.json
文件,则会加载该目录下的index.js
或index.node
文件。
require
命令加载重复的模块(根据绝对路径识别)实际上只执行一次,后面都是加载缓存;所有缓存都存放在require.cache
中。删除模块的缓存可以写如下代码:
//删除指定模块
delete require.cache[moduleName];
//删除所有模块
Object.keys(require.cache).forEach(function(key) {
delete require.cache[key];
})
加载机制
CommonJS加载模块是加载其输出值的拷贝,加载之后不会受到源模块内部变化的影响。
参考:CommonJS规范
以上是关于CommonJS随记的主要内容,如果未能解决你的问题,请参考以下文章