JavaScript语法特性篇-动态导入 import()

1、基本使用

import() 语法,通常被称为动态导入,是一个类似函数的表达式,它允许异步和动态地将 ECMAScript 模块加载到一个可能不是模块的环境中。

与声明式的导入相对应,动态导入只在需要时进行计算,并且允许更大的语法灵活性。

简单来说,使用 import() 语法,你可以在运行时(而不是在编译时)决定要导入哪个模块,并且这种导入是异步的,不会阻塞代码的执行。

await import('/modules/my-module.js')

2、与静态导入区别

静态导入是在 JavaScript 模块中声明时直接指定要导入的模块,是 ES6 中标准导入的方式。

// mathFunctions.js  
export function add(a, b) {  return a + b;  
}  export function subtract(a, b) {  return a - b;  
}// main.js
// 静态导入 mathFunctions.js 中函数
import { add, subtract } from './mathFunctions.js';  console.log(add(1, 2)); // 输出 3  
console.log(subtract(3, 1)); // 输出 2

动态导入使用 import() ,其调用非常类似于函数调用语法,但 import 本身是一个关键字,不是一个函数。它返回一个 Promise,这个 Promise 解析为导入的模块对象。

假设需要再用户点击按钮后才加载并执行某个模块中的代码,可以采用点击时触发动态导入。

