1-14node中的commonjs规范的实现

发布于 2022年 04月 11日 14:15

node中的模块 1.内置模块、核心模块 2.第三方模块 commander/co 3.文件模块

es6Module“静态”导入,comminjs模块“动态导入”

commonjs模块定义了自己的规范,导入和导出

一个包中含有多个模块(每个包都必须配置一个package.json文件)

es6Module和commonjs读取文件的不同

module.exports原理

模块实现原理(看源码,先横向扩展,再纵向深入。避免一个函数看到底)

1.实现一个require方法

2.Module._load实现模块的加载

3.Module._resolveFilename返回被require的文件的绝对路径

4.保存文件的绝对路径————实现模块的缓存

module.exports会在第一次缓存起来,后续再去使用的话,取上次的返回值

导出的结果如果是对象,内部属性变了会有影响

es6使用export{},导出的是一个变量(接口),如果内部对应的值发生变化是有影响的

5.会尝试加载是不是一个原生模块,如果带相对路径、绝对路径,就不是核心模块

6.根据文件路径创建一个模块

Module方法内部(一个模块必须有三个属性:id,path,exports)

7.模块的加载

load方法内部

8.记载模块时会构建一个paths属性,这个属性就是第三方模块的查找路径

9.取出文件的后缀 Module._extensions调用对应加载模块的策略

extensions内部

10.读取文件内容 对字符串进行编译compile

compile内部

11.wrapSafe安全包裹,在文件内容外部包裹一层

Module.wrap

Module.wrap内部

runInThisContext将函数变成js去执行

默认的this是空对象

文件内容是hello

将文件内容赋值给module.exports

12.最终require方法会拿到module.exports返回结果

概述require方法做了哪些操作?

将文件路径转为绝对路径,并且读取文件内容,为其包装一个函数,使函数执行,将文件内容赋值给module.exports,最终返回module.exports。

推荐文章