Node.js之循环依赖
在Node.js中有可能会出现循环依赖的问题,在此做一个简单的记录
假如有一个模块A:
exports.loaded = false;
const b = require('./b');
module.exports = {
bWasLoaded: b.loaded,
loaded: true
};
假如有一个模块B:
exports.loaded = false;
const a = require('./a');
module.exports = {
aWasLoaded: a.loaded,
loaded: true
};
我们在main.js中调用他们:
const a = require('./a');
const b = require('./b');
console.log(a);
console.log(b);
这就是一个循环依赖的问题,a中加载了b,b中加载了a,我们看一下输出结果:
{ bWasLoaded: true, loaded: true }
{ aWasLoaded: false, loaded: true }
可以发现,虽然循环依赖了 ,但是并没有造成死循环,这是怎么做到的呢?
原理就是模块加载过程的缓存机制,Node对模块的加载做了缓存的,可以通过require.cache访问到,这样看来上边的内容就比较好理解了 。
在加载a的时候,a是没有缓存的,当a的代码走到加载b的时候,就进入了模块b中,依次调用代码,当在b中加载a的时候,这时候a已经被缓存了,因此会使用缓存值,这个时候b加载后的结果是:
{
aWasLoaded: false,
loaded: true
}
b加载完成后,a模块继续走自己的代码,因此这是a的结果就是:
{
aWasLoaded: true,
loaded: true
}
调用const b = require('./b');这段代码时,因为b已经缓存了,所以不会冲走b模块的代码,所以最后打印的结果是:{ aWasLoaded: false, loaded: true }
用比较专业的话来说,就是循环依赖会导致模块加载时的缺失现象
更相信的内容,可以看这篇文章Node.js 中的循环依赖 - 网道
Node.js之循环依赖的更多相关文章
- Node.js的循环依赖
我们知道在实际编程过程中,要尽可能的减少或者规避循环依赖情况的发生.但在现实环境中,有时却不得不产生循环依赖.Node.js不提倡使用循环依赖,但真有如此情况发生时Node.js也有办法解决.这篇博文 ...
- Node.js 事件循环(Event Loop)介绍
Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...
- Node.js事件循环
Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...
- 6、Node.js 事件循环
#########################################################################################Node.js 事件循 ...
- Node.js 事件循环机制
Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...
- Node.js 事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...
- Node.js的循环与异步问题
(转自:http://bbs.tianya.cn/post-itinfo-280080-1.shtml) Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯 以后就会 ...
- Node.js 学习(五)Node.js 事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...
- js和循环依赖
kmdjs和循环依赖 循环依赖是非常必要的,有的程序写着写着就循环依赖了,可以提取出一个对象来共同依赖解决循环依赖,但是有时会破坏程序的逻辑自封闭和高内聚.所以没解决好循环依赖的模块化库.框架.编译器 ...
随机推荐
- base64随机字符混淆加密、解密-美拍视频地址解密,反推加密算法
用火车头测试采集美拍的数据时无意中发现美拍的视频地址是一段加了混淆字符串的base64代码.如下图 于是好奇之下研究了下解密算法.具体过程省略800字.发现美拍的视频解密是通过js完成,于是找到了具体 ...
- JavaScript事件循环(Event Loop)机制
JavaScript 是单线程单并发语言 什么是单线程 主程序只有一个线程,即同一时间片断内其只能执行单个任务. 为什么选择单线程? JavaScript的主要用途是与用户互动,以及操作DOM.这决定 ...
- 工作常用git命令
克隆项目 git clone gitssh地址 提交前的准备 git config user.name 您的中文名 git config user.email 公司邮箱 获取分支 #### 将远端分支 ...
- 我的hibernate学习记录(一)
之前已经过滤一下hibernate的简单的用法,但是近期有点时间,所以重新看下视频,敲下代码,翻下笔记,写博客与大家分享一下. hibernate简介 Hibernate是一个开放源代码的对象关系映射 ...
- 团队作业8----第二次项目冲刺(Beta阶段) 第六天
BETA阶段冲刺第六天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 重复部分可以用红色字体显示 (2) 今天计划完成的工作 (3) 工作中遇到的困难: 尤少辉:在测试的时候,当队友提出 ...
- JAVA基础第二组(5道题)
6.[程序6] 题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 1.程序分析:利用辗除法. package com.niit.homework1; import java.ut ...
- 【Beta阶段】第五次scrum meeting
Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 查阅换肤功能相关资料 100% 着手联网功能 100 DEV 完成分享邀请 ...
- KKlist团队目录
KKlist团队目录 一.Daily Scrum Meeting[Alpha] 4.22 day one 4.23 day two 4.24 day three 4.25 day four 4.26 ...
- 201521123003《Java程序设计》第4周学习总结
1. 本章学习总结 你对于本章知识的学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 参考资料: 百度脑图 XMind 1.2 使用常规方法总结其他上课内容. (1)了解了类型转换(cast) ...
- 201521123062《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 多态定义:同种形态不同定义 类注释格式 继承,共同行为及属性 在instanceof检查过后 ...