从0开始学习JavaScript--JavaScript ES6 模块系统

news2025/1/12 8:38:56

JavaScript ES6(ECMAScript 2015)引入了官方支持的模块系统,使得前端开发更加现代化和模块化。本文将深入探讨 ES6 模块系统的各个方面,通过丰富的示例代码详细展示其核心概念和实际应用。

ES6 模块的基本概念

1 模块的导出

ES6 模块通过 export 关键字导出功能,可以导出变量、函数、类等。

// mathModule.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;

2 模块的导入

使用 import 关键字导入模块提供的功能。

// app.js
import { add, subtract } from './mathModule';

console.log(add(5, 3)); // 输出: 8
console.log(subtract(5, 3)); // 输出: 2

默认导出与默认导入

1 默认导出

一个模块可以有一个默认导出,通过 export default 实现。

// defaultModule.js
const defaultMessage = 'Hello, default export!';

export default defaultMessage;

2 默认导入

在导入时,使用 import moduleName from 'modulePath' 语法进行默认导入。

// appDefault.js
import defaultMessage from './defaultModule';

console.log(defaultMessage); // 输出: Hello, default export!

模块的重命名与整体导入

1 重命名导入项

在导入时,可以使用 as 关键字进行重命名。

// appRename.js
import { add as addition, subtract as subtraction } from './mathModule';

console.log(addition(5, 3)); // 输出: 8
console.log(subtraction(5, 3)); // 输出: 2

2 整体导入

使用 * as 语法进行整体导入。

// appNamespace.js
import * as math from './mathModule';

console.log(math.add(5, 3)); // 输出: 8
console.log(math.subtract(5, 3)); // 输出: 2

动态导入

ES6 模块系统支持动态导入,通过 import() 函数实现在运行时动态加载模块。

// dynamicImport.js
export const dynamicImport = async (path) => {
  const module = await import(path);
  return module;
};
// appDynamic.js
import { dynamicImport } from './dynamicImport';

(async () => {
  const math = await dynamicImport('./mathModule');
  console.log(math.add(5, 3)); // 输出: 8
})();

模块的循环依赖

ES6 模块系统解决了循环依赖的问题,确保模块之间的依赖关系不会陷入死循环。

// circularModuleA.js
import { messageB } from './circularModuleB';

export const messageA = `Module A: ${messageB}`;
// circularModuleB.js
import { messageA } from './circularModuleA';

export const messageB = `Module B: ${messageA}`;

模块的静态化

在ES6模块系统中,模块的静态化是其一个重要特性。这一特性意味着模块的依赖关系在代码执行前就已经确定,为编译器进行优化提供了有力支持。

// mathModule.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// app.js
import { add, subtract } from './mathModule';

console.log(add(5, 3)); // 输出: 8
console.log(subtract(5, 3)); // 输出: 2

在这个例子中,编译器可以在构建时静态地确定app.js模块对mathModule.js的依赖关系,因此可以在输出时进行相应的优化。

模块的生命周期

模块的生命周期在ES6模块系统中是一个重要的概念,它影响着模块在应用中的行为和性能。了解模块的生命周期有助于更好地组织和优化代码。

1. 模块的执行时机

模块在第一次被导入时会被执行。这意味着模块内的代码在第一次导入时会立即执行,而不是等到模块被使用时再执行。

考虑以下模块:

// lifecycleModule.js
console.log('Module is executed.');

export const message = 'Hello from the module!';
// app.js
import { message } from './lifecycleModule';

console.log(message);

app.js第一次导入lifecycleModule.js时,控制台将输出"Module is executed.",说明模块内的代码在导入时执行。之后再次导入相同的模块,不会再次执行模块内的代码。

2. 模块的缓存

为了提高性能,ES6模块系统采用了缓存机制。一旦模块被执行过一次,其结果将被缓存,之后的导入会直接使用缓存的结果,而不再执行模块内的代码。

这意味着模块的状态和数据在多次导入之间是共享的。这对于避免重复执行代码、节省资源是非常有利的。

3. 使用示例

考虑以下场景:

// counterModule.js
let count = 0;

export const increment = () => {
  count++;
  console.log('Incremented count:', count);
};

export const getCount = () => {
  console.log('Current count:', count);
  return count;
};
// appCounter.js
import { increment, getCount } from './counterModule';

// 第一次导入
increment(); // 输出: Incremented count: 1
getCount(); // 输出: Current count: 1

// 第二次导入
increment(); // 输出: Incremented count: 2
getCount(); // 输出: Current count: 2

在这个例子中,counterModule.js模块内的count变量被多次导入的appCounter.js共享。每次调用increment函数都会修改count,而每次调用getCount函数都会输出当前的count值。

总结

ES6 模块系统为 JavaScript 开发者提供了现代化、灵活且高效的模块化工具。通过深入学习其基本概念、默认导出与默认导入、模块的重命名与整体导入、动态导入、循环依赖的处理等方面,我们更深刻地理解了其使用方式和优势。ES6 模块系统不仅提升了代码的可维护性和可读性,同时通过静态分析和优化,也有助于提高性能。

在现代前端开发中,充分利用 ES6 模块系统将为项目带来更好的可维护性和可扩展性。

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

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

相关文章

java原子类型

AtomicBoolean AtomicInteger AtomicLong AtomicReference<V> StringBuilder - 不是原子类型。StringBuilder 是 java.lang 包下的类 用法&#xff1a;无需回调改变数值

基于springboot + vue框架的网上商城系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Linux:vim的简单使用

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、vim的基本概念二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、.xxx.swp的解决总结 前言 本文是对Linux中vim使用的总结 一、vim的基本概念 …

C语言:求十个数中的平均数

