Node.js 模块加载 机制

模块说明

在 node.js 中模块分为 3 种:内置模块、自定义模块、第三方模块。

1. 优先从缓存中加载

模块缓存机制

  • 这 3 种模块在第一次加载后都会被缓存,从而提高加载效率。这也意味着多次调用 require() 不会导致模块的代码被执行多次。

2. 内置模块和第三方模块优先级

模块优先级

  • 内置模块优先级较高。这也意味着内置模块与第三方模块同名时,加载的是内置模块

3. 自定义模块的加载机制

加载顺序

  • 加载自定义模块时需要指定路径
  • 加载自定义模块时可以省略后缀名
  • 例如:假设 demo 是个自定义模块,使用 require('./demo'),则查找顺序如下:
      1. 加载 demo 文件内容,若没有
      1. 加载 demo.js 文件内容,若没有
      1. 加载 demo.json 文件内容,若没有
      1. 加载 demo.node 文件内容,若没有
      1. 加载失败,报错

4. 第三方模块的加载机制

加载顺序

  • 加载第三方模块时也有查找顺序
  • 例如:假设 demo 是个第三方模块,使用 require('demo'),则查找顺序如下:
      1. 加载 当前文件目录中 node_modules 下的 demo 文件内容
      1. 上一层文件目录中 node_modules 下的 demo 加载文件内容
      1. 继续去 上一层文件目录中 node_modules 下的 demo 加载文件内容
      1. 直到电脑磁盘根目录,加载失败就报错

5. 使用目录作为导入标识

加载说明

  • 以目录为模块导入时,也有查找顺序 (目录一般也是自定义模块)
  • 例如:假设 demo 是个 文件目录名,使用 require('demo'),则查找顺序如下:
      1. 查看 demo 文件夹中 package.json 里的 main 属性,作为导入入口
      1. 若 demo 文件夹中不存在 package.json 或 没有 main 属性,则加载 demo/index.js
      1. 若都找不到,就会报错:Error: Cannot find module 'xxx'

6. package.json 属性节点说明

  • type: 用来指定该项目的模块化规范。module 表示使用 ES6 模块化规范,commonjs 表示使用 commonjs 模块化规范
  • name: 表示该项目的名称。如果该项目被发布到 npm ,则该属性作为 包的名字
  • version: 表示该项目的版本号。会同步到 npm
  • description: 表示该项目的表述。会同步到 npm
  • main: 为该项目提供的入口文件。外界进行导入时,要导入的那个 js 文件路径
  • types/typings: 这两个节点效果一样。用来指定声明文件的入口,例如设置为 ./index.d.ts 则引入这个包就会具有 ts 的类型检测和代码提示功能(需要在 index.d.ts 中定义)
  • scripts: 收集脚本。可以用 npm run ... 来执行
  • keywords: 表示包关键字。会同步到 npm
  • auther: 指定包的作者。
  • license: 指定包的代码协议
上次更新:
贡献者: 唐干宵