关于es6-module的语法

news/2025/2/23 3:13:49

ES6(ECMAScript 2015)引入了模块化的概念,旨在使 JavaScript 更加模块化、可维护和可重用。ES6 模块允许我们在不同的文件中组织和管理代码,使得不同模块之间的依赖关系更加清晰。

1. 导出(Export)

1.1 命名导出(Named Exports)

命名导出允许你导出多个变量、函数或类,每个导出的名称必须是唯一的。

// file1.js
export const name = 'John';
export function greet() {
  console.log('Hello!');
}
export class Person {
  constructor(name) {
    this.name = name;
  }
}

使用命名导出时,你可以在导入时使用相同的名称来访问这些导出。

// file2.js
import { name, greet, Person } from './file1';
console.log(name); // John
greet();           // Hello!
const person = new Person('Jane');

1.2 默认导出(Default Export)

每个模块只能有一个默认导出。默认导出的语法更加简洁,可以导出一个值(如对象、函数、类等)。

js

// file1.js
const person = {
  name: 'John',
  age: 30
};
export default person;

导入默认导出的方式没有花括号。

js

// file2.js
import person from './file1';
console.log(person.name); // John

1.3 导出重命名(Export Rename)

你可以在导出时使用 as 进行重命名。

js

// file1.js
const firstName = 'John';
export { firstName as name };

1.4 导出合并(Export All)

你可以一次性将一个模块的所有导出重新导出,适用于模块间的组合。

js

// file1.js
export const name = 'John';

// file2.js
export * from './file1'; // 导出 file1.js 中所有的导出

2. 导入(Import)

2.1 导入命名导出(Named Imports)

// file1.js
export const name = 'John';
export function greet() {
  console.log('Hello!');
}

// file2.js
import { name, greet } from './file1';
console.log(name);  // John
greet();            // Hello!

2.2 导入默认导出(Default Import)

js
// file1.js
const person = { name: 'John' };
export default person;

// file2.js
import person from './file1';
console.log(person.name); // John

2.3 导入重命名(Import Rename)

导入时使用 as 可以对导入的模块进行重命名。

// file1.js
export const firstName = 'John';

// file2.js
import { firstName as name } from './file1';
console.log(name); // John

2.4 导入全部(Import All)

你可以一次性导入一个模块的所有命名导出,并将其作为一个对象使用。

// file1.js
export const name = 'John';
export const age = 30;

// file2.js
import * as person from './file1';
console.log(person.name); // John
console.log(person.age);  // 30

2.5 动态导入(Dynamic Import)

ES6 模块支持动态导入,返回一个 Promise,可以根据需要异步加载模块。

// 动态导入
import('./file1').then(module => {
  console.log(module.name);
});

3. 模块化的特点

3.1 模块是默认严格模式

ES6 模块在模块内部默认使用严格模式(‘use strict’;),因此所有模块的代码都是严格模式的代码,不需要显式声明。

// file1.js
x = 10; // 报错,严格模式下不允许未声明的变量

3.2 模块的作用域

每个模块都有自己的作用域,不会污染全局作用域。模块之间通过 import 和 export 进行通信。

// file1.js
let counter = 0;
export function increment() {
  counter++;
}

// file2.js
import { increment } from './file1';
increment();
console.log(counter); // 由于作用域隔离,counter 在 file2.js 中不可访问

3.3 循环依赖

ES6 模块系统解决了模块间的循环依赖问题。对于导入的模块,它会暂时处于“挂起”状态,直到依赖的模块加载完成。

// a.js
import { b } from './b.js';
export const a = 'a';

// b.js
import { a } from './a.js';
export const b = 'b';

console.log(a, b); // 输出: a b

3.4 只读导入

ES6 模块中的导入是只读的。你无法修改从模块导入的值。

// file1.js
export let name = 'John';

// file2.js
import { name } from './file1';
name = 'Jane'; // 错误:不能修改从模块导入的值

4. 使用模块

4.1 模块在浏览器中的使用

