ES6 模块系统

概述

ES6(ECMAScript 2015)引入了模块系统,使得JavaScript代码可以更好地组织和管理。模块系统允许我们将代码分割成多个文件,每个文件可以导出和导入功能,从而实现代码的复用和模块化。

1. 模块的基本概念

1.1 导出(Export)

在模块中,我们可以通过export关键字导出变量、函数、类等。导出的内容可以在其他模块中被导入和使用。

// math.ts
export const PI = 3.14159;

export function add(a: number, b: number): number {
    return a + b;
}

export class Calculator {
    static multiply(a: number, b: number): number {
        return a * b;
    }
}

1.2 导入(Import)

在其他模块中,我们可以通过import关键字导入其他模块导出的内容。

// main.ts
import { PI, add, Calculator } from './math';

console.log(PI); // 输出: 3.14159
console.log(add(2, 3)); // 输出: 5
console.log(Calculator.multiply(2, 3)); // 输出: 6

2. 默认导出(Default Export)

每个模块可以有一个默认导出。默认导出使用export default语法。

// message.ts
const greeting = "Hello, World!";
export default greeting;

在导入默认导出时,可以使用任意名称。

// main.ts
import msg from './message';

console.log(msg); // 输出: Hello, World!

3. 混合导出

一个模块可以同时包含命名导出和默认导出。

// utils.ts
export const MAX_COUNT = 100;

export function log(message: string): void {
    console.log(message);
}

export default function greet(name: string): string {
    return `Hello, ${name}!`;
}

导入时可以同时导入命名导出和默认导出。

// main.ts
import greet, { MAX_COUNT, log } from './utils';

log(greet("Alice")); // 输出: Hello, Alice!
console.log(MAX_COUNT); // 输出: 100

4. 重命名导入和导出

4.1 重命名导出

在导出时,可以使用as关键字重命名导出的内容。

// math.ts
export { PI as pi, add as sum };

4.2 重命名导入

在导入时,也可以使用as关键字重命名导入的内容。

// main.ts
import { pi, sum } from './math';

console.log(pi); // 输出: 3.14159
console.log(sum(2, 3)); // 输出: 5

5. 动态导入(Dynamic Import)

ES6模块系统还支持动态导入,这意味着可以在运行时根据需要加载模块。

// main.ts
async function loadModule() {
    const { default: greet } = await import('./message');
    console.log(greet); // 输出: Hello, World!
}

loadModule();

6. 实践练习

练习1:创建一个模块

  1. 创建一个名为geometry.ts的文件,导出一个计算矩形面积的函数calculateArea。
  2. 在另一个文件main.ts中导入并使用该函数。
// geometry.ts
export function calculateArea(width: number, height: number): number {
    return width * height;
}

// main.ts
import { calculateArea } from './geometry';

console.log(calculateArea(5, 10)); // 输出: 50

练习2:使用默认导出

  1. 创建一个名为config.ts的文件,默认导出一个包含应用配置的对象。
  2. 在main.ts中导入并使用该配置对象。
// config.ts
const appConfig = {
    apiUrl: "https://api.example.com",
    timeout: 5000
};

export default appConfig;

// main.ts
import config from './config';

console.log(config.apiUrl); // 输出: https://api.example.com
console.log(config.timeout); // 输出: 5000

7. 总结

ES6模块系统为JavaScript提供了强大的模块化能力,使得代码组织更加清晰和易于维护。通过export和import关键字,我们可以轻松地实现模块的导出和导入,从而提高代码的复用性和可维护性。

在实际开发中,合理使用模块系统可以帮助我们更好地组织代码,提高开发效率。希望本教程能帮助你更好地理解和使用ES6模块系统。