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

JavaScript中ES模块语法详解与示例

ES模块语法详解

ES6(ECMAScript 2015)引入了模块系统,这是JavaScript语言层面的模块化方案。下面我将详细讲解ES模块的语法和使用方法。

基本概念

ES模块允许你将代码分割成多个独立文件,每个文件可以导出特定的功能,并在其他文件中导入使用。这种模块化方式使得代码更易于维护、重用和测试。

核心语法

1. 命名导出 (Named Exports)

javascript

// 方式1: 声明时直接导出
export const name = 'value';
export function myFunction() { /* ... */ }
export class MyClass { /* ... */ }// 方式2: 声明后统一导出
const name = 'value';
function myFunction() { /* ... */ }
class MyClass { /* ... */ }export { name, myFunction, MyClass };// 方式3: 重命名导出
export { name as newName, myFunction as func };

2. 默认导出 (Default Export)

javascript

// 每个模块只能有一个默认导出
export default function() { /* ... */ }
// 或
export default class MyClass { /* ... */ }
// 或
const value = 'something';
export default value;

3. 导入语法

javascript

// 导入命名导出
import { name, myFunction } from './module.js';// 重命名导入
import { name as newName } from './module.js';// 导入默认导出
import defaultExport from './module.js';// 混合导入
import defaultExport, { namedExport } from './module.js';// 导入所有导出为命名空间对象
import * as moduleNamespace from './module.js';// 仅执行模块,不导入任何内容
import './module.js';

实际示例

下面是一个简单的实现,展示ES模块的实际使用:

html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ES模块语法示例</title><style>body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f5f8fa;color: #333;}.container {background-color: white;border-radius: 8px;padding: 20px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);}h1 {color: #2c3e50;border-bottom: 2px solid #eee;padding-bottom: 10px;}.code-block {background-color: #f8f9fa;border-left: 4px solid #3498db;padding: 15px;margin: 15px 0;overflow-x: auto;font-family: 'Consolas', 'Monaco', monospace;}.example {background-color: #e8f4fc;padding: 15px;border-radius: 6px;margin: 15px 0;}button {background-color: #3498db;color: white;border: none;padding: 10px 15px;border-radius: 4px;cursor: pointer;margin: 5px;}button:hover {background-color: #2980b9;}.output {margin-top: 15px;padding: 15px;background-color: #f9f9f9;border-radius: 4px;min-height: 50px;}</style>
</head>
<body><div class="container"><h1>ES模块语法详解</h1><section><h2>命名导出与导入</h2><div class="code-block">// mathUtils.js<br>export const PI = 3.14159;<br>export function square(x) { return x * x; }<br>export function cube(x) { return x * x * x; }<br><br>// 使用方式<br>import { PI, square, cube } from './mathUtils.js';</div><div class="example"><h3>示例:计算数学运算</h3><button οnclick="calculateSquare()">计算平方</button><button οnclick="calculateCube()">计算立方</button><div class="output" id="mathOutput"></div></div></section><section><h2>默认导出与导入</h2><div class="code-block">// logger.js<br>export default function(message) {<br>&nbsp;&nbsp;console.log(`[LOG]: ${message}`);<br>}<br><br>// 使用方式<br>import log from './logger.js';<br>log('Hello, modules!');</div><div class="example"><h3>示例:记录日志</h3><button οnclick="logMessage()">记录日志</button><div class="output" id="logOutput"></div></div></section><section><h2>混合导出与导入</h2><div class="code-block">// utilities.js<br>export const version = '1.0.0';<br>export function helper() { /* ... */ }<br>export default function mainUtility() { /* ... */ }<br><br>// 使用方式<br>import mainUtil, { version, helper } from './utilities.js';</div></section><section><h2>命名空间导入</h2><div class="code-block">// 导入所有导出为命名空间对象<br>import * as math from './mathUtils.js';<br><br>// 使用方式<br>console.log(math.PI);<br>math.square(5);</div><div class="example"><h3>示例:使用命名空间</h3><button οnclick="useNamespace()">使用命名空间计算</button><div class="output" id="namespaceOutput"></div></div></section></div><script type="module">// 导入模块功能import { PI, square, cube } from './mathUtils.js';import log from './logger.js';import * as math from './mathUtils.js';// 使函数在全局可用以便按钮调用window.calculateSquare = function() {const value = 5;const result = square(value);document.getElementById('mathOutput').innerHTML = `square(${value}) = ${result}`;};window.calculateCube = function() {const value = 4;const result = cube(value);document.getElementById('mathOutput').innerHTML = `cube(${value}) = ${result}`;};window.logMessage = function() {const message = `当前时间: ${new Date().toLocaleTimeString()}`;log(message);document.getElementById('logOutput').innerHTML = `已记录日志: "${message}" - 查看控制台获取详细信息`;};window.useNamespace = function() {const value = 7;const squared = math.square(value);const cubed = math.cube(value);document.getElementById('namespaceOutput').innerHTML = `使用命名空间计算:<br>${value}² = ${squared}<br>${value}³ = ${cubed}`;};</script>
</body>
</html>

