NodeJs 中的 require 的执行逻辑

  • resolution,基于入参拼接出 require 文件的绝对路径。当路径不含有后缀名的时候,会按照 Node 的模块解析策略来处理。需要注意的是,在浏览器中,require 需要带上完整的后缀名,但是一般 bundler 会辅助你处理好。
  • 基于绝对路径,去 require.cache 查找文件是否缓存,如果存在就直接使用缓存的文件内容。
  • loading,基于绝对路径实例化一个 Module 实例,基于路径名调用内置的处理函数。比如 js 和 json 文件都是通过 fs.readFileSync 读取文件内容的。
  • wrapping,对于 js 文件,将文件内容字符串包裹一个函数,执行这个函数。对于 json 文件,将内容包裹挂载到 module.exports 下。
  • evaluating,执行文件内容。
  • caching,对于未缓存的文件,将执行结果缓存起来。