ES6模块化详解:导入与导出方式
在现代 JavaScript 开发中,模块化是代码管理和组织的重要工具。ES6(ECMAScript 2015)引入了模块化的概念,通过 import 和 export 来组织代码,使得模块的管理变得更加清晰和简洁。本文将详细介绍 ES6 中的各种模块导入导出方式,包括 *导入、命名导入、默认导入、命名 + 默认导入、动态导入,分别导出、统一导出和默认导出。
1. 模块化基础
在 ES6 之前,JavaScript 没有原生的模块化机制。我们通常通过 require() 和 module.exports(在 Node.js 中)来实现模块化。ES6 引入了模块化规范,使得在浏览器和 Node.js 中都能够使用统一的模块化机制。
1.1 export 和 import
export用于将模块中的功能暴露出去。import用于从其他模块中导入功能。
1.2 模块化的优势
- 代码重用:可以将功能拆分成多个文件,并在其他地方使用。
- 更好的依赖管理:模块可以显式地声明其依赖,避免了全局变量污染。
- 易于维护:模块化的代码更易于理解、调试和维护。
2. import 和 export 的基本用法
2.1 默认导出与命名导出
2.1.1 默认导出 (Default Export)
默认导出允许你导出一个模块的主要功能,其他模块可以直接导入这个功能,而不需要花括号。
示例:
math.js(模块文件):
// 默认导出
export default function add(a, b) {return a + b;
}
导入方式:
// 导入默认导出的函数
import add from './math';console.log(add(2, 3)); // 输出: 5
2.1.2 命名导出 (Named Export)
命名导出允许你导出一个模块中的多个功能,并且导入时需要使用相同的名称。
示例:
math.js(模块文件):
// 命名导出
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}
导入方式:
// 导入命名导出的函数
import { add, subtract } from './math';console.log(add(2, 3)); // 输出: 5
console.log(subtract(5, 3)); // 输出: 2
3. import 的多种方式
ES6 允许使用不同的方式来导入模块的功能。
3.1 * 导入
* 导入会将模块中所有的命名导出作为一个对象导入,可以通过该对象来访问所有导出的功能。
示例:
math.js(模块文件):
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}
导入方式:
import * as math from './math';console.log(math.add(2, 3)); // 输出: 5
console.log(math.subtract(5, 3)); // 输出: 2
3.2 命名导入
命名导入允许从模块中导入一个或多个具名功能。导入时需要使用花括号包围需要的功能。
示例:
math.js(模块文件):
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}
导入方式:
import { add } from './math';console.log(add(2, 3)); // 输出: 5
3.3 默认导入
默认导入用来导入模块的默认导出,它不需要使用花括号。
示例:
math.js(模块文件):
export default function add(a, b) {return a + b;
}
导入方式:
import add from './math';console.log(add(2, 3)); // 输出: 5
3.4 命名导入 + 默认导入
如果一个模块同时使用了默认导出和命名导出,可以结合使用默认导入和命名导入。
示例:
math.js(模块文件):
export default function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}
导入方式:
import add, { subtract } from './math';console.log(add(2, 3)); // 输出: 5
console.log(subtract(5, 3)); // 输出: 2
4. 导出的方式
4.1 统一导出
统一导出允许你将多个功能一起导出。这通常在模块的最后使用。
示例:
math.js(模块文件):
function add(a, b) {return a + b;
}function subtract(a, b) {return a - b;
}// 统一导出
export { add, subtract };
导入方式:
import { add, subtract } from './math';console.log(add(2, 3)); // 输出: 5
console.log(subtract(5, 3)); // 输出: 2
4.2 分别导出
分别导出允许你在多个位置导出模块的功能。
示例:
math.js(模块文件):
// 分别导出
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}
导入方式:
import { add, subtract } from './math';console.log(add(2, 3)); // 输出: 5
console.log(subtract(5, 3)); // 输出: 2
4.3 默认导出
默认导出是模块的主要导出,通常一个模块只会有一个默认导出。
示例:
math.js(模块文件):
export default function add(a, b) {return a + b;
}
导入方式:
import add from './math';console.log(add(2, 3)); // 输出: 5
5. 动态导入
动态导入允许按需加载模块。它返回一个 Promise,可以在需要时动态加载模块。这对于按需加载和代码拆分非常有用。
示例:
// 动态导入模块
import('./math').then(math => {console.log(math.add(2, 3)); // 输出: 5
});
动态导入常用于大型应用,尤其是在涉及到懒加载时。
6. 总结
- 默认导出:每个模块只能有一个默认导出,适用于模块的主要功能。
- 命名(分别)导出:模块可以有多个命名导出,适用于多个功能的导出。
*导入:将模块中的所有命名导出作为对象导入。- 命名导入 + 默认导入:可以结合命名导入和默认导入,导入模块中的多个功能。
- 动态导入:用于按需加载模块,返回一个
Promise。 - 分别导出与统一导出:分别导出每个功能或统一导出多个功能。
相关文章:
ES6模块化详解:导入与导出方式
在现代 JavaScript 开发中,模块化是代码管理和组织的重要工具。ES6(ECMAScript 2015)引入了模块化的概念,通过 import 和 export 来组织代码,使得模块的管理变得更加清晰和简洁。本文将详细介绍 ES6 中的各种模块导入导…...
每日学习Java之一万个为什么?[MySQL面试篇]
分析SQL语句执行流程中遇到的问题 前言1 MySQL是怎么在一台服务器上启动的2 MySQL主库和从库是同时启动保持Alive的吗?3 如果不是主从怎么在启动的时候保证数据一致性4 ACID原则在MySQL上的体现5 数据在MySQL是通过什么DTO实现的6 客户端怎么与MySQL Server建立连接…...
常用空间数据结构对比
空间数据结构是用来组织和查询多维空间数据的算法结构。它们在地理信息系统 (GIS)、计算机图形学、机器人导航、机器学习等领域非常重要。以下是几种常见空间数据结构的对比: 1. 四叉树(Quadtree) 适用场景:二维空间数据&#x…...
AnythingLLM+LM Studio本地知识库构建
前置操作: 已经安装以下软件,并配置后: DeepSeek-R1-Distill-Llama-8B-Q4_K_M.ggufLM-Studio-0.3.10-6-x64 软件准备: 下载AnythingLLM:AnythingLLM | The all-in-one AI application for everyone 点击"Dow…...
使用 Java 更新 Word 文档中的图表数据-超详细
使用 Java 更新 Word 文档中的图表数据 在日常的工作中,尤其是在数据分析和报告自动化的场景中,可能会遇到需要定期更新 Word 文档中的图表数据的需求。比如,生成数据报告时,我们需要在图表中更新一些动态的数据值。今天…...
Qt常用控件之下拉框QComboBox
下拉框QComboBox QComboBox 是一个下拉框控件。 1. QComboBox属性 属性说明currentText当前选中的文本。currentIndex当前选中的条目下标(从 0 开始,如果没有条目被选中则该值为 -1)。editable是否允许被修改。为 true 时,QCom…...
Qt 中集成mqtt协议
一,引入qmqtt 库 我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台时 方便,直接编译就行了。 原始仓库路径:https://github.com/emqx/qmqtt/tree/master 二,使用 声明一个单例类,将订阅到…...
2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析
文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…...
AI大模型-提示工程学习笔记19-自我反思
目录 1. 自我反思的核心思想 (1) LLM 的局限性 (2) Reflexion 的解决方案 2. Reflexion 的工作流程 (1) 任务输入 (2) 初始生成 (3) 反思 (Reflection) (4) 调整与改进 (5) 迭代 (6) 结果输出 3. Reflexion 的关键组件 (1) 大语言模型 (LLM) (2) 反思者 (Reflector…...
GaussDB 学习实战指南:从部署到高并发优化的全流程解析
引言 GaussDB 作为华为推出的高性能分布式数据库,凭借其 分布式架构、高可用性、云原生支持 等特性,成为企业级应用的核心选择。本文将以 实战操作为核心,覆盖 集群部署、数据分片、性能调优、容灾备份、云上迁移 五大场景,通过真实案例与代码示例,助你快速掌握 GaussDB …...
vue3 Props的使用
Props是什么? 官方地址:Props | Vue.js 在 Vue 中,props 是父组件向子组件传递数据的一种机制。 props 是子组件中定义的自定义属性,父组件通过这些属性向子组件传递数据。 它们是单向数据流的一部分,意味着数据只能…...
Ecode前后端传值
说明 在泛微 E9 系统开发过程中,使用 Ecode 调用后端接口并进行传值是极为常见且关键的操作。在上一篇文章中,我们探讨了 Ecode 调用后端代码的相关内容,本文将深入剖析在 Ecode 中如何向后端传值,以及后端又该如何处理接收这些值…...
【Linux】进程状态(二)
目录 前言: 一、进程状态: 1.运行状态(时间片) 2.阻塞状态 3.阻塞挂起状态 二、Linux进程状态: 1.运行状态(R)和阻塞状态(S) 2.深度睡眠状态(D) 3.停止状态(T) 3.1使进程在后台运行 4.追踪暂停状态(t) 5.死亡状态(X)和僵尸状态…...
domain 网络安全 网络安全域
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 文章目录 1、域的概述 1.1、工作组与域1.2、域的特点1.3、域的组成1.4、域的部署概述1.5、活动目录1.6、组策略GPO 2、域的部署实验 2.1、建立局域网…...
链表和STL —— list 【复习笔记】
1. 链表 1.1 链表的定义和类型 和顺序表一样,链表也是一种线性表,线性表存储结构为链式存储就是链表 链式存储不仅要保存数据元素,还要保存数据元素间的关系,这两个部分信息形成了结点。结点有两个域:数据域&#x…...
Java Map实现类面试题
Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么? HashMap基于哈希表实现,使用数组链表红黑树(Java 8)的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…...
技术架构和工程架构区别
技术架构 技术架构是对某一技术问题解决方案的结构化描述,包括组件结构及其交互关系。它涵盖部署方案、存储方案、缓存方案、日志方案等多个方面,旨在通过组织人员和技术,以最低的成本满足需求和应对变化,保障软件的稳定高效运…...
简单介绍JVM
1.什么是JVM? JVM就是Java虚拟机【Java Virtual Machine】,简称JVM。主要部分包括类加载子系统,运行时数据区,执行引擎,本地方法库等,接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…...
纷析云:赋能企业财务数字化转型的开源解决方案
在企业数字化转型的浪潮中,财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案,为企业提供了一条理想的转型路径。 一、开源的力量:自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…...
DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?
一、引言:MoE模型的通信瓶颈与DeepEP的诞生 在混合专家(MoE)模型训练中,专家间的全对全(All-to-All)通信成为性能瓶颈。传统方案在跨节点传输时带宽利用率不足50%,延迟高达300μs以上。DeepSee…...
PDF-Extract-Kit-1.0与STM32CubeMX的嵌入式集成方案
PDF-Extract-Kit-1.0与STM32CubeMX的嵌入式集成方案 1. 工业现场的真实需求场景 在工厂自动化产线里,设备运行日志、维修手册、质检报告这些资料大多以PDF格式存在。操作员需要快速从几十页的技术文档中提取某个传感器的参数范围,或者从维修记录里找出…...
Kettle8.2转换组件实战:利用增加序列实现Excel数据自动编号
1. 为什么需要给Excel数据自动编号? 每次处理Excel数据时,最头疼的就是要给每行数据加个序号。手动添加不仅效率低,还容易出错。上周我帮市场部处理3000多条客户数据,就因为手工编号搞错顺序,差点引发数据混乱。这时候…...
机器人跟随算法
REF:基于多机器人路径规划与编队控制的优化研究1. 基础模型RRT(快速随机树)算法:模拟树的生长过程,起始点为树的根节点,在环境中随机采样作为树的叶节点,从最近节点到目标点的方向上,…...
深入理解分布式唯一ID:从原理到实战,一篇讲透Snowflake
深入理解分布式唯一ID:从原理到实战,一篇讲透Snowflake 一、为什么我们需要“唯一ID”? 先从一个最简单的场景说起:你有一个订单系统,每天产生几百万条订单记录。如果只用数据库的自增主键,当系统拆分成多个…...
如何在不安装Steam的情况下获取创意工坊模组
如何在不安装Steam的情况下获取创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 对于许多游戏爱好者来说,Steam创意工坊是一个宝库,里面充满…...
java+vue+SpringBoot环保网站(程序+数据库+报告+部署教程+答辩指导)
源代码数据库LW文档(1万字以上)开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言:后端:Java 前端:vue框架:springboot数据库:mysql 开发工具 JDK版本:JDK1.8 数…...
微信与支付宝退款接口典型错误排查与实战优化策略
1. 微信支付退款接口典型错误解析 微信支付的退款功能是电商平台必备能力,但很多开发者在对接时都踩过"订单号非法"这个坑。去年我们团队处理过一个紧急case:某跨境电商平台凌晨爆发大量退款失败,日志里清一色的<err_code_des&g…...
别再手动写矩阵了!用Eigen库提升你的C++数值计算效率(性能对比实测)
别再手动写矩阵了!用Eigen库提升你的C数值计算效率(性能对比实测) 在科学计算和工程仿真领域,矩阵运算如同空气般无处不在。从计算机视觉中的三维重建到金融工程里的蒙特卡洛模拟,开发者们每天都在与各种规模的矩阵打交…...
不止于登录:用钉钉扫码打通Vue3后台与企微/飞书(OAuth2.0统一方案)
构建企业级统一身份认证中台:Vue3多平台扫码登录架构设计 当企业同时使用钉钉、企业微信和飞书作为办公平台时,如何为Vue3后台系统设计一套统一的扫码登录方案?这个问题困扰着许多中大型企业的技术团队。我曾参与过某跨国企业的身份认证系统重…...
Buildroot外部工具链路径解析:从权限问题到正确配置
1. Buildroot外部工具链路径问题解析 第一次用Buildroot配置外部工具链时,我遇到了一个典型的路径解析问题。当时选择的工具链路径是/opt/cross-toolchain/bin/arm-linux-gnueabihf-gcc,编译过程中却报错提示找不到libgcc_s.so。这种问题看似简单&#x…...
