区别
- exports与module.exports
- 本质关系:
exports
是module.exports
的一个引用。在Node.js模块中,每个模块内部都有一个module
对象,module.exports
是这个模块对外暴露的接口。而exports
只是指向module.exports
的一个变量。
- 赋值差异:如果直接对
exports
进行重新赋值(如exports = { newProperty: 'value' }
),会切断它与module.exports
的联系,导致模块导出无效。而直接修改module.exports
对象(如module.exports.newProperty = 'value'
)或者对其重新赋值(如module.exports = { newProperty: 'value' }
)都能正确导出模块。
- exports/module.exports与import/export
- 语法类型:
exports
和module.exports
是Node.js基于CommonJS规范的模块导出方式,是一种异步加载模块的方式。而import
/export
是ES6(ES2015)引入的模块系统,支持静态分析,编译时就能确定模块的依赖关系。
- 使用范围:
exports
/module.exports
主要用于Node.js环境。import
/export
不仅可以在现代浏览器环境中使用(需注意兼容性,可能需要转译工具),在Node.js环境中,Node.js从v13.2.0版本开始以实验性的方式支持,在ES模块文件(.mjs
后缀)或使用"type": "module"
声明的.js
文件中可使用。
使用场景
- exports/module.exports
- Node.js传统项目:在老版本的Node.js项目或者一些遵循CommonJS规范的项目中,使用
exports
或module.exports
。例如,编写一个简单的Node.js工具模块,用于提供一些常用的函数,如下:
// utils.js
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
exports.add = add;
exports.subtract = subtract;
// 或者
module.exports.add = add;
module.exports.subtract = subtract;
- import/export
- 现代前端项目:在现代前端项目中,如使用Webpack、Rollup等构建工具时,
import
/export
是主流的模块导入导出方式,它的静态分析特性有助于代码的优化和Tree - shaking。例如:
// utils.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
// 导入
import { add, subtract } from './utils.js';
- **Node.js新特性支持**:在Node.js中,如果要使用ES模块的新特性,如顶层await等,并且项目使用的Node.js版本支持ES模块,可以使用`import`/`export`。例如在`.mjs`文件中:
// main.mjs
import { readFile } from 'fs/promises';
const data = await readFile('example.txt', 'utf8');
console.log(data);