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

全解析 ESM 模块语法,出去还是进来都由你说了算

模块语法是ES6的一个重要特性,它的出现让JavaScript的模块化编程成为了可能。

JavaScript中可以直接使用importexport关键字来导入和导出模块,但是这种语法并不是ES6的标准,而是ESMECMAScript Module)模块语法的一部分。

虽然导入和导出单个模块的语法非常简单,但是还有许多其他的方式,让你可以使用ESM模块语法来导入和导出模块。

ESM 模块语法

ESM模块语法很简单,它只有两个关键字:importexport

export

export关键字用来导出模块,每个模块都有一个默认导出,可以使用export default关键字来导出。

// 导出一个变量
const name = '田八';
export default name; 

这种导出方式可以导出任何类型的数据,包括基本数据类型、对象、函数等。

但是必须得先定义变量,然后再导出,不能在导出的过程中定义变量。

// 错误的导出方式
export default const name = '田八'; 

对于函数和类的声明,可以无需定义变量,直接导出。

// 导出一个函数
export default function Hello () {console.log('hello world');
};// 导出一个类
export default class Hello {constructor () {console.log('hello world');}
} 

对于字面量类型的数据,可以直接导出。

// 导出一个对象
export default {name: '田八',age: 18
};// 导出一个数组
export default [1, 2, 3, 4, 5];// 导出一个字符串
export default 'hello world';// 导出一个数字
export default 123; 

命名导出

任何变量都可以在创建时使用export关键字来导出,这种导出方式叫做命名导出。

// 导出一个变量
export const name = '田八';// 导出一个函数
export function Hello () {console.log('hello world');
};// 导出一个类
export class Hello {constructor () {console.log('hello world');}
} 

如果想要导出多个变量,可以使用export关键字,然后在花括号中写上变量名。

// 导出多个变量
const name = '田八';
const age = 18;export { name, age }; 

如果对导出的变量名不满意,可以使用as关键字来重命名。

// 重命名导出的变量
const name = '田八';
const age = 18;export { name as username, // 重命名为 usernameage // 不重命名
}; 

导出所有

如果想要导出一个模块中的所有变量,通常我们都是像下面这样写的:

import module from './module.js';// 导出所有变量
export {...module
} 

其实有一种更简单的方式,就是使用export * from关键字。

// 导出所有变量
export * from './module.js'; 

这种方式将会导出module.js模块中的所有变量,但是不会导出module.js模块中的默认导出,因为一个模块只能有一个默认导出。

不过export也提供了一种方式来导出其他模块的默认导出:

// 导出其他模块的默认导出
export { default } from './module.js'; 

也可以选择性的导出其他模块的不同变量:

// 导出其他模块的不同变量
export { name, age } from './module.js'; 

同样的,也可以使用as关键字来重命名导出的变量。

// 重命名导出的变量
export { name as username, age, default as module } from './module.js';// 导出其他模块的所有变量,并重命名
export * as module from './module.js'; 

import

import关键字用来导入模块,通常情况下是直接导入模块中的默认导出。

// 导入模块中的默认导出
import module from './module.js'; 

如果想同时导入模块中的默认导出和其他变量,可以在花括号中写上变量名。

// 导入模块中的默认导出和其他变量
import module, { name, age } from './module.js'; 

如果想要导入模块中的所有变量,可以使用import * as关键字。

// 导入模块中的所有变量
import * as module from './module.js'; 

这样就可以通过module对象来访问模块中的所有变量了。

命名导入

和命名导出一样,任何变量都可以在创建时使用import关键字来导入,这种导入方式叫做命名导入。

// 命名导入
import { name, age } from './module.js'; 

也可以使用as关键字来重命名导入的变量。

// 重命名导入的变量
import { name as username, age } from './module.js'; 

还可以混用命名导入和默认导入。

// 混用命名导入和默认导入
import module, { name, age } from './module.js'; 

上面的代码中,module就是默认导入,nameage就是命名导入。

