最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球看热讯:node中的优先从缓存中加载模块与模块的加载规则

来源:博客园


【资料图】

执行 node main.js 请问 b模块会被加载几次

//main.jsrequire("./a.js")var fn = require("./b.js")console.log(fn.say())
//a.jsconsole.log("a.js 被加载了")var fn = require("./b")
//b.jsconsole.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-47. 如果直到当前磁盘根目录还找不到,最后报错:can not find module xxxvar axios= require("axios")

证明1-2-3步骤的正确性

证明1-2-3-4步骤的正确性

需要注意的是:1.package.json 文件的书写规则,不能键名没有引号,需要注意一下{    "main": ""}

main这个选项的值如果你main的值写错了,默认加载 index.js

好消息

其实,在我们的项目中【有且只有】一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包不会出现有多个 node_modules

关键词: 重复加载 也就是说