MST

星途 面试题库

面试题:JavaScript中Node.js模块的导入导出方式有哪些

请详细阐述Node.js中常见的模块导入(exports、module.exports、import等方式)和导出(exports、module.exports、export等方式)的具体用法及它们之间的区别。
29.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. exports

  • 导出用法:在Node.js模块中,exports是一个预先定义好的空对象,用于导出模块的成员。通过给exports对象添加属性的方式来导出变量、函数等。例如:
// module.js
exports.hello = function() {
    return 'Hello from exports';
};
  • 导入用法:在其他模块中导入使用exports导出的模块时,使用require函数。例如:
// main.js
const myModule = require('./module');
console.log(myModule.hello()); 
  • 特性exports本质上就是一个普通对象,所有向它添加的属性最终都会成为导出模块的属性。它不能直接被重新赋值为一个非对象的值(否则会切断与模块导出的联系)。

2. module.exports

  • 导出用法module.exports同样用于导出模块的内容。它可以被赋值为任何类型,包括对象、函数、数组等。例如,导出一个函数:
// module.js
module.exports = function() {
    return 'Hello from module.exports';
};

或者导出一个对象:

// module.js
module.exports = {
    message: 'This is a module.exports object',
    printMessage: function() {
        console.log(this.message);
    }
};
  • 导入用法:和exports一样,通过require函数导入。例如:
// main.js
const myModule = require('./module');
console.log(myModule()); 
// 如果导出的是对象
const myModuleObj = require('./module');
myModuleObj.printMessage(); 
  • 特性module.exports是Node.js模块导出的核心机制,exports实际上是module.exports的一个引用(在模块初始化时exports = module.exports)。如果直接对exports重新赋值,就会切断与module.exports的联系,而对module.exports赋值则会改变整个导出的内容。

3. import 和 export(ES6 模块语法,Node.js 较新版本支持)

  • export 导出用法
    • 命名导出:可以分别导出多个成员,并在导入时指定要导入的名称。例如:
// utils.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
- **默认导出**:每个模块只能有一个默认导出。例如:
// greeting.js
const message = 'Hello';
export default function greet() {
    console.log(message);
}
  • import 导入用法
    • 导入命名导出
// main.js
import { add, subtract } from './utils.js';
console.log(add(2, 3)); 
console.log(subtract(5, 2)); 
- **导入默认导出**:
// main.js
import greet from './greeting.js';
greet(); 
- **混合导入**:
// main.js
import greet, { add } from './greeting.js';
greet(); 
console.log(add(1, 2)); 
  • 特性:ES6 的importexport是静态的,在编译阶段就确定了依赖关系,而Node.js 中基于exportsmodule.exportsrequire是动态的,在运行时才确定依赖。ES6 模块语法更适合现代 JavaScript 开发,提供了更清晰的模块结构和更好的静态分析能力。在Node.js中使用时,通常需要将文件后缀改为.mjs或在package.json中设置 "type": "module"

区别总结

  • exports 和 module.exportsexportsmodule.exports的一个引用,不能对exports直接重新赋值为非对象值,否则会切断与模块导出的联系;而module.exports可以赋值为任何类型,是模块导出的核心。
  • ES6 的 import/export 与 Node.js 的 exports/module.exportsimportexport是静态的,编译阶段确定依赖;exportsmodule.exports结合require是动态的,运行时确定依赖。ES6 模块语法在结构和静态分析上更具优势,而Node.js传统的导出方式在旧版本Node.js环境中兼容性更好。