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属性,可以不用导出了
污染全局,不建议使用