模块分类
-
核心模块(原生模块)
直接使用模块标识符
引入
如:
require('fs')
-
自定义模块(用户编写模块)
通过相对路径
或绝对路径
引入(也可以用模块标识符
引入,例子见模块定位例子)
如:
require('./a.js')
require('/data/project/a.js')
require('a.js') // 查找过程见下面“模块定位”
Tips:文件后缀可省略,NodeJS会尝试给文件补上.js
、.json
、.node
模块定位
通过模块标识符引入自定义模块的查找规则:
- 取当前目录下的
node_modules
为查找路径 - 首先尝试把模块标识符当作是文件名处理(
module.js
、module.json
、module.node
) - 把模块标识符当作目录来处理(
module\package.json
、module\index.js
) - 到上一级
node_modules
,重复步骤2,3,直到根目录
例:
// 当前路径:
// C:\Users\documents\example\a.js
const moment = require('moment')
// 查找路径:
C:\Users\documents\example\node_modules\moment.js
C:\Users\documents\example\node_modules\moment.json
C:\Users\documents\example\node_modules\moment.node
C:\Users\documents\example\node_modules\moment\package.json
C:\Users\documents\example\node_modules\moment\index.js
// 向上一级查找,重复上面5步
C:\Users\documents\node_modules
C:\Users\node_modules
C:\node_modules
模块缓存
- NodeJS在首次成功加载模块之后,将模块的
绝对路径
作为key
值,将模块的执行结果
作为value
值,进行缓存,缓存在require.cache
上面。 - 下次加载直接通过绝对路径在
require.cache
里面找到缓存,不再重新加载文件 - 若想热更新加载模块(在程序运行期间再次加载这个模块),只需要把
require.cache
对应的缓存删除。例子如下:
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req,res)=>{
// 清理模块缓存
Object.keys(require.cache).forEach((key)=>{
delete require.cache[key]
})
// 重新加载
const example = require('./example')
res.statusCode = 200;
res.setHeader('Content-Type','text/plain');
res.end(example.text)
})
server.listen(port,hostname,()=>{
console.log(`Server running at http://${hostname}:${port}/`)
})
网友评论