news 2026/5/30 3:51:57

TypeScript 编程中的模块系统:ESM 与 CommonJS 互操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript 编程中的模块系统:ESM 与 CommonJS 互操作

TypeScript 编程中的模块系统:ESM 与 CommonJS 互操作

在 TypeScript 编程的世界里,模块系统是组织和管理代码的重要手段。目前,主要有两种流行的模块系统:ESM(ECMAScript Modules)和 CommonJS。它们各自有着不同的特点和适用场景,而在实际开发中,我们有时会遇到需要在它们之间进行互操作的情况。本文将详细介绍这两种模块系统以及它们之间的互操作方式。

ESM 模块系统

ESM 是 JavaScript 官方标准化的模块系统,随着 ES6(ECMAScript 2015)的发布而引入。它采用静态分析的方式,在代码编译阶段就能确定模块之间的依赖关系,这使得代码的优化和打包更加高效。

基本语法

在 ESM 中,使用import语句来导入其他模块中的导出内容,使用export语句来导出当前模块的内容。例如:

// 导出变量exportconstmyVariable=10;// 导出函数exportfunctionmyFunction(){console.log('Hello from ESM!');}// 导入import{myVariable,myFunction}from'./myModule.ts';

特点

  • 静态导入导出:ESM 的导入和导出是静态的,这意味着它们必须在模块的顶层作用域中使用,不能在条件语句或函数内部动态导入。
  • 支持异步加载:ESM 模块可以异步加载,这对于优化网页性能非常有帮助,因为它允许浏览器在后台加载模块,而不会阻塞页面的渲染。
  • 浏览器原生支持:现代浏览器都原生支持 ESM,这使得在浏览器环境中直接使用 ESM 模块成为可能。

CommonJS 模块系统

CommonJS 是 Node.js 早期采用的模块系统,它是一种动态的模块系统,在运行时加载模块。

基本语法

在 CommonJS 中,使用require函数来导入其他模块,使用module.exportsexports来导出当前模块的内容。例如:

// 导出变量constmyVariable=10;module.exports={myVariable};// 导出函数functionmyFunction(){console.log('Hello from CommonJS!');}module.exports.myFunction=myFunction;// 导入constmyModule=require('./myModule.js');const{myVariable,myFunction}=myModule;

特点

  • 动态导入导出:CommonJS 的导入和导出是动态的,可以在代码的任何位置使用requiremodule.exports,这使得它更加灵活。
  • 同步加载:CommonJS 模块是同步加载的,这意味着在加载模块时,程序会暂停执行,直到模块加载完成。这在服务器端环境中通常不是问题,但在浏览器环境中可能会导致性能问题。
  • Node.js 原生支持:CommonJS 是 Node.js 的默认模块系统,因此在 Node.js 项目中广泛使用。

ESM 与 CommonJS 互操作

在实际开发中,我们可能会遇到需要在 ESM 和 CommonJS 模块之间进行互操作的情况。例如,我们可能有一个使用 ESM 编写的库,但需要在 CommonJS 项目中使用它,或者反之。

在 CommonJS 中导入 ESM 模块

在 Node.js 中,可以使用import()动态导入语法来导入 ESM 模块。import()返回一个 Promise,因此需要使用thenasync/await来处理导入的结果。例如:

// CommonJS 项目中导入 ESM 模块import('./myEsmModule.mjs').then((module)=>{const{myFunction}=module;myFunction();});// 或者使用 async/awaitasyncfunctionloadEsmModule(){constmodule=awaitimport('./myEsmModule.mjs');const{myFunction}=module;myFunction();}loadEsmModule();

需要注意的是,在 Node.js 中,ESM 模块的文件扩展名通常为.mjs,或者在package.json中设置"type": "module"来将.js文件视为 ESM 模块。

在 ESM 中导入 CommonJS 模块

在 ESM 中导入 CommonJS 模块相对简单,可以直接使用import语句。Node.js 会自动处理 CommonJS 模块的导出,将其转换为 ESM 模块可以理解的格式。例如:

// ESM 项目中导入 CommonJS 模块importmyModulefrom'./myCommonjsModule.js';const{myVariable,myFunction}=myModule;

注意事项

  • 默认导出:在 CommonJS 中,module.exports可以是一个对象、函数等,而在 ESM 中,默认导出是一个单独的值。在互操作时,需要注意这种差异。
  • 命名导出:ESM 的命名导出和 CommonJS 的命名导出在语法上有所不同,但在互操作时,Node.js 会尽量进行兼容处理。
  • 顶层await:ESM 支持顶层await,而 CommonJS 不支持。如果在 ESM 中使用顶层await导入 CommonJS 模块,需要确保 CommonJS 模块的导出是同步的。

总结

ESM 和 CommonJS 是两种不同的模块系统,它们各自有着不同的特点和适用场景。在实际开发中,我们可能会遇到需要在它们之间进行互操作的情况。通过了解它们的语法和特点,以及掌握互操作的方法,我们可以更加灵活地组织和管理代码,提高开发效率。无论是使用 ESM 还是 CommonJS,或者是两者混合使用,都需要根据项目的具体需求和运行环境来选择合适的模块系统。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 3:50:57

PotPlayer终极画质调校:手把手教你用MadVR榨干4K HDR显示器的潜力

PotPlayer终极画质调校:手把手教你用MadVR榨干4K HDR显示器的潜力在追求极致影音体验的道路上,普通播放器的默认设置往往无法充分发挥高端显示设备的全部潜力。对于拥有4K HDR显示器或OLED电视的影音发烧友来说,PotPlayer配合MadVR渲染器的组…

作者头像 李华
网站建设 2026/5/30 3:40:19

石英石 vs 亚克力,厨房台面别选错!

为什么厨房更推荐石英石?厨房是高摩擦、多油污、冷热交替频繁的场景,石英石性能完全适配:耐刮耐磨:切菜、厨具挪动不会留下永久划痕,长期使用外观完好。防污易清洁:汤汁、油污一擦即净,不藏污纳…

作者头像 李华
网站建设 2026/5/30 3:39:20

数据科学导论学习路线

数据科学(Data Science)是一门结合数学、编程、统计学与业务分析的综合学科。 对于初学者来说,最重要的是: 先理解“数据科学是做什么的”再学习基础工具最后通过项目练习形成能力 一、什么是数据科学? 数据科学的核…

作者头像 李华
网站建设 2026/5/30 3:38:00

三菱FX3U PLC串口通讯实战:从RS/RS2指令到Modbus RTU读取编码器数据

三菱FX3U PLC串口通讯实战:从RS/RS2指令到Modbus RTU读取编码器数据在工业自动化领域,PLC与外部设备的通讯是实现复杂控制系统的关键环节。三菱FX3U系列PLC凭借其稳定的性能和丰富的通讯功能,成为众多自动化工程师的首选。本文将聚焦FX3U PLC…

作者头像 李华