1-15node中commonjs规范的实现

发布于 2022年 01月 21日 12:37

▲实现myRequire整体流程如下:

▲把文件名解析成一个绝对路径出来

定义类Module

打印出没有文件后缀的路径

判断文件是否存在,不存在就不用加后缀了

定义文件后缀的策略,以便未来方便对后缀进行修改

Reflect.ownKeys取出对象

根据keys(上文定义的文件策略)逐个匹配,匹配到了就返回

▲获取到文件路径后,创造模块

new Module

Module._cache 做缓存 第一次加载则创造缓存

▲模块的加载

获取模块中的内容,包装函数,让函数执行,用户的逻辑会给module.exports赋值

封装module.load

拿到文件的扩展名

根据扩展名找到对应的策略

试运行

拿到文件脚本

拿到模板字符串

将模板字符串编译为函数

实现一个简写

thisValue

改变this指向

执行

json类型的文件

json文件的写法

对于json文件,直接将json挂载到exports对象上

执行

加缓存的作用——多次require也不会多次加载

注意:node中不能同时支持批量导出和导出某个属性

可以这样

▲总结

最终用户使用的结果都来自于module.exports,如果只是改变exports引用,不会影响module.exports的值...

直接使用global属性,可以不用导出了

污染全局,不建议使用

推荐文章