Module 模块
模块的出现只是为了更好的维护代码避免全局污染提高代码可读性
模块的加载与导出
通过如下两种方式可以加载一个模块,通常返回一个对象或者方法
require(modulePath)
module.require(modulePath)
而一个模块的内部作用域内存在exports对象,通过该对象可以导出对象、方法或变量。
exports
module.exports
本质上内部有一行隐藏代码exports === module.exports
所以不要轻易给exports
重新赋值
模块的加载顺序
模块加载顺序如下
$NODE_PATH
./node_modules
$HOME/.node_modules
$HOME/.node_libraries
$PREFIX/lib/node
其实可以通过require.resolve.paths(moduleName)
来获取描述模块加载顺序的数组
模块内容
模块除了导入和导出之外,还可以通过require.resolve(moduleName)
方法来获取模块的完整路径
在每个模块中都存在module
对象用来表示模块的信息,但是仅限于当前模块作用域内:
id: 模块唯一标识符,通常就是模块的完整路径,入口文件除外,入口文件的id为'.'
filename: 模块完整路径
parent: 加载了该模块的父类模块
exports: 模块导出内容
loaded: 是否被其他模块加载过
children: 模块内加载的其他模块
paths: 模块的加载顺序
模块的缓存
一个模块一旦被加载就会被缓存起来,也就是多次加载只会返回同一个对象,同时一个模块内加载的所有模块都存储在require.cache
这个对象中。这个对象以模块完整路径为Key
,以模块内容为value
如果希望删除缓存,使用delete
即可
delete require.cache(require.resolve(moduleName))
模块名
默认情况下,一个文件就是一个模块,所以require(filePath)
即可加载一个模块。但是有时候也可以通过一个目录来加载一个模块,此时可以在该目录下的package.json
文件中定义main字段指定模块的入口文件。如果不指定则默认加载目录下的index.js
文件。
API清单
1. module
module.id
module.filename
module.children
module.parent
module.exports
module.loaded
module.paths
module.require(moduleName: string)
2. require
require(moduleName: string)
require.resolve(moduleName: string)
require.resolve.paths(moduleName: string)
3. exports
exports == module.exports