模块的内容

  • 通过require()方法,传入模块的标识,引入模块
  • 模块标识的可以是小驼峰命名的字符串或者是.\或者..\开头相对路径或者绝对路径

    1. var http = require('http');
    2. var moduleA = require('./moduleA');
  • 每个模块存在一个module对象,代表模块本身

  • 每个模块都有独立的作用域
  • 通过上下文提供exports对象用于当时模块的方法和变量,同时exports是module的一个属性

    1. module.exports.fn = function(){}
    2. module.exports = function(){}

    模块分类

  • 核心模块:直接使用模块名引入,eg:require(‘fs’)

  • 用户编写模块:通过相对路径或者绝对路径引入,eg:require(‘./a.js’);require(‘/data/project/a.js’)

提示:文件的后缀可省略,NodeJs尝试给文件补上.js,.json,.node

模块定位

image.png

  • 取当前目录下的node_modules为查找路径
  • 首先尝试把模块标识符当作文件名处理
  • 把路径当作目录(包)来处理
  • 去上一级node_modules重复上面2,3步骤,知道找到根目录位置

    模块缓存

    NodeJs在成功引入一个模块的时候,会把模块的绝对路径作为key,把模块的执行结果作为value存在require.cache。下次加载模块的时候回通过绝对路径找到缓存,若要更新模块需要重启或者把require.cache缓存删除掉
    1. // 清理模块缓存
    2. Object.keys(require.cache).forEach(function(key){
    3. delete require.cache[key];
    4. })

    模块输出

    nodeJS通过exports和require两个对象实现模块通信。exports是模块对外的公开接口,require从外部获得其他模块exports的对象