module.exports vs exports
在 Node.js 中,module.exports
和 exports
都是用于导出模块中的变量或者函数,以便其他文件可以使用 require
方法来引入和使用。但是它们之间存在一些区别:
-
module.exports:
- 这是真正用于定义模块导出的对象。在模块中,可以通过对
module.exports
赋值来指定导出的内容。 - 如果你需要导出单个值或者一个完整的对象,通常会使用
module.exports
。 - 例子:假设你有一个工具模块,想要导出一个类。
javascript
class Tool { // ... } module.exports = Tool;
- 这是真正用于定义模块导出的对象。在模块中,可以通过对
-
exports:
exports
是module.exports
的一个引用,Node.js 默认在每个模块的头部创建了exports = module.exports
。- 它通常用于导出多个对象或函数。
- 但是,如果你给
exports
直接赋一个新值,它就不再指向module.exports
,这就可能导致模块导出一个空对象{}
。 - 例子:假设你有一个工具模块,想要导出多个函数。
javascript
exports.function1 = function() { // ... }; exports.function2 = function() { // ... };
如果设置了 module.exports
,exports
对象会被忽略。因此,不应该同时使用 module.exports
和 exports
导出不同的东西,以避免混淆或错误。
export vs export default
在 ES6 模块系统中,export
和 export default
用于导出模块内容,但它们的用途和语法有所不同:
-
export:
- 用于导出一个或多个命名的变量、函数、类等。
- 导入时需要使用花括号
{}
并指定相应的名称。 - 可以在一个模块中使用多个
export
。 - 例子:导出多个功能。
javascript
export const CONSTANT = 'constant value'; export function myFunction() { // ... }
-
export default:
- 用于导出一个模块的默认输出。
- 导入时不需要使用花括号,可以给导入的内容任意命名。
- 一个模块只能有一个
export default
。 - 例子:导出一个模块的主要功能或类。
javascript
export default class MyClass { // ... }
- 另一个例子是,在一个模块中即使用
export
导出多个值,也可以指定一个默认导出。javascriptexport const util1 = () => { /* ... */ }; export const util2 = () => { /* ... */ }; export default () => { /* ... */ }; // 这是默认导出
在使用时,import myDefaultImport from 'my-module'
会导入 export default
的值,而 import { namedImport } from 'my-module'
会导入通过 export
命名导出的值。
总结来说,module.exports
和 exports
用于 Node.js 的 CommonJS 模块系统,而 export
和 export default
用于 ES6 模块系统。选择哪一个取决于你的使用环境和特定的需求。