1-15node中commonjs规范的实现

105 阅读1分钟

▲实现myRequire整体流程如下:

image.png

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

image.png

image.png

定义类Module

image.png

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

image.png

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

image.png

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

image.png

Reflect.ownKeys取出对象

image.png

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

image.png

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

new Module

image.png

image.png

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

▲模块的加载

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

封装module.load

image.png

拿到文件的扩展名

image.png

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

image.png

试运行

image.png

拿到文件脚本

image.png

拿到模板字符串

image.png

将模板字符串编译为函数

image.png

实现一个简写

image.png

thisValue

image.png

改变this指向

image.png

执行

image.png

json类型的文件

json文件的写法

image.png

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

image.png

执行

image.png

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

image.png

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

image.png

可以这样

image.png

▲总结

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

image.png

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

image.png

image.png

污染全局,不建议使用

image.png