面试题答案
一键面试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 的
import
和export
是静态的,在编译阶段就确定了依赖关系,而Node.js 中基于exports
和module.exports
的require
是动态的,在运行时才确定依赖。ES6 模块语法更适合现代 JavaScript 开发,提供了更清晰的模块结构和更好的静态分析能力。在Node.js中使用时,通常需要将文件后缀改为.mjs
或在package.json
中设置"type": "module"
。
区别总结
- exports 和 module.exports:
exports
是module.exports
的一个引用,不能对exports
直接重新赋值为非对象值,否则会切断与模块导出的联系;而module.exports
可以赋值为任何类型,是模块导出的核心。 - ES6 的 import/export 与 Node.js 的 exports/module.exports:
import
和export
是静态的,编译阶段确定依赖;exports
和module.exports
结合require
是动态的,运行时确定依赖。ES6 模块语法在结构和静态分析上更具优势,而Node.js传统的导出方式在旧版本Node.js环境中兼容性更好。