Skip to content

CommonJS模块查找策略

CommonJS,最初用于Node.js,对于require语句引入的模块,采取以下查找策略:

  1. 文件模块: 如果路径是一个相对路径(如./module)或绝对路径(如/path/to/module),Node.js会先尝试按照给出的路径查找文件。如果有相应的文件名直接匹配,则加载该文件;否则,会尝试添加.js.json.node等后缀名。
  2. 目录模块: 如果路径是一个目录,Node.js会查找该目录下的package.json文件,并根据其main字段指定的文件名进行加载。如果没有package.jsonmain字段,Node.js会尝试加载目录下的index.jsindex.node文件。
  3. 内置模块: 如果模块名对应一个Node.js的内置模块(如fshttp),那么就直接返回该模块,不进行文件查找。
  4. node_modules查找: 如果上述步骤都未能解析模块,Node.js会在当前文件夹的父目录中查找node_modules文件夹,并尝试在其中查找模块。这一过程会一直向上递归至文件系统的根目录。

ESM模块查找策略

ESM(ECMAScript Modules),是ECMAScript的官方模块系统,用importexport语句来导入导出模块。其查找策略与CommonJS相似,但有以下区别:

  1. 文件扩展名: 在ESM中,导入模块时必须指定文件的完整路径和扩展名(如.js.mjs)。ESM不直接支持将一个目录作为导入路径的方式。如果你希望通过ESM导入一个目录下的模块,你需要指定目录中具体文件的路径,包括扩展名(如import { something } from './someDir/index.js';
  2. URL支持: ESM支持直接通过URL导入模块。
  3. node_modules查找: 在nodejs环境中,ESM支持从node_modules目录查找模块,查找逻辑与CommonJS相似,但更严格地遵守文件扩展名和路径的准确性。但是注意在浏览器环境中,并不支持,必须要给上全路径

node_modules第三方库模块的路径导入方式,也被称为bare import