// button.js  
document.querySelector('#loadModuleButton').addEventListener('click', async () => {  try {  const module = await import('./dynamicModule.js');// dynamicModule.js 导出了一个名为 dynamicFunction 的函数  console.log(module.dynamicFunction());} catch (error) {  console.error('Error loading module:', error);  }  
});// dynamicModule.js  
export function dynamicFunction() {  return 'This is a dynamically loaded function!';  
}

当用户点击 ID 为 loadModuleButton 的按钮时,JavaScript 会异步加载并执行 dynamicModule.js 文件中的代码。

3、动态导入使用场景

导入声明语法(如 import something from "somewhere")是静态的,并且总是在加载时评估导入的模块。动态导入允许人们绕过导入声明的语法刚性,并条件性地或按需加载模块。以下是可能需要使用动态导入的一些原因:

  1. 当静态导入显著减慢代码加载速度或增加程序内存使用,并且你导入的代码被使用的可能性很低,或者直到稍后才需要它

  2. 当你要导入的模块在加载时不存在

  3. 当导入标识符字符串需要动态构造时。(静态导入仅支持静态标识符)

  4. 当被导入的模块有副作用,而你不想在条件不满足时产生这些副作用

  5. 当你处在一个非模块环境(例如,eval 或一个脚本文件)时

仅在必要时使用动态导入。对于加载初始依赖项,静态形式更可取,并且可以更容易地从静态分析工具和“树摇”中受益。

如果你的文件不是作为模块运行的(如果它在 HTML 文件中被引用,则 <script> 标签必须具有 type="module"),你将无法使用静态导入声明,但异步动态导入语法始终可用,允许你将模块导入到非模块环境中。

并非所有执行上下文都允许动态模块导入。例如,import ()可以在主线程、共享工作线程或专用工作线程中使用,但是如果在服务工作线程或工作线程中调用,则会抛出。

4、模块命名空间对象

模块命名空间对象是一个描述模块所有导出的对象。它是在模块评估时创建的静态对象。

有两种方法可以访问模块的模块命名空间对象:

  • 通过命名空间导入(import * as name from moduleName

  • 通过动态导入的 Promise fullfilled 值。

模块命名空间对象是一个封闭的、没有原型的对象。这意味着该对象的所有字符串键都对应于模块的导出,并且永远不会有多余的键。所有键都按照字典顺序可枚举(即 Array.prototype.sort() 的默认行为),默认导出可用作名为 default 的键。此外,模块命名空间对象有一个 @@toStringTag 属性,其值为 “Module”,可通过 Object.prototype.toString() 方法获取。

当你使用 Object.getOwnPropertyDescriptors() 获取属性的描述符时,字符串属性是不可配置的和可写的。但是,它们实际上是只读的,因为你不能将一个属性重新赋值为一个新值。这种行为反映了静态导入创建“实时绑定”的事实——这些值可以由导出它们的模块重新赋值,但不能由导入它们的模块重新赋值。属性的可写性反映了值可能会改变的可能性,因为不可配置和不可写的属性必须是常量。例如,你可以重新分配一个变量的导出值,并在模块命名空间对象中观察到新值。

每个模块标识符都对应一个唯一的模块命名空间对象,因此以下两个导入方式得到的模块命名空间对象是一致的:

import * as mod from "/my-module.js";import("/my-module.js").then((mod2) => {console.log(mod === mod2); // true
});

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

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

相关文章

Vue脚手架插槽 slot 学习

slot插槽 <slot></slot> 1. 默认插槽 引入&#xff1a;原本的分类组件是显示的文字&#xff0c;但现在某些需要换成图片 / 视频&#xff0c;用很多的 v-show 去控制就很麻烦 作用&#xff1a;直接把组件标签中的所有内容放到想要放的位置 App.vue <templa…

数据模型(models)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 &#xff08;1&#xff09;在App中添加数据模型 在app1的models.py中添加如下代码&#xff1a; from django.db import models # 引入django.…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…

谐波减速器行业发展速度有望加快 工业机器人领域为其最大需求端

谐波减速器行业发展速度有望加快 工业机器人领域为其最大需求端 谐波减速器指通过增大转矩、降低转速等方式实现减速目的的精密传动装置。谐波减速器具有轻量化、体积小、承载能力大、精度高、可靠性高、运行噪音小等优势&#xff0c;广泛应用于工业机器人、半导体制造、精密医…

AWS中国云配置强制MFA策略后导致AWS CLI和IDEA中无法使用问题

问题 之前的文章《AWS中国IAM用户强制使用MFA》&#xff0c;启用必须使用MFA策略才能使用AWS服务。但是&#xff0c;开启之后&#xff0c;遇到了本地开发环境的IDEA和AWS CLI不能正常调用ssm的配置中心问题。 解决思路 在本地配置文件中&#xff0c;配置使用能够正常使用ssm…

web开发前后端分离

文章目录 1.广义上的前后端分离 1.广义上的前后端分离 优点&#xff1a; 1.前后端分离&#xff0c;便于后期维护;2.前端服务器只需要返回静态界面&#xff0c;后端服务器只提供增删查改的数据返回&#xff0c;把数据的转换逻辑的处理压力转移到了客户端;

Eureka服务发现机制解析:服务实例的唯一标识

引言 Eureka是Netflix开源的服务发现框架&#xff0c;它是Spring Cloud体系中的核心组件之一。在微服务架构中&#xff0c;服务实例的动态注册与发现是实现服务间解耦和通信的关键。Eureka通过提供服务注册中心&#xff0c;使得各微服务实例能够注册自己并发现其他服务实例。本…

Android Java、NDK/JNI、C++打印log

目录 一、Java上层打印log二、Android Studio NDK/JNI中打印log2.1 示例2.2 log类型 三、Native层打印LOG3.1 Liblog 库3.2 Liblog的用法3.3 输出ALOGV等级的log3.4 FUNCTION与func的区别 一、Java上层打印log Android的Java程序直接调用android.util.Log类来输出Log即可。 Lo…

MySQL 8版本的新功能和改进有哪些?(MySQL收藏版)

目录 1. 简单介绍 2. 发展历史 3. MySQL 8产品特性 4. 数据库性能重点分析 1. 原生 JSON 支持改进 2. 隐式列优化 3. 改进的查询优化器 4. 并行查询 5. 分区表改进 MySQL 是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典公司 M…

了解SD-WAN与传统WAN的区别

近年来&#xff0c;许多企业选择了SD-WAN作为他们的网络解决方案。云基础架构的SD-WAN不仅具备成本效益&#xff0c;而且提供更安全、更可靠的WAN连接&#xff0c;有助于实现持续盈利。客户能够更好地控制他们的网络&#xff0c;个性化定制且无需额外成本。 那么&#xff0c;为…

服务器数据恢复—raid故障导致部分分区无法识别/不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障&#xff1a; RAID中多块磁盘出现故障离线导致RAID瘫痪&#xff0c;其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区&#xff0c;备份文件存放在E分区。由于RAID瘫…

LabVIEW火箭发动机试车台程序

火箭发动机试车台是火箭发动机研制过程中的关键环节之一&#xff0c;通过模拟实际工作环境对发动机进行测试&#xff0c;确保其性能和可靠性。随着科研需求的不断变化和技术的进步&#xff0c;对试车台的灵活性、可靠性和易维护性提出了更高的要求。基于LabVIEW开发的试车台程序…

[信号与系统]模拟域中的一阶低通滤波器和二阶滤波器

前言 不是学电子出身的&#xff0c;这里很多东西是问了朋友… 模拟域中的一阶低通滤波器传递函数 模拟域中的一阶低通滤波器的传递函数可以表示为&#xff1a; H ( s ) 1 s ω c H(s) \frac{1}{s \omega_c} H(s)sωc​1​ 这是因为一阶低通滤波器的设计目标是允许低频信…

什么是深拷贝,什么是浅拷贝

在计算机科学中&#xff0c;特别是涉及到编程语言如JavaScript、Java、C等时&#xff0c;我们经常遇到“深拷贝”和“浅拷贝”这两个概念。它们都与对象的复制有关&#xff0c;但处理方式不同。 浅拷贝 (Shallow Copy): 浅拷贝只复制对象的顶层属性&#xff08;或称为“引用”…

go switch 与 interface

go switch 与 interface 前言 前言 github.com/google/cel-go/common/types/ref type Val interface {// ConvertToNative converts the Value to a native Go struct according to the// reflected type description, or error if the conversion is not feasible.ConvertTo…

05-java基础——循环习题

循环的选择&#xff1a;知道循环的次数或者知道循环的范围就使用for循环&#xff0c;其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数&#xff0c;在代码中使用键盘录入去猜出这个数字是多少&#xff1f; 要求&#xff1a;使用循环猜&#xff0c;一直猜中为止…

时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…

品牌为什么需要3D营销?

在对比传统品牌营销手段时&#xff0c;线上3D互动营销以其更为生动的展示效果脱颖而出。它通过构建虚拟仿真场景&#xff0c;创造出一个身临其境的三维空间&#xff0c;充分满足了客户对实体质感空间的期待。不仅如此&#xff0c;线上3D互动营销还能实现全天候24小时无间断服务…

PyTorch中“No module named ‘torch._six‘“的报错场景及处理方法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 在使用PyTorch时&#xff0c;您可能会遇到"No module named ‘torch._six’"的错误。这通常是因为PyTorch的某些…

中介子方程三十二

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXKXXpXuXXαXXrXXEXXyXXαXiXXαXiXrXkXtXyXXpXVXXdXuXWX…