同时,还可以不导入任何变量,只是执行模块中的代码。

// 只执行模块中的代码
import './module.js'; 

这样做的好处是可以在模块中执行一些初始化代码,比如在模块中注册全局变量,这种方式称为import for side effects(副作用导入)

动态导入

import关键字是静态的,也就是说,它必须在模块的顶层使用,不能在函数或者if语句中使用,或者其他代码块中使用。

// 错误的写法
function loadModule() {import './module.js';
}if (true) {import './module.js';
}{import './module.js';
} 

上面的代码中,import关键字都是错误的,因为它们都不是模块的顶层。

为了解决这个问题,ES2018引入了import()函数,它可以在任何地方使用,只要是在模块中就可以。

// 正确的写法
function loadModule() {import('./module.js');
}if (true) {import('./module.js');
}{import('./module.js');
} 

因为ES模块是异步加载的,所以import()函数返回一个Promise对象。

import('./module.js').then(module => {// ...
}); 

如果没有找到模块,import()函数会抛出一个错误,所以注意捕获异常。

import('./module.js').catch(err => {// ...
});// 或者try {await import('./module.js');
} catch (err) {// ...
} 

import()函数可以用在任何地方,不仅仅是模块。

总结

ES模块是JavaScript模块的标准,它的设计目的是为了取代CommonJS模块,成为浏览器和服务器通用的模块解决方案。

最后请记住,导出和静态导入只能在模块的顶层使用,不能在函数或者if语句,或者任何代码块中使用,而动态导入可以在任何地方使用。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

相关文章:

全解析 ESM 模块语法,出去还是进来都由你说了算

模块语法是ES6的一个重要特性,它的出现让JavaScript的模块化编程成为了可能。 在JavaScript中可以直接使用import和export关键字来导入和导出模块,但是这种语法并不是ES6的标准,而是ESM(ECMAScript Module)模块语法的…...

MATLAB 粒子群算法

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...

java微信小程序音乐播放器分享系统

随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,音乐播放器小程序被用户普遍使用,为方便用户能够可以随时进行音乐播放器小程序的数据信息管理,特开发了基于音乐播放器小程序…...

VS各版本VC各版本对应关系

Visual Studio 经过多年的发展&#xff0c;有许多版本&#xff0c;经常我们在拿到一份代码时不知道对应的VS版本 这时候可以打开工程目录下的vcproj/vcxproj文件&#xff0c;如下所示 <?xml version"1.0" encoding"utf-8"?> <Project DefaultT…...

如何处理“WLAN没有有效的IP配置”这一问题?

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;暂无 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的…...

ElasticSearch-学习笔记05【SpringDataElasticSearch】

Java后端-学习路线-笔记汇总表【黑马程序员】ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】ElasticSearch-学习笔记02【ElasticSearch索引库维护】ElasticSearch-学习笔记03【ElasticSearch集群】ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】Ela…...

