在JavaScript的模块系统中,export default
和module.exports
是两种常见的导出方式。它们分别出现在ES6模块和CommonJS模块中。虽然两者都旨在实现模块间的导入和导出,但在语法和用法上存在一些显著的差异。
1. 模块系统的背景
在ES5之前,JavaScript并不支持模块化。为了实现模块化,Node.js引入了CommonJS规范,借助require
和module.exports
实现模块的导入和导出。随着ES6的标准化,JavaScript引入了原生的模块系统,允许使用import
和export
语法。
2. module.exports
(CommonJS模块)
CommonJS模块使用module.exports
来导出一个模块,使用require()
来导入模块。这里是一个简单的示例:
math.js(导出模块)
// 使用模块.exports导出一个对象
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
module.exports = {
add,
subtract
};
app.js(导入模块)
// 使用require导入模块
const math = require('./math');
console.log(math.add(5, 3)); // 输出: 8
console.log(math.subtract(5, 3)); // 输出: 2
在这个例子中,math.js
使用module.exports
导出一个包含多个函数的对象。app.js
通过require
函数导入这个模块并使用其中的函数。
3. export default
(ES6模块)
ES6模块系统通过export
和import
语法来实现模块的导出和导入。export default
可以导出一个默认值,非常适合当模块只有一个主要的导出时使用。以下是一个简单的示例:
math.js(导出模块)
// 使用export default导出一个函数
const add = (a, b) => a + b;
export default add;
app.js(导入模块)
// 使用import导入默认导出
import add from './math';
console.log(add(5, 3)); // 输出: 8
在这个例子中,math.js
使用export default
导出一个函数,app.js
通过import
语法导入这个默认函数。
4. 注意事项和总结
- 语法差异:
module.exports
与require
是CommonJS的语法,而export
与import
是ES6模块的语法。 - 导出方式:使用
module.exports
时,可以导出任意类型的数据(对象、函数、类等),而export default
一次只能有一个默认导出。 - 兼容性:CommonJS是Node.js的默认模块系统,而ES6模块在现代浏览器和Node.js中得到了广泛支持。对于新项目,建议使用ES6模块以获得更好的可读性和维护性。
- 导入:ES6模块支持静态分析,可以在编译时进行优化,而CommonJS模块的加载是动态的。
总的来说,选择export default
还是module.exports
取决于你的项目需求和运行环境。在Node.js中,CommonJS仍然是主流,但ES6模块正逐渐取代它,尤其是在前端开发中。理解这两者的区别,有助于开发者更加灵活地选择适合的模块管理方式。