分析&#xff1a; 程序中定义了一个average函数&#xff0c;用于计算分数的平均值。该函数接受一个包含10个分数的数组作为参数&#xff0c;并返回平均值。在主函数main中&#xff0c;首先提示输入10个分数&#xff0c;然后使用循环读取输入的分数&#xff0c;并将它们存储在名…

iris+vue上传到本地存储【go/iris】

iris部分 //main.go package mainimport ("fmt""io""net/http""os" )//上传视频文件部分 func uploadHandler_video(w http.ResponseWriter, r *http.Request) {// 解析上传的文件err : r.ParseMultipartForm(10 << 20) // 设置…

Nacos 架构原理

基本架构及概念​ 服务 (Service)​ 服务是指一个或一组软件功能&#xff08;例如特定信息的检索或一组操作的执行&#xff09;&#xff0c;其目的是不同的客户端可以为不同的目的重用&#xff08;例如通过跨进程的网络调用&#xff09;。Nacos 支持主流的服务生态&#xff0c…

基于springboot + vue在线考试系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

更改Jupyter Notebook 默认存储路径

import osprint(os.path.abspath(.)) 然后打开cmd,输入&#xff1a; jupyter notebook --generate-config 按照路径在本地文件夹中找到那个文件。 然后找到"c.NotebookApp.notebook_dir"这条语句&#xff1a;&#xff08;直接通过"crtlf"输入关键字找阿 …

2661. 找出叠涂元素 : 常规哈希表运用题

题目描述 这是 LeetCode 上的 「2661. 找出叠涂元素」 &#xff0c;难度为 「中等」。 Tag : 「模拟」、「哈希表」、「计数」 给你一个下标从 开始的整数数组 arr 和一个 的整数矩阵 mat。 arr 和 mat 都包含范围 &#xff0c; 内的所有整数。 从下标 开始遍历 arr 中的每…

经典神经网络——VGGNet模型论文详解及代码复现

论文地址&#xff1a;1409.1556.pdf。 (arxiv.org)&#xff1b;1409.1556.pdf (arxiv.org) 项目地址&#xff1a;Kaggle Code 一、背景 ImageNet Large Scale Visual Recognition Challenge 是李飞飞等人于2010年创办的图像识别挑战赛&#xff0c;自2010起连续举办8年&#xf…

Beta冲刺总结随笔

这个作业属于哪个课程软件工程A这个作业要求在哪里beta冲刺事后诸葛亮作业目标Beta冲刺总结随笔团队名称橘色肥猫团队置顶集合随笔链接Beta冲刺笔记-置顶-橘色肥猫-CSDN博客 文章目录 一、Beta冲刺完成情况二、改进计划完成情况2.1 需要改进的团队分工2.2 需要改进的工具流程 三…

【深度优先】LeetCode1932:合并多棵二叉搜索树

作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你 n 个 二叉搜索树的根节点 &#xff0c;存储在数组 trees 中&#xff08;下标从 0 开始&#xff09;&#xff0c;对应 n 棵不同的二叉搜索树。trees 中的每棵二叉搜索树 最多有 3 个节点 &#xff0…

Linux 权限管理

1 Linux 安全模型 AAA认证资源分派&#xff1a; 当用户登录时&#xff0c;系统会自动分配令牌 token&#xff0c;包括用户标识和组成员等等信息 1.1 用户 Linux 中每个用户是通过 User ID&#xff08;UID&#xff09;来唯一标识的。 1.2 用户组 Linux 中可以将一个或者多个…

CentOS 部署 WBO 在线协作白板

1&#xff09;WBO 白板工具介绍 1.1&#xff09;WBO 白板简介 WBO 是一个自由和开源的在线协作白板。它允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用户实时更新&#xff0c;并且状态始终保持。它可以用于许多不同的目的&#xff0c;包括艺术、娱乐、设计和…

SQL Server 2016(创建数据表)

1、需求描述。 在名为“class”的数据库中创建表&#xff0c;表名称为“course”&#xff0c;其中要包含序号、课程、课程编号、学分、任课教师、上课地点、开始时间、结束时间、备注等列。 设置各个字段的数据类型。其中&#xff0c;"序号"列为标识列&#xff0c;从…

今日现货黄金最新建议

近期现货黄金价格再度逼近历史高位&#xff0c;很多本来在场外观望的投资者&#xff0c;都纷纷希望进场一试身手。然而大涨大跌的行情并不是很适合新手投资者参与&#xff0c;如果大家还没做好技术上的准备&#xff0c;可以多听听正规交易平台的专业人士的意见。 在正式入市之前…

TCP 重传、滑动窗口、流量控制、拥塞控制

1&#xff1a;重传机制 超时重传 快速重传 SACK 方法 Duplicate SACK 1&#xff1a;重传机制 超时重传&#xff1a;重传机制的其中一个方式&#xff0c;就是在发送数据时&#xff0c;设定一个定时器&#xff0c;当超过指定的时间后&#xff0c;没有收到对方的ACK确认应答报文…

(四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

3D开发引擎HOOPS在建筑工程行业中的应用与影响

Tech Soft 3D在工程图形方面的历史可以追溯到90年代初&#xff0c;从一开始&#xff0c;建筑和施工行业就存在于我们的DNA中。最初&#xff0c;Tech Soft 3D因现在的HOOPS Visualize技术被收购&#xff0c;并于1996年从Autodesk公司分离出来&#xff0c;作为Autodesk公司以建筑…

Drift plus penalty 漂移加惩罚Part2——性能分析

文章目录 正文Performance analysisAverage penalty analysis 平均惩罚分析Average queue size analysis 平均队列大小分析Probability 1 convergenceApplication to queues with finite capacityTreatment of queueing systemsConvex functions of time averages Delay tradeo…