执行 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

node中的优先从缓存中加载模块与模块的加载规则的更多相关文章

  1. springboot中如何向redis缓存中存入数据

    package com.hope;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jack ...

  2. saiku显示不出新的cube(加载的cube,saiku会保存到缓存中,不重新加载)

    当用workbench 修改cube后,保存到saiku路径. saiku读取该cube时,如果以前加载过该cube(同路径,同名).则不会新加载,而是用缓存中的cube,这个cube是以前的cube ...

  3. Node.js——优先从缓存加载

    main中执行require操作,目的是获取接口对象,所以多次引用b,并不会重复执行模块内部的输入输出,因为缓存中已经存在

  4. linux中的优先搜索树的实现--prio_tree【转】

    转自:http://blog.csdn.net/bailyzheng/article/details/8041943 linux中的优先搜索树的实现--prio_tree prio_tree在linu ...

  5. Android中图片的三级缓存

    为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi ...

  6. ASP.NET Core中使用EasyCaching作为缓存抽象层

    ⒈是什么? 和CacheManager差不多,两者的定位和功能都差不多. EasyCaching主要提供了下面的几个功能 统一的抽象缓存接口 多种常用的缓存Provider(InMemory,Redi ...

  7. 谈一谈SQL Server中的执行计划缓存(下)

    简介 在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法. 将执行缓存考虑在内时的流程 上篇文章中提到了查询优 ...

  8. 谈一谈SQL Server中的执行计划缓存(上)

    简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...

  9. 关于缓存中Cookie,Session,Cache的使用

    文章来源:http://canann.iteye.com/blog/1941173 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application. 其中C ...

  10. android中图片的三级缓存cache策略(内存/文件/网络)

    实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ...

随机推荐

  1. 毕昇 JDK:为啥是ARM 上超好用的 JDK

    摘要:毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能.可用于生产环境的 OpenJDK 发行版. 本文分享自华为云社区<[云驻共创]毕昇 JDK:"传奇再现&q ...

  2. 万字长文|大数据学前准备之Linux入门笔记(附资料)

    对于大数据学习而言,Linux运维可以说是必备的技能.可以不研究的过于高深,但是基本的操作和使用一定要熟练.Linux的学习需要大量的实践,本文从linux的基本知识,实战操作,到常用的指令与软件安装 ...

  3. 乐高式扩展:在Seal软件供应链防火墙中轻松集成代码规范工具

    上个月,Seal 软件供应链防火墙 v0.2(以下简称"Seal")正式发布,这一版本实现了可扩展架构,用户可以根据自身需求插件式集成原生或第三方解决方案,灵活扩展扫描能力. 在前 ...

  4. 通用漏洞评分系统 (CVSS)系统入门指南

    通用漏洞评分系统 (CVSS) 是一个公共框架 ,用于评估软件中安全漏洞的严重性.这是一个中立的评分系统,让所有企业能够使用相同的评分框架对各种软件产品(从操作系统.数据库再到 Web 应用程序)的 ...

  5. Solon Cloud 2.2.10 架构图发布

    Solon Cloud 是在 Solon 的基础上构建的微服务开发套件.以标准与规范为核心,构建丰富的开放生态.为微服务开发提供了一个通用防腐层(即不用改代码,切换配置即可更换组件). 本次发布,展示 ...

  6. PPT 玩转形状

    形状 https://www.cnblogs.com/vipsoft/p/16943810.html 形状也可以非常复杂 形状的神奇功能--合并形状 编辑顶点 https://www.cnblogs. ...

  7. 第04讲:Flink 常用的 DataSet 和 DataStream API

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...

  8. 【k8s】基础环境配置部署

    基础环境配置部署 Hzero部署练习参考文档 https://docs.qq.com/sheet/DQWxlRlBXZmJ4b01G?tab=BB08J2&_t=1684458310312&a ...

  9. 题解 | 【CF896B】 Ithea Plays With Chtholly

    题目链接:Here 给 \(m\) 个数,放到 \(1→n\) 一个位置上,若 \(1→n\) 都被填满且不下降就胜.强制在线. 看到题忽然觉得是水题,这不就最长不下降子序列的那个吗!直接上个二分就准 ...

  10. plsql打开报错:Control 'dxDockBrowserPanel' has no parent window问题解决

    一.现象: 使用plsql登陆oracle数据库时,登陆信息没有报错,但是最后一步报错,重启电脑依然没有解决 一直报:" Control 'dxDockBrowserPanel' has n ...