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
node中的优先从缓存中加载模块与模块的加载规则的更多相关文章
- springboot中如何向redis缓存中存入数据
package com.hope;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jack ...
- saiku显示不出新的cube(加载的cube,saiku会保存到缓存中,不重新加载)
当用workbench 修改cube后,保存到saiku路径. saiku读取该cube时,如果以前加载过该cube(同路径,同名).则不会新加载,而是用缓存中的cube,这个cube是以前的cube ...
- Node.js——优先从缓存加载
main中执行require操作,目的是获取接口对象,所以多次引用b,并不会重复执行模块内部的输入输出,因为缓存中已经存在
- linux中的优先搜索树的实现--prio_tree【转】
转自:http://blog.csdn.net/bailyzheng/article/details/8041943 linux中的优先搜索树的实现--prio_tree prio_tree在linu ...
- Android中图片的三级缓存
为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi ...
- ASP.NET Core中使用EasyCaching作为缓存抽象层
⒈是什么? 和CacheManager差不多,两者的定位和功能都差不多. EasyCaching主要提供了下面的几个功能 统一的抽象缓存接口 多种常用的缓存Provider(InMemory,Redi ...
- 谈一谈SQL Server中的执行计划缓存(下)
简介 在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法. 将执行缓存考虑在内时的流程 上篇文章中提到了查询优 ...
- 谈一谈SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- 关于缓存中Cookie,Session,Cache的使用
文章来源:http://canann.iteye.com/blog/1941173 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application. 其中C ...
- android中图片的三级缓存cache策略(内存/文件/网络)
实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ...
随机推荐
- 火山引擎A/B测试在消费行业的案例实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎数智平台举办了"走进火山-全链路增长:数据飞轮转动消费新生力"的活动,其中火山引 ...
- Mongodb--用户/权限
mongodb分为管理员用户和普通用户,并且还有个验证库,建立用户时use到的库(验证库),信息就存储在admin数据库下. 在使用用户时,要加上验证库才能登录,对于管理员用户,必须在admin下创建 ...
- async await 异步下载 异步代码加锁 lock 异步缓存
async await 异步下载 异步代码加锁 lock 异步缓存 FTP异步下载代码: /// <summary> /// 异步下载文件 /// </summary> /// ...
- 《机器学习实战》 | 第3章 决策树(含Matplotlib模块介绍)
系列文章:<机器学习实战>学习笔记 本篇文章使用到的完整代码:Here 决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度 ...
- U64949 棋盘覆盖(二分图)| 二分图匹配总结
https://ac.nowcoder.com/acm/contest/1062/B [题目] 给出一张n×n(n≤100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖 ...
- 30例 | 一文搞懂python日期时间处理
前言 datetime是python的内置模块,用来处理日期和时间. 该模块常用的类有: 类名 功能说明 date 日期对象 time 时间对象 datetime 日期时间对象 timedelta 时 ...
- 航拍倾斜摄影 Web 3D GIS 数字孪生智慧火电厂
前言 7 月份,245 个国家气象站日最高气温突破 7 月历史极值:同时,疫情防控形势向好,企业加快复工达产节奏,电力负荷屡创新高.煤电作为我国最主要的电源,用不足 50% 的装机占比,生产了全国约 ...
- 实战指南 | Serverless 架构下的应用开发
作者 | 刘宇.田初东.卢萌凯.王仁达 UC Berkeley认为Serverless架构的出现过程类似于40多年前从汇编语言转向高级语言的过程,在未来Serverless架构的使用会飙升,或许服务器 ...
- SpringCloud学习 系列八、OpenFeign
系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...
- uni-app 从入门到放弃(持续更新)
https://blog.csdn.net/weixin_33940102/article/details/91460204