[NodeJS]Node模块笔记

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

猜你喜欢

转载自www.cnblogs.com/joyjoe/p/10239687.html