模块文件

需要创建以下模块文件与HTML文件放在同一目录:

mathUtils.js:

javascript

export const PI = 3.14159;export function square(x) {return x * x;
}export function cube(x) {return x * x * x;
}

logger.js:

javascript

export default function(message) {const timestamp = new Date().toISOString();const logMessage = `[${timestamp}] LOG: ${message}`;console.log(logMessage);return logMessage;
}

关键特性说明

  1. 严格模式:ES模块自动处于严格模式

  2. 静态结构:导入导出必须在顶层作用域,不能条件导入

  3. 单例模式:多次导入同一模块只会执行一次

  4. 实时绑定:导入的是值的引用,不是拷贝

  5. 支持循环依赖:但需要小心设计

浏览器支持

现代浏览器都支持ES模块,但需要注意:

  • 使用<script type="module">标签

  • 文件路径需要完整(包括扩展名)

  • 通过本地服务器运行(如Live Server),不能直接文件协议打开


文章转载自:

http://KON5YjXQ.dpsfz.cn
http://aB8uPSpA.dpsfz.cn
http://k4gv78Ih.dpsfz.cn
http://88ci4D61.dpsfz.cn
http://f8mK1BVc.dpsfz.cn
http://kUI4Vr4h.dpsfz.cn
http://Dx2aoLJ7.dpsfz.cn
http://mP14Hbrx.dpsfz.cn
http://HMwoZJhY.dpsfz.cn
http://P5HRyYfl.dpsfz.cn
http://FdWAUv1c.dpsfz.cn
http://vU62doXt.dpsfz.cn
http://BPPiETge.dpsfz.cn
http://TsxoBPib.dpsfz.cn
http://Eh53GNkb.dpsfz.cn
http://rxBFKuLv.dpsfz.cn
http://9yQHninG.dpsfz.cn
http://iKcafkjU.dpsfz.cn
http://LQzQv7eJ.dpsfz.cn
http://cY2z20DZ.dpsfz.cn
http://5XYL4FRk.dpsfz.cn
http://zNzVPljV.dpsfz.cn
http://j73gMIDW.dpsfz.cn
http://fAoJgAtT.dpsfz.cn
http://gd9p14iq.dpsfz.cn
http://ogULVnQj.dpsfz.cn
http://3eCGdGml.dpsfz.cn
http://ROziINT3.dpsfz.cn
http://KjE78pQh.dpsfz.cn
http://r416ttgq.dpsfz.cn
http://www.dtcms.com/a/381997.html

相关文章:

  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(三)【进程优先级/切换/调度】
  • Roo Code:用自然语言编程的VS Code扩展
  • 第8.4节:awk的内置时间处理函数
  • leetcode算法刷题的第三十四天
  • 【技术博客分享】LLM推理过程中的不确定问题
  • Vue3基础知识-setup()、ref()和reactive()
  • 规则系统架构风格
  • 宋红康 JVM 笔记 Day17|垃圾回收器
  • vue表单弹窗最大化无法渲染复杂组件内容
  • 加餐加餐!烧烤斗破苍穹
  • SCSS 中的Mixins 和 Includes,%是什么意思
  • RFID基础了解 --- RC522
  • 第九篇 永磁同步电机控制-弱磁控制
  • 搭建langchain4j+SpringBoot的Ai项目
  • 一次 Linux 高负载 (Load) 异常问题排查实录
  • 扩散模型进化史
  • 学习Python是一个循序渐进的过程,结合系统学习、持续实践和项目驱动,
  • EKSPod 资源利用率配置修复:从占位符到完整资源分析系统
  • MySql基础:数据类型
  • 鸿蒙中的智能设备数据分析实战:从采集到建模的完整实现指南
  • Scikit-Learn 对糖尿病数据集(回归任务)进行全面分析
  • Scikit-learn 对加州房价数据集(回归任务)进行全面分析
  • Scintil在集成光子学技术方面筹集了5800万美元。
  • 通俗易懂地讲解JAVA的BIO、NIO、AIO
  • 数据结构与算法2:线性表补充
  • 内核实时监控策略针对海外vps容器性能的诊断方法
  • Grub2调整启动顺序
  • 6-2Restful
  • 北京A类定点医院2025年版
  • C语言---存储类