美文网首页
NodeJS模块

NodeJS模块

作者: One_Hund | 来源:发表于2018-09-16 23:03 被阅读0次

模块分类

  • 核心模块(原生模块)
    直接使用模块标识符引入
    如:
require('fs')
  • 自定义模块(用户编写模块)
    通过相对路径绝对路径引入(也可以用模块标识符引入,例子见模块定位例子)
    如:
require('./a.js')
require('/data/project/a.js')
require('a.js') // 查找过程见下面“模块定位”

Tips:文件后缀可省略,NodeJS会尝试给文件补上.js.json.node

模块定位

通过模块标识符引入自定义模块的查找规则:

  1. 取当前目录下的node_modules为查找路径
  2. 首先尝试把模块标识符当作是文件名处理(module.jsmodule.jsonmodule.node
  3. 把模块标识符当作目录来处理(module\package.jsonmodule\index.js
  4. 到上一级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}/`)
})

相关文章

网友评论

      本文标题:NodeJS模块

      本文链接:https://www.haomeiwen.com/subject/drwfnftx.html