ES module 工作原理浅谈

ES module(ECMAScript module)的工作过程涉及三个主要步骤:获取、解析和实例化。

获取步骤涉及获取所有需要的模块。当JavaScript引擎遇到import语句时,它首先查看module map是否已经有了一个与URL匹配的条目。如果没有,则会生成一个新的请求获取这个模块。

然后,JavaScript引擎解析获取到的文件,以便了解其中的模块结构。所有的模块都是在相当于文件顶部使用了严格模式下被解析的。一旦module record创建完成,它就会被放到module map里面去。

最后的步骤是实例化,JavaScript引擎生成一个模块环境记录,它管理module record的变量,然后把内存里的所有导出的变量链接起来。实例化模块图(module graph),JS引擎会使用一个深度优先后序遍历的操作。这意味着在实例化阶段,它会首先设置所有没有依赖的模块的导出,然后再设置这些模块的导入。

值得注意的是,ES module使用的是实时绑定,也就是说,导出模块和导入模块都指向同一片内存地址。如果导出模块修改了一个值,那么这个修改也会在导入模块里体现出来。

例如:
// counter.mjs
console.log('counter module evaluation');
let i = 0;
export function increment() {i++;
}
export function get() {return i;
}// main.mjs
import * as counter from './counter.mjs';
console.log('main module evaluation');
counter.increment();
console.log(counter.get());   // 1

在上述例子中,main模块导入了counter模块,并调用其导出的increment函数增加i的值。然后,通过调用get函数,我们可以看到,导出模块的i值的变化在导入模块里也得到了体现。

ES模块处理循环依赖的情况

ES模块在处理循环依赖的情况时,会采取一种特殊的机制来解决这个问题,这个机制被称为“引入赋值”。

当一个模块被第一次执行时,它会被初始化为一个未完成的状态。这意味着导入的模块只包含模块的接口,而模块的内容暂时为空。在处理循环依赖时,ES模块系统会检测到循环依赖并在其中一个模块未完成时暂停执行。

当另一个模块需要导入暂停执行的模块时,ES模块系统会返回一个接口对象,该对象是一个空对象,只包含导出的接口,而真正的内容将在依赖的模块执行完毕后被添加到该对象中。

这种机制确保了循环依赖时模块系统的稳定性和效率。虽然循环依赖在模块设计中应该尽量避免,但当不可避免时,ES模块系统的引入赋值机制能够成功解决循环依赖问题。

块的导入顺序是否会影响ES模块的实例化过程

以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述:在Element UI框架中,Cascader(级联选择器)和DateTimePicker(日期时间选择器)是两个非常实用且常用的组件,它们分别用于日期选择和多层级选择,提供了丰富的交互体验和便捷的数据…

CD4017 – 带解码输出的十进制计数器

CD4017 IC 是一个十进制计数器,它有 10 个输出,分别代表 0 到 9 的数字。计数器在(14号引脚)每个时钟脉冲上升时增加 1。计数器达到 9 后,它会在下一个时钟脉冲时从 0 重新开始。 引脚名称管脚 #类型描述VD…

python输出日志out.log相关问题(缓存机制)

现象:nohup python total_test619.py > out.log 2>&1 &,total_test619.py功能如下,首先计算13的值,然后将该值print出来,之后等待5分钟,重新运行之前的函数,输出结果,…

Coding:小写一个debugfs

目录 事先检查 开干 撸代码 上一次整活还是在上一个月,写了一个简单的module并且熟悉了module的挂载查看和卸载。这一次我们自然玩一个大的,就是利用linux的debugfs API写一个调试文件系统。 事实上,底层的API全写好了,我们就是…

arthas命令使用

dashboard(线程、内存等环境概览) jvm(JVM相关信息概览) 1、RUNTIME(系统运行环境JVM相关信息,运行时长等) 2、CLASS-LOADING(类加载信息) 3、 COMPILATION(编译信息) 4…

TimerManager和Timer

在RTSP服务器中需要一个定时器来定时发送音频帧和视频帧。音频帧每隔23ms发送一帧,视频帧每隔40ms发一帧。 因此需要两个定时器来定时发送,此时我们就需要用到一个TimerManager来管理Timer。 在TimerManager类中我们需要创建定时器文件描述符&#xff…

Qt 网络编程实战