【GlobalMapper精品教程】045:空间操作(2)——相交(Intersect)

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述相交工具的使用。 文章目录 一、实验数据二、符号化设置三、相交运算四、结果展示五、心灵感悟一、实验数据 加载配套实验数据(…...

Android 一体机研发之修改系统设置————自动锁屏

Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了&#xff01; 本章将为大家细节讲解自动锁屏。 自动锁屏功能&#xff0c;这个可以根据…...

七天实现一个go rpc框架

目录rpc协议目的关于RPC和框架服务端与消息编码确保接口的实现消息的序列化与反序列化通信过程服务端的实现main 函数支持并发与异步的客户端Call 的设计实现客户端服务注册(service register)通过反射实现 service集成到服务端超时处理创建连接超时Client.Call 超时服务端处理…...

EMQX Cloud Serverless 正式上线:三秒部署、按量计费的 MQTT Serverless 云服务

近日&#xff0c;全球领先的开源物联网数据基础设施软件供应商 EMQ 正式发布了 MQTT Serverless 云服务 —— EMQX Cloud Serverless 的 Beta 版本&#xff0c;开创性地采用弹性多租户技术&#xff0c;用户无需关心服务器基础设施和服务规格伸缩所需资源&#xff0c;仅用三秒即…...

快速排序 容易理解的版本

package huaweiod.排序算法;import java.util.Arrays;public class 快速排序 {public static void main(String[] args) {int[] arr {9,8,3,5,6,7,8,9};mysort(arr, 0, arr.length - 1); // myprint(arr," ");}private static void myprint(int[] arr, Strin…...

Linux体系结构

Linux体系结构一、引入概念二、内核三、管理1、内存管理2、进程管理3、进程调度控制进程对CPU的访问4、设备驱动程序和网络接口四、Linux Shell五、磁盘分区硬盘内的分区Linux下磁盘分区和目录的关系一、引入 操作系统的本质是什么&#xff1f; 是一种管理(协调)资源机制&…...

【汽车电子】什么是ADAS?

文章目录ADAS——先进驾驶辅助系统ADAS——商用车安全性能提升的利器总结ADAS——先进驾驶辅助系统 ADAS&#xff0c;全称Advanced Driver Assistance Systems &#xff0c;“先进驾驶辅助系统”&#xff0c;adas是汽车上面的一种系统&#xff0c;中文名叫做高级驾驶辅助系统&…...

java: 错误: 不支持发行版本 5(快速解决办法)

目录 前言 一、出现报错 二、报错的原因 三、解决办法 四、解决成功 前言 在maven web项目上面要部署运行tomcat时候&#xff0c;会出现这个问题 一、出现报错 java: 错误: 不支持发行版本 5 二、报错的原因 &#xff08;1&#xff09;官方解释&#xff1a;这个错误…...

QT中pro文件常用qmake语法

变量 配置QT模块 QT core gui sql network QT - sql注释 # 开启注释 # DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.0.0添加源文件 SOURCES \main.cpp \widget.cppSOURCES *.cpp SOURCES 1.cpp 2.cpp 3.cpp添加…...

Android 一体机研发之修改系统设置————声音

Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了&#xff01; 本章将为大家细节讲解声音。 对于声音功能大家都不陌生&#xff0c;在多…...

挖掘长尾关键词的五大思路

本文重点介绍做SEO挖掘长尾词的五大思路&#xff1a;长尾词是搜索量不大&#xff0c;但是关键词的量非常庞大的词&#xff0c;那我们可以通过以下方法挖掘&#xff1a;1、目标型长尾搜索的关键词是直接包含了商业需求的&#xff0c;直接能跟我们的服务或产品对接的&#xff0c;…...

ccc-Brief Introduction of Deep Learning-李宏毅(6)

文章目录Three Steps for Deep LearningFully Connect Feedforward NetworkMatrix OperationOutput Layer as Multi-Class ClassifierExample ApplicationNeural NetworkGoodness of functionPick the best functionThree Steps for Deep Learning 与机器学习三步骤基本相同。 …...

【TVM 学习资料】用 Schedule 模板和 AutoTVM 优化算子

完整 TVM 中文文档&#xff0c;访问→TVM 中文站 作者&#xff1a;Lianmin Zheng&#xff0c;Chris Hoge 本教程将展示如何用 TVM 张量表达式&#xff08;TE&#xff09;语言编写 schedule 模板&#xff0c;并通过 AutoTVM 对模板进行搜索&#xff0c;从而找到最佳 schedule。…...

蓝牙Mesh学习笔记(一)

Mesh系统结构1 Mesh网络分层1.1 模型层(Model layer)1.2 基础模型层(Foundation Model layer)1.3 接入层(Access layer)1.4 上层传输层(Upper transport layer)1.5 下层传输层(Lower transport layer)1.6 网络层(Network layer)1.7 承载层(Bearer layer)1.8 BLE内核规范(BLE Co…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...