ES6简述module、export、import的作用 ?
参考回答
ES6 提供了 模块化(module)功能,用于将代码分隔成独立的模块,以提高代码的可维护性和复用性。它通过 export 和 import 关键字来导出和引入模块。
module:是代码的一个独立单元,默认处于严格模式,内部变量和方法不会污染全局作用域。export:用于定义模块的对外接口,可以将模块中的变量、函数、类等导出。import:用于引入其他模块中通过export定义的内容。
示例:
export 导出模块
// module.js
export const name = 'John';
export function greet() {
return `Hello, ${name}`;
}
export default function () {
return 'Default Export';
}
import 导入模块
// main.js
import { name, greet } from './module.js'; // 按需导入
import defaultExport from './module.js'; // 导入默认模块
console.log(name); // John
console.log(greet()); // Hello, John
console.log(defaultExport()); // Default Export
详细讲解与拓展
1. 模块化的作用
- 避免全局污染:模块内的变量和函数默认是私有的,外部无法直接访问。
- 提高代码复用性:模块化的代码可以在多个文件中复用。
- 提升代码可维护性:通过模块化,将代码拆分成独立的功能块,降低耦合。
- 支持异步加载:模块支持按需动态加载,提高性能。
2. export 的使用
export 用于导出模块中的内容,有两种方式:
– 命名导出(Named Export):
每个模块可以有多个命名导出,导入时需要使用相同的名字。
“`javascript
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a – b;
// main.js
import { add, subtract } from './math.js';
console.log(add(2, 3)); // 5
“`
- 默认导出(Default Export):
每个模块只能有一个默认导出,导入时可以使用任意名称。// utils.js export default function () { console.log('Default Export'); } // main.js import customName from './utils.js'; customName(); // 输出: Default Export
3. import 的使用
import 用于引入模块中的内容,可以按需导入或默认导入:
– 导入命名导出:
“`javascript
import { functionName, variableName } from './module.js';
“`
- 导入默认导出:
import defaultName from './module.js'; - 同时导入命名导出和默认导出:
import defaultName, { named1, named2 } from './module.js'; - 导入所有内容为一个对象:
import * as moduleName from './module.js'; console.log(moduleName.namedExport); // 访问命名导出
示例:
// module.js
export const name = 'Alice';
export const age = 25;
export default function () {
console.log('Default Export');
}
// main.js
import defaultFunc, { name, age } from './module.js';
console.log(name, age); // 输出: Alice 25
defaultFunc(); // 输出: Default Export
4. 动态加载模块
通过 import() 可以动态加载模块,返回一个 Promise:
// 动态加载模块
import('./math.js')
.then(module => {
console.log(module.add(2, 3)); // 5
})
.catch(error => console.error('Failed to load module:', error));
动态加载可以按需加载代码,减少初始加载时间。
5. 注意事项
- 模块必须运行在支持模块化的环境:
- 浏览器环境中,需要使用
type="module": - 在 Node.js 中,需要确保
package.json中配置了"type": "module"。
- 浏览器环境中,需要使用
- 静态分析:
import和export是静态的,必须在模块的顶层使用,不能在函数或条件语句中使用。- 例如:
if (true) { import { name } from './module.js'; // 会报错 }
- 默认导出与命名导出的混用:
- 默认导出和命名导出可以共存,但最好在设计模块时明确分工。
- 路径问题:
- 导入模块时需要指定相对或绝对路径,不能省略文件扩展名:
import { something } from './module'; // 会报错 import { something } from './module.js'; // 正确
- 导入模块时需要指定相对或绝对路径,不能省略文件扩展名:
6. CommonJS 和 ES6 Modules 的对比
在 Node.js 中,早期使用的模块系统是 CommonJS(基于 require 和 module.exports)。ES6 引入了模块化后,提供了新的语法支持:
| 特性 | CommonJS | ES6 Modules |
|---|---|---|
| 导入语法 | const x = require('./module') |
import x from './module.js' |
| 导出语法 | module.exports = value |
export default value 或 export |
| 执行时机 | 动态加载,运行时加载 | 静态加载,编译时解析 |
| 动态加载支持 | 原生支持 | 通过 import() 实现 |
总结
ES6 模块化通过 export 和 import 提供了一种更加清晰和标准的方式来组织代码模块:
– export:导出模块内容,支持命名导出和默认导出。
– import:引入模块内容,可以按需或动态加载。
– 作用:解决全局变量污染问题、提升代码的复用性、增强模块化管理能力,是现代 JavaScript 开发中不可或缺的一部分。