node中的优先从缓存中加载模块与模块的加载规则
执行 node main.js 请问 b模块会被加载几次
//main.js
require('./a.js')
var fn = require('./b.js')
console.log(fn.say())
//a.js
console.log('a.js 被加载了')
var fn = require('./b')
//b.js
console.log('b.js 被加载了')
module.exports.say = function () {
console.log('我是b文件中的函数')
}
reuqire优先从缓存中去加载
在执行 main.js的时候,请问 b.js 文件会被加载几次?
有些小伙伴可能会说加载1次,有些小伙伴可能会说加载2次.
答案:只会加载 1次。
由于 b.js 在a.js文件中已经加载过一次了。
虽然在 main.js中虽然你引入了但是并不会再去加载。
因此:node加载模块的时候,优先从缓存中去加载模块。
这样做的目的是为了避免重复加载。
那在main.js中引入b模块有什么作用呢?
这样可以拿到其中的接口对象,但是不会重复执行里面的代码
node加载第三方模块的规则
通过 npm 下载的模块,使用 let xx= require('包名')来进行加载
当它加载的时候规则如下:
1.先找到当前文件所处目录中的 node_modules 目录,没有的话
2.然后去找node_modules/axios/package.json 文件
3.然后去找 node_modules/axios/package.json 文件中的 main 属性,
main属性中记录了axios的入口模块,然后加载使用这个第三方包。
4.如果 package.json 文件不存在或者 main 指定的入口模块是也没有的。
则 node 会自动找该目录下的 index.js文件进行加载,
也就是说 index.js 会作为一个默认备选项
5. 如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录中去查找。
查找的时候会重复1-2-3-4。
6.如果上一级还没有,则继续往上上一级查找,查找的时候会重复1-2-3-4
7. 如果直到当前磁盘根目录还找不到,最后报错:
can not find module xxx
var axios= require('axios')
证明1-2-3步骤的正确性
证明1-2-3-4步骤的正确性
需要注意的是:
1.package.json 文件的书写规则,不能键名没有引号,需要注意一下
{
"main": ""
}
main这个选项的值如果你main的值写错了,默认加载 index.js
好消息
其实,在我们的项目中【有且只有】一个 node_modules,
放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包
不会出现有多个 node_modules
遇见问题,这是你成长的机会,如果你能够解决,这就是收获。
作者:晚来南风晚相识
出处:https://www.cnblogs.com/IwishIcould/
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
出处:https://www.cnblogs.com/IwishIcould/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
支付宝
微信
如果文中有什么错误,欢迎指出。以免更多的人被误导。