当循环调用 require() 时,一个模块可能在未完成执行时被返回。

例如以下情况:

// a.js
console.log('a 开始');
exports.done = false;
const b = require('./b.js');
console.log('在 a 中,b.done = %j', b.done);
exports.done = true;
console.log('a 结束');

// b.js
console.log('b 开始');
exports.done = false;
const a = require('./a.js');
console.log('在 b 中,a.done = %j', a.done);
exports.done = true;
console.log('b 结束');

// main,js
console.log('main 开始');
const a = require('./a.js');
const b = require('./b.js');
console.log('在 main 中,a.done=%j,b.done=%j', a.done, b.done);

当 main.js 加载 a.js 时, a.js 又加载 b.js

此时, b.js 会尝试去加载 a.js。为了防止无限的循环,会返回一个 a.js 的 exports 对象的 未完成的副本 给 b.js 模块。

然后 b.js 完成加载,并将 exports 对象提供给 a.js 模块。

当 main.js 加载这两个模块时,它们都已经完成加载。因此,该程序的输出会是:

main 开始
a 开始
b 开始
在 b 中,a.done = false
b 结束
在 a 中,b.done = true
a 结束
在 main 中,a.done=true,b.done=true

CommonJS模块的循环加载相关推荐

  1. ES6模块的循环加载

    先理解JS代码执行的过程. 1.引擎:负责整个JavaScript编译及执行的过程2.编译器:负责语法分析和代码生成3.作用域:负责收集并维护所有声明的标识符组成一系列的查询系统,确定当前执行的代码对 ...

  2. es6 循环加载ES6模块

    循环加载ES6模块 "循环加载"(circular dependency)指的是,a脚本的执行依赖b脚本,而b脚本的执行又依赖a脚本. // a.js var b = requir ...

  3. mysql_connect() 不支持 请检查 mysql 模块是否正确加载

    在上面文章的基础上配置PHP环境完成之后发现安装(discuz)论坛时候还是有问题! 函数名称                                检查结果          建议 mysq ...

  4. 基于vue的公共looploading组件(vue循环加载--组件)

    前些天做的组件,觉得挺有意思,上传到了github上 https://github.com/SwnCowDevil/my-looploading 说明:    一款基于vue的循环加载公共组件, 组件 ...

  5. boost::graph模块使用 read_graphviz 加载 GraphViz Dot 文本的示例 ,图转换为具有自定义属性的 BGL adjacency_list 图

    boost::graph模块使用 read_graphviz 加载 GraphViz Dot 文本的示例 ,图转换为具有自定义属性的 BGL adjacency_list 图 实现功能 C++实现代码 ...

  6. Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接

    Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接 上代码: <img:src="img"alt="banner" /> dat ...

  7. es6 模块的整体加载

    模块的整体加载 除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面. 下面是一个circle.js文件,它输出两个方法area和circumfere ...

  8. Linux 2.6内核的编译步骤及模块的动态加载

    本文是基于2.6的内核,也建议各位可以先看一下<Linux内核设计与实现(第二版)>作为一个基础知识的铺垫.当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块 ...

  9. Node模块引入与加载机制

    Node模块引入与加载机制 引入模块 Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获 ...

最新文章

  1. Python2.x与3​​.x版本区别
  2. linux multipath简介配置 存储设备故障 负载均衡 虚拟化工具
  3. Oracle优化11-10046事件
  4. Sublime优美设置(待续)
  5. centos6.6 源码安装mysql5.5_CentOS6.x下源码安装MySQL5.5
  6. 第二章 变量和基本类型
  7. python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件
  8. Kotlin入门(33)运用扩展属性
  9. html中使用过渡不显示,CSS3过渡不适用于显示属性
  10. 网卡设置 多网卡的7种bond模式原理
  11. RESTful WebServices Cookbook中文版
  12. @font-face 字体图标的应用
  13. project安装包_Project项目计划进度可编辑模板及安装包免费获取
  14. Fedora 13 咪咕播放器
  15. 无线传感器网络定位概念
  16. 英语语法——万法归宗
  17. Separating Skills and Concepts for Novel Visual Question Answering 论文笔记
  18. Spring Interceptor vs Filter 拦截器和过滤器区别
  19. spring jpa Specification in 查询
  20. 一篇超频菜鸟必看的基础知识大全!

热门文章

  1. NBA 投篮数据可视化,4行代码就能实现!
  2. 开发者真的喜欢开源吗?
  3. 全国大学生数学建模竞赛中,哈工大被禁用 MATLAB!
  4. 20 位行业专家共话选型经验,CSDN「选型智囊团高端研讨会」圆满落幕!
  5. 如何用 GitHub Actions 写出高质量的 Python代码?
  6. 火出B站的冠状病毒传播模拟仿真程序代码解析来啦!
  7. 如何优雅地在 Linux 上运行 QQ、微信?
  8. Spring 框架之 AOP 原理深度剖析!|CSDN 博文精选
  9. 软件正在吞噬世界!如何拯救旧金山的开发者?
  10. 如何搞懂容器的核心技术点?