require 静态 *** (require模块加载函数详解)

生活常识 2023-04-16 17:35生活常识www.baidianfengw.cn

模块已加载。require模块加载功能的详细说明。

1、require 是一个函数,还挂载着四个属性

require.resolve分析文件是否存在,如果存在则返回文件的绝对路径,否则将报告require.main当前所在文件的模块信息。require.extensions对象存储可以解析的文件类型。require.cache对象有三种类型,即。js,json和。节点,存储缓存的模块(文件的绝对路径是键名,

2、require 函数的参数说明

中只有一个参数。参数类型都是字符串。参数可以是module(本机内置fs/http/path/https等。第三方包模块express、koa等。)路径文件基本名称(。/express当前路径,/express父路径,/Express绝对路径)路径文件基本名称文件扩展名(。/express.js当前路径,/express.json父路径,express.node的绝对路径)

3、reqiure 调用的时候

-如果是引用. js文件-fs模块同步读取文件-包装fs模块同步读取的内容-调用vm的runInThisContext 将包装器字符串解析成JavaScript-调用匿名函数,传递参数,返回module.exports的赋值-如果是引用. json文件-fs模块同步读取文件后,使用 ON.parse()解析返回结果。-如果引用. node文件-通过dlopen() 加载上一次编译生成的对象,并返回结果。

4、require 加载规则

加载规则参考地址

https://www.jianshu.com/p/a309864c8357 https://blog.csdn.net/u010476739/article/details/80925128 https://www.cnblogs.com/zhoulixue/p/模块类型由8757546.html、http://www.javashuo.com/article/p-bywkbpzj-d.html和https://juejin.cn/post/6844903704123211783:加载

1.原生内置模块存储在原生内置模块缓冲区,缓存结果直接返回。如果本机内置模块代码没有存储在本机内置模块缓冲区中,则执行本机内置模块代码,并将模块添加到缓冲区中。并返回执行结果。2.路径文件模块(1)和构造文件的绝对路径列表具有后缀名称(。js |。json |。节点),并使用path . resolve( ;路径与路径。)来拼接绝对路径。推送文件绝对路径列表中没有后缀。使用path . resolve( ;路径与路径。 js )来拼接绝对路径。json文件,并使用path . resolve( ;路径与路径。 json )来拼接绝对路径。 ON文件。推送文件绝对路径列表。路径与路径。 节点 )来拼接绝对路径。节点文件,以及path . resolve( ;路径与路径。)目录是否存在于推送文件绝对路径列表中,package.json文件是否存在,main属性是否存在(如果main没有指定扩展名,那就用。js |。json |。节点,并按顺序搜索)有使用path . resolve(path . Jon( ;路径与路径。 主属性值 )),并且推送的文件列表中没有绝对路径的文件。Index.js ))拼接一个绝对路径。js文件,拼接一个绝对路径。带有path . resolve(path . Jon( ;路径与路径。 ))获取推送文件的绝对路径列表,并使用path . resolve(path . Jon( ;路径与路径。 指数和指数。)获取推送文件绝对路径列表。

绝对路径的 .node 文件,推入 文件绝对路径列表 不存在 使用path.resolve(path.jon(#34路径#34,#39index.js#39)) 拼接一个绝对路径的 .js 文件,推入 文件绝对路径列表 使用path.resolve(path.jon(#34路径#34,#39index.json#39)) 拼接一个绝对路径的 .json 文件,推入 文件绝对路径列表 使用path.resolve(path.jon(#34路径#34,#39index.node#39)) 拼接一个绝对路径的 .node 文件,推入 文件绝对路径列表 (2)、遍历文件绝对路径列表 ,查看是否在require.cache[#39文件路径#39]缓冲区中 存在 读取缓冲区中的模块,不执行文件模块的代码,直接返回缓存的结果(require.cache[#39文件路径#39].exports) 不存在 报错找不到模块

3、第三方包模块 (1)、获取模块可能存在的目录列表 module.paths (2)、构建 文件绝对路径列表 遍历 目录列表 module.paths 之一个元素 使用(path.join(目录元素,包名+#34.js#34) 拼接一个绝对路径的 .js 文件,推入 文件绝对路径列表 使用(path.join(目录元素,包名+#34.json#34) 拼接一个绝对路径的 .json 文件,推入 文件绝对路径列表 使用(path.join(目录元素,包名+#34.node#34) 拼接一个绝对路径的 .node 文件,推入 文件绝对路径列表 判断 path.join(目录元素,包名) 目录是否存 存在 判断目录下是否存在package.json文件 存在 是否存在main属性 存在 使用 path.jon(目录元素#34,包名,#39main属性值#39)) 拼接一个绝对路径的文件,推入 文件绝对路径列表 不存在 使用 path.jon(目录元素#34,包名,#39index.js#39)) 拼接一个绝对路径的文件,推入 文件绝对路径列表 使用 path.jon(目录元素#34,包名,#39index.json#39)) 拼接一个绝对路径的文件,推入 文件绝对路径列表 使用 path.jon(目录元素#34,包名,#39index.node)) 拼接一个绝对路径的文件,推入 文件绝对路径列表 不存在 继续遍历 目录列表 module.paths 不存在 继续遍历 目录列表 module.paths (3)、遍历文件绝对路径列表,查看是否在require.cache[#39文件路径#39]缓冲区中 存在 读取缓冲区中的模块,不执行文件模块的代码,直接返回缓存的结果(require.cache[#39文件路径#39].exports) 不存在 报错找不到模块

5、require 3种文件的加载方式

如果是.js文件,则经过fs模块同步读取文件为字符串,然后包装字符串为匿名函数字符串,然后使用vm.runInThisContext执行为JavaScript代码,调用传参。 如果是.json文件,则经过fs模块同步读取文件以后用 ON.parse() 解析返回结果 如果是.node文件,则经过 dlopen() 加载编译生成的对象。.node 是C/C++编写的扩展文件

require 静态 require 静态

Copyright@2015-2025 白癜风网版板所有