MST

星途 面试题库

面试题:Node.js中ES Modules与CommonJS兼容性的基础差异

请简要阐述在Node.js环境下,ES Modules与CommonJS在导入导出语法上有哪些主要区别,以及在兼容性方面Node.js是如何处理这些差异的?
12.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

导入导出语法区别

  1. 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 () {},每个模块只能有一个默认导出。
  2. CommonJS
    • 导入:使用require函数,const module = require('./module.js');require返回一个包含模块导出内容的对象。
    • 导出:使用module.exportsexports对象。
      • module.exports = { functionName: function () {}, variableName: 'value' };,也可以使用exports.functionName = function () {}; exports.variableName = 'value';,但本质上exportsmodule.exports的一个引用,直接给exports赋值会切断引用关系。

Node.js兼容性处理

  1. 文件扩展名
    • 在Node.js中,.mjs文件默认以ES Modules方式处理,.cjs文件默认以CommonJS方式处理。如果没有扩展名,.js文件在package.json中设置"type": "module"时以ES Modules处理,否则以CommonJS处理。
  2. 动态导入
    • ES Modules支持动态导入import('./module.js').then((module) => { /* 使用模块 */ });,CommonJS可以通过require函数在运行时动态加载模块,如const path = require('path'); const modulePath = path.join(__dirname, 'module.js'); const module = require(modulePath);,但语法结构有所不同。
  3. 顶层this
    • 在ES Modules中,顶层thisundefined,而在CommonJS模块中,顶层this指向module.exports的上下文对象。Node.js保持了这种差异,使得两种模块系统的运行环境有此区别。