移动外贸网站建设/长沙专业seo优化推荐
为什么问require的模块加载机制?
这道题基本上就可以了解到面试者对node模块机制的了解程度
1.查找缓存
require会先去缓存查看,如果是以前引用过的文件,直接从缓存取出.
缓存机制,任何模块只要被加载过一次,就会被缓存起来,第二次就直接从缓存中取,
2.计算模块路径
1.判断是核心模块还是文件模块(三方模块 / 自定义模块)
此后以文件模块举例:
2.看require方法中是否写扩展名。
如果没有写扩展名:
require会按照:.js,.json,.node(c/c++编写的模块)的顺序依次去node_modules文件夹中寻找。
3.去node_modules文件夹中寻找模块
例如寻找express模块
找到:node_modules\express
4.寻找express中的package.json
在node_modules\express\package.json文件中取出main的值
调用main所指向的模块运行文件。(例如:.js、.json、.node)
如果json文件中没有main, 例如express:的json文件中就没有main
require默认执行index.js
main
属性记录了模块入口
5.调取模块文件
当require确定了具体文件时,将调取该文件。
如果第一次调取当前文件时自动执行该文件。
由下图可证,只有从缓存调用模块,不执行内部代码。
6.当前根目录不满足以上条件
如果以上条件都不满足:
require会逐层向上级目录寻找node_modules文件夹,
直至找到当前盘符。
寻找到就使用祖级目录的模块
没找到返回报错
3.加载模块
以上条件均满足后,才可以加载模块。
使用时注意:
加载的模块只能使用被公开的属性与方法
此外:
公开需要设置
exports
或者module.exports
推荐使用
module.exports
。require也是以
module.exports
为准。