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。