一.获取主机的网络信息 需要添加network模块 QT core gui network主要涉及的类分析 QHostInfo类 QHostInfo::localHostName() 获取本地的主机名QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口 QNetworkInterface类 QNetworkInterfac…

Python——面向对象编程(类和对象)2

目录 私有属性和私有方法 01.应用场景及定义方式 02.伪私有属性和私有方法 继承 1.1继承的概念、语法和特点 1.继承的语法: 2.专业术语: 3.继承的传递性 1.2方法的重写 1.覆盖父类的方法 2.对父类方法进行扩展 关于super 1.3 父类的私有属性和…

一天搞定Echarts可视化!(1)——伪类的学习

在下面的课程当中,伪类是经常被使用到的一项css技术。所以这我们先进行伪类的学习来作为本次Echarts课程的前置知识。 认识“&” 在css中,“&”符号通常用于选择器中,表示选择某个元素的子元素或特定状态下的元素。 伪类 :hover—…

PID与PPID

参考文章:https://blog.csdn.net/oh_coding/article/details/128865229 PID (process ID): 进程PID是当操作系统运行进程时系统自动为其分配的标识符,具有唯一性,且为非零整数。一个PID只会标识一个进程。一旦被发放将会是终生标识…

机械拆装-基于Unity-装配功能的实现

目录 1. 装配场景的相机控制 2. 鼠标拖拽和旋转功能的实现 2.1 鼠标拖拽 2.2 物体旋转 3. 零件与装配位置的对应关系 4. 轴向装配的准备位置 5. 装配顺序的实现 5.1 标签提示 5.2 定义一个变量记录步骤数值 1. 装配场景的相机控制 开始装配功能时,需要将相机调…

在大型项目中,怎样有效地组织和管理 SCSS 文件结构以提高开发效率?

在大型项目中,组织和管理 SCSS 文件结构是非常重要的,可以提高开发效率和代码的可维护性。下面是一些有效的方法: 使用模块化和层次化的文件结构:将 SCSS 文件按照模块进行组织,每个模块包含相关的样式规则。可以使用文…

vector与list的简单介绍

1. 标准库中的vector类的介绍: vector是表示大小可以变化的数组的序列容器。 就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数…

1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码

一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统,结合react.js框架和node.js后端完成本系统,对理解react node编程开发语言有帮助系统采用node框架(前后端分离)),系统具有完整的源…

【代码随想录训练营】【Day 63】【单调栈-2】| Leetcode 42, 84

【代码随想录训练营】【Day 63】【单调栈-2】| Leetcode 42, 84 需强化知识点 单调栈强化 题目 42. 接雨水 注意 python 数组反序用法 result [::-1] class Solution:def trap(self, height: List[int]) -> int:# n len(height)# leftMax, rightMax [0] * n, [0] * …

golang 垃圾回收

gc不回收什么 GC 不负责回收栈中的内存栈是一块专用内存,专门为了函数执行而准备的,存储着函数中的局部变量以及调用栈栈中的数据可以通过简单的编译器指令自动清理,也就不需要通过 GC 来回收了 垃圾回收算法 主流的两类垃圾回收算法有两种&a…

Spring Boot中的安全漏洞防护

Spring Boot中的安全漏洞防护 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中有效防护安全漏洞。随着软件应用程序的复杂…

6种ETL计算引擎介绍

目录 一、ETL计算引擎定义 二、ETL计算引擎的功能和特性 三、6种ETL计算引擎 1、MapReduce 2、Tez 3、Spark 4、Flink 5、ClickHouse 6、Doris 一、ETL计算引擎定义 ETL(Extract, Transform, Load)计算引擎是用于执行ETL过程中数据转换阶段的关键组件之一…

mac如何压缩视频大小不改变画质,mac怎么压缩视频软件

在数字时代,视频已成为信息传递和娱乐消遣的重要媒介。然而,视频带来的愉悦体验背后,是日益增长的存储和分享压力。大视频文件不仅占用大量存储空间,上传和下载也变得异常缓慢。那么,如何才能有效压缩视频,…

ERROR: No matching distribution found for numpy

1.原因: 出现这两行英文是因为原先输入pip install numpy的方式不安全,不被信任所以无法下载。 2.解决方法: 改成以下命令执行: pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun…