当前位置: 首页 > news >正文

ES 模块动态导入

目录

1.动态导入

2. 导入组件

2.1 动态导入 named

2.2 动态导入 default

2.3 动态导入混合内容

3. 何时使用动态导入

4. 结论


ES 模块是一种在 JavaScript 中组织内聚代码块的方法。这是一个简单的 ES 模块:

// An ES module
import { concat } from './concatModule.js';concat('a', 'b'); // => 'ab'

import { concat } from './concatModule.js'被视为静态导入。

静态导入在大多数情况下都有效。但有时为了节省客户端带宽,您可能选择动态加载模块。

import如果使用函数,则可以动态导入 ES 模块——import(pathToModule)这是从 ES2020 开始提供的功能。

让我们看看 ES 模块的动态导入如何工作,以及它何时有用。

1.动态导入

import关键字用作函数时

const module = await import(path)

import(path)返回一个承诺,并启动一个异步任务来加载位于 的模块path。如果模块加载成功,则承诺解析模块内容;否则,承诺拒绝。

path可以是任何计算结果为表示路径的字符串的表达式。有效的路径表达式包括

// Classic string literals
const module1 = await import('./myModule.js');// A variable
const path = './myOtherModule.js';
const module2 = await import(path);// Function call
const getPath = (version) => `./myModule/versions/${version}.js`;
const moduleVersion1 = await import(getPath('v1.0'));
const moduleVersion2 = await import(getPath('v2.0'));

import(path)返回一个 Promise,语法非常好用async/await。例如,让我们在异步函数中加载一个模块:

async function loadMyModule() {const myModule = await import('./myModule.js');// ... use myModule
}loadMyModule();

现在,知道了如何加载模块,让我们从导入的模块中提取组件(默认或命名)

2. 导入组件

2.1 动态导入 named

让我们考虑以下模块,名为namedConcat.js

// namedConcat.js
export const concat = (paramA, paramB) => paramA + paramB;

namedConcat执行函数的命名导出concat

要动态导入namedConcat.js并访问命名导出concat,请通过命名导出解构已解析的模块对象:

async function loadMyModule() {const { concat } = await import('./namedConcat.js');concat('b', 'c'); // => 'bc'
}loadMyModule();

2.2 动态导入 default

要动态导入默认值default,只需从模块对象中读取属性。

假设将该defaultConcat.js函数作为default导出来:

// defaultConcat.js
export default (paramA, paramB) => paramA + paramB

动态导入时defaultConcat.js,具体访问default导出时,只需读取default属性。

但这里有一个细微的差别。default是 JavaScript 中的关键字,所以它不能用作变量名。你可以使用带别名的解构:

2.3 动态导入混合内容

如果导入的模块导出default并有多个命名导出,那么您可以使用单个解构来访问所有这些组件:

async function loadMyModule() {const { default: defaultImport,namedExport1,namedExport2} = await import('./mixedExportModule.js');// ...
}loadMyModule();

3. 何时使用动态导入

我建议在有条件导入大模块时使用动态导入:

  • 您可能会不时使用该模块,具体取决于运行时条件
  • 您可能希望加载大模块的不同版本,这也取决于运行时条件。

例如:

async function execBigModule(condition) {if (condition) {const { funcA } = await import('./bigModuleA.js');funcA();} else {const { funcB } = await import('./bigModuleB.js');funcB();}
}execBigModule(true);

4. 结论

动态加载模块调用import(path)作为函数,并使用指示模块说明符(又名路径)的参数。

const module = await import(path)返回一个承诺,该承诺解析为包含导入模块的组件的对象。

在该对象中,default属性包含默认导出,命名导出包含在相应的属性中:

const { default: defaultComponent, namedExport1,namedExport2
} = await import(path);

Node.js(版本 13.2 及以上)和大多数现代浏览器都支持动态导入。

http://www.xdnf.cn/news/1247401.html

相关文章:

  • BeanFactory 和 ApplicationContext 的区别?
  • centos通过DockerCompose搭建开源MediaCMS
  • 如何让 RAG 检索更高效?——大模型召回策略全解
  • 字符串匹配--KMP算法
  • Arxiv-Daily
  • 【机器学习】算法调参的两种方式:网格搜索(枚举)、随机搜索
  • Spring AI 系列之三十六 - Spring AI Alibaba-nl2sql
  • 【Git学习】入门与基础
  • 调试|谷歌浏览器调试长连接|调试SSE和websocket
  • SELinux加固Linux安全
  • python的高校班级管理系统
  • 技术部实习总结
  • 暑期算法训练.14
  • Rust进阶-part3-生命周期
  • Docker Desktop
  • K8s Master状态NotReady
  • 组织架构与软件架构协同演进实践指南
  • 网络 —— 笔记本(主机)、主机虚拟机(Windows、Ubuntu)、手机(笔记本热点),三者进行相互ping通
  • Redis面试精讲 Day 11:Redis主从复制原理与实践
  • 微服务—Gateway
  • Solidity智能合约基础
  • python学智能算法(三十三)|SVM-构建软边界拉格朗日方程
  • 《零基础入门AI:传统机器学习进阶(从拟合概念到K-Means算法)》
  • 机器学习——集成学习(Ensemble Learning)详解:原理、方法与实战应用
  • 机器学习 集成学习之随机森林
  • python开发环境安装多系统完整版
  • 工作相关: 预刷真值与人工标注的真值之间的关系 以及 真值与原始数据的关系,
  • Vue3 defineAsyncComponent() 函数
  • 【Unity笔记】Unity TextMeshPro 字体显示为方块的终极解决方案(含中文、特殊字符支持)
  • android直连SQLserver的可行性分析