怎么在节点。js中使用模块模块?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>系统模块强>
- <李>
核心模块(本机模块)、http、缓冲区,fs等,底层调用的内建模块(C/c++);
李> <李>C/c++模块(内置的内建模块),供本地模块调用;
李><强>第三方模块强>
- <李>
第三方维护的模块,比如快递、高雅,时刻。李js等;
> <李>本地维护的模块(以路径形式的文件模块)比如,. ./开头的;
李><强>文件形式强>
- <李>
javaScript模块,模块。李js;
> <李>json模块,模块。李json;
> <李>C/c++模块,编译后扩展名为.node,模块。李节点;
> <强>加载机制强>
<强>加载步骤强>
经历路径分析,文件定位和编译执行。
<强>加载顺序强>
- <李>
系统缓存,一个模块被执行后会被缓存起来,提高再次加载速度;
李> <李>系统模块,即原生模块,部分核心模块已经被编译成二进制,省略了路径分析,文件定位,会直接被加载到了内存中,其中系统模块定义在源码的自由目录下;
李> <李>文件模块,优先加载。,. ./开头的,会依次按照. js, . json。节点进行扩展名补足尝试(文件没有加上扩展名),最好还是加上文件的扩展名。
李> <李>目录模块,文件模块加载过程中,没有找的到,但发现一个同样的目录名,就会将这个目录当作一个包来处理。这块采用了Commonjs规范,在文件包。json中查找;
李> <李>node_module模块,如果系统模块,路径文件模块都找不到,节点。js会从当前模块的父目录开始查找,直到系统的根目录;
李>
<强>关于缓存问题强>
模块缓存后,可以通过要求。缓存查看已缓存的模块。
//,模块文件,require.module.js module.exports =, { ,,名字:& # 39;公关# 39; 说才能(){,} }
//,引用模块文件,require.cache.js 要求(& # 39;。/require.module& # 39;); console.log (& # 39; require.cache ——安康;& # 39;); console.log (require.cache);
<强>对象引用强>
1。导出与模块。出口关系
const exports =, module.exports;
所以就不能改变出口的指向,可以这样
exports.info =, { ,,名字:& # 39;公关# 39; ,,年龄:30岁 } module.exports =, { ,,名字:& # 39;公关# 39; ,,年龄:30岁 }
<>强模块循环引用强>
模块moduleA。js和moduleB。js两个模块互相引用,会怎样?
//, moduleA.js console.log(& # 39;模块,moduleA& # 39;); 时间=exports.name & # 39; moduleA 名字# 39;; age =, 27岁; const moduleB =,要求(& # 39;。/moduleB.js& # 39;); console.log (& # 39; moduleA require  moduleB =祝辞& # 39;,,moduleB.name);
//, moduleB.js console.log(& # 39;模块,moduleB& # 39;); 时间=exports.name & # 39; moduleB 名字# 39;; const moduleA =,要求(& # 39;。/moduleA.js& # 39;); console.log (& # 39; moduleB require  moduleA =祝辞& # 39;,,moduleA.name);
- <李>
启动模块节点moduleA。js,会打印模块moduleA;
李> <李>模块moduleA。js中加载moduleB。js,打印模块moduleB;
李> <李>模块moduleB。js中又加载moduleA。js,此时模块moduleA。js还没有执行完,返回模块moduleA。js的出口对象给到模块moduleB。李js;
> <李>模块moduleB。js加载完后,其中有个moduleA。js中挂载了全局的变量的年龄,所以能打印出来,最后将模块moduleB。js的出口对象给到模块moduleA。李js;
>很有意思的是,在代码执行前,会用一个封装器将执行代码段封装起来