为什么需要模块
- 避免全局变量污染
- 让程序变得有条理
- 适应时代的发展
commonJS规范
commonJS主要分为模块的饮用、模块的定义和模块标志3个部分。
我们通过require(path)引入一个模块的api到当前的上下文;通过exports或者exports.module定义的对象,将属性进行导出(这两个没事不要一起用);而模块标志则是传给require的参数,他可以是一个路径,也可以是一个第三的包。
举例:
image.png
模块的实现
当我们拥有了一些带模块的文件之后,node是如何引入的呢?
针对路径:它首先会检查核心模块,如http、fs、path等,然后检查相对路径,接着是绝对路径,最后才是非路径形式的文件模块。
针对文件:node会按照.js => .node => .json的次序进行文件补齐。一个文件夹如果package.json没有指定路口,那么默认去找index,并按照上述后缀进行补齐查找。而这个顺序也是文件编译的书序。
js的核心编译过程
node借助v8会将js模块文件编译成C/C++代码,然后在node启动进程时,将js代码加载进内存,同时js核心模块通过标志符分析定位到这个内存,经过包装、执行然后导出了exports对象。