美文网首页
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