现代浏览器支持 module 类型的脚本。使用

<script type="module">
  import { name } from './file1.js';
  console.log(name);
</script>

4.2 在 Node.js 中使用 ES6 模块

在 Node.js 中,你需要使用 .mjs 文件扩展名或在 package.json 中设置 “type”: “module”,来启用 ES6 模块。

{
  "type": "module"
}

然后,你就可以在 Node.js 中使用 import 和 export 语法了。

// file1.mjs
export const name = 'John';

// file2.mjs
import { name } from './file1.mjs';
console.log(name); // John

5. 总结

ES6 模块引入了更简洁的语法,使得 JavaScript 的代码结构更加清晰和可维护。通过 import 和 export,我们可以将代码拆分成小的模块,按需加载,并处理依赖关系。使用 ES6 模块化的好处包括:

  • 提高代码的可维护性和可读性。
  • 更好的支持循环依赖。
  • 默认严格模式,避免了许多常见的 JavaScript 问题。

http://www.niftyadmin.cn/n/5862930.html

相关文章

在华为云部署应用,通过阿里云代理调用第三方接口的利弊与解决方案

以下是一篇针对“在华为云上部署应用,通过阿里云代理服务器调用第三方接口”所做的问答与分析整理而成的博文示例,供您发布或分享。内容涵盖了方案现状、主要弊端以及详细的优化与解决思路。 在华为云部署应用,通过阿里云代理调用第三方接口的利弊与解决方案 一、背景介绍 …

SSE/Fetch API+Stream/WebSocket实时流式接收Node后端传来的处理过后的Coze API数据

SSE与Websocket详解,SSE实现对话框流式输出 用户可能在使用Server-Sent Events(SSE)时遇到了困难,特别是在尝试发送POST请求时遇到了限制。我需要确认SSE是否支持POST方法,并解释为什么常见做法是使用GET,同时提供替代方案。 首先,我需要回忆SSE的工作原理。SSE是服务器…

c#编程:定义比较器,ArrayList使用比较器进行排序

ArrayList 是 .NET Framework 1.1 引入的一个非泛型集合类型&#xff0c;在 C# 现代版本中推荐使用泛型集合如 List 来代替 ArrayList&#xff0c;因为它们提供了更好的类型安全性和性能。 ArrayList 中的元素按照指定顺序进行排序&#xff0c;可以使用 ArrayList.Sort() 方法…

政安晨的AI大模型训练实践 九 - 熟悉LLaMA Factory的详细参数含义-基本概念理解一下

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 小伙伴铁子们&#xff0c;上手先熟悉起来训练工具的每一个参数&#xff0c;很重要。 参照我…

【Kubernets】Kubernets资源类型Deployment详细介绍

文章目录 Kubernets资源概览Kubernetes Deployment 资源类型详细介绍Deployment 的主要功能Deployment 的核心字段字段详解1. **metadata**2. **spec**3. **template**4. **containers**5. **strategy**6. **restartPolicy** Deployment 的生命周期Deployment 的常用操作1. 创建…

Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变

随着数字化设计的蓬勃发展&#xff0c;Canva作为一款备受欢迎的在线设计平台&#xff0c;面临着日益增长的用户生成内容挑战。每天&#xff0c;平台上新增的素材数量高达5000万&#xff0c;这对数据库系统提出了前所未有的要求。为了应对这一挑战&#xff0c;Canva决定对其数据…

2.21力扣-回溯组合

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 一&#xff1a;JAVA class Solution {List<Integer> list new LinkedList<>();List<List<Integer>> ans new LinkedList<>();public List<List<Integer>> combine(int n, int k)…

day56 第十一章:图论part06

108.冗余连接 注意init初始化 改进&#xff1a; 其实只有一条边冗余&#xff0c;改为&#xff0c;如果两条边在同一个集合里&#xff0c;就输出&#xff0c;不然加入。 #include <iostream> #include <vector> using namespace std;int n 1005; vector<int>…