MST

星途 面试题库

面试题:JavaScript中Node环境模块使用的常见方式

在Node.js环境中,阐述exports、module.exports以及import/export这几种模块导出和导入方式的区别与使用场景。
38.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

区别

  1. exports与module.exports
    • 本质关系exportsmodule.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' })都能正确导出模块。
  2. exports/module.exports与import/export
    • 语法类型exportsmodule.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文件中可使用。

使用场景

  1. exports/module.exports
    • Node.js传统项目:在老版本的Node.js项目或者一些遵循CommonJS规范的项目中,使用exportsmodule.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;
  1. 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);