面试题答案
一键面试导入导出语法区别
- ES Modules
- 导入:使用
import
关键字,有多种导入方式。- 命名导入:
import { functionName, variableName } from './module.js';
,用于从模块中导入指定的函数、变量等。 - 整体导入(别名导入):
import * as moduleAlias from './module.js';
,将模块所有导出内容作为一个对象导入,通过别名访问。 - 默认导入:
import defaultExport from './module.js';
,用于导入模块默认导出的内容。
- 命名导入:
- 导出:使用
export
关键字。- 命名导出:
export const variableName = 'value';
,export function functionName() {}
,直接导出指定的变量、函数等。 - 默认导出:
export default function () {}
,每个模块只能有一个默认导出。
- 命名导出:
- 导入:使用
- CommonJS
- 导入:使用
require
函数,const module = require('./module.js');
,require
返回一个包含模块导出内容的对象。 - 导出:使用
module.exports
或exports
对象。module.exports = { functionName: function () {}, variableName: 'value' };
,也可以使用exports.functionName = function () {}; exports.variableName = 'value';
,但本质上exports
是module.exports
的一个引用,直接给exports
赋值会切断引用关系。
- 导入:使用
Node.js兼容性处理
- 文件扩展名
- 在Node.js中,
.mjs
文件默认以ES Modules方式处理,.cjs
文件默认以CommonJS方式处理。如果没有扩展名,.js
文件在package.json
中设置"type": "module"
时以ES Modules处理,否则以CommonJS处理。
- 在Node.js中,
- 动态导入
- ES Modules支持动态导入
import('./module.js').then((module) => { /* 使用模块 */ });
,CommonJS可以通过require
函数在运行时动态加载模块,如const path = require('path'); const modulePath = path.join(__dirname, 'module.js'); const module = require(modulePath);
,但语法结构有所不同。
- ES Modules支持动态导入
- 顶层
this
- 在ES Modules中,顶层
this
是undefined
,而在CommonJS模块中,顶层this
指向module.exports
的上下文对象。Node.js保持了这种差异,使得两种模块系统的运行环境有此区别。
- 在ES Modules中,顶层