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