当前位置: 首页 > news >正文

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,或者是两者混合使用,都需要根据项目的具体需求和运行环境来选择合适的模块系统。

http://www.zskr.cn/news/1425151.html

相关文章:

  • 别再死记硬背了!用“3-8译码器”和“数据选择器”的例子,彻底搞懂CPU地址总线和存储寻址
  • 178软文网:全流程软文营销推广服务对企业品牌运营的价值提升
  • 【文字三国志:第四篇】天命重构,后端 API 设计文档
  • 别再纠结驱动了!Java直连网络打印机(IP+端口9100)打印PDF保姆级教程
  • 游戏开发实战:用SAT算法搞定Unity/Unreal中复杂3D模型的碰撞检测(附C++/C#代码)
  • TVA 对 CV 的代际超越逻辑(10)
  • 手把手教你逆向拼多多H5/Temu的anti_content参数(附完整JavaScript代码)
  • 告别复杂参数!用Fooocus的‘Style’和‘Negative Prompt’快速生成高质量AI图片
  • UE5.1+ControlRig避坑实录:从创建控制器到驱动骨骼,新手最常遇到的3个报错及解决方法
  • 从依赖报错到完美汉化:在Ubuntu 20.04/22.04上安装配置Beyond Compare 4的完整避坑记录
  • 用Python+遗传算法搞定物流配送路线规划:一个外卖小哥的实战代码分享
  • 2026年4月加注装置品牌找哪家,移动式加油站/LNG撬装加气装置/撬装加油装置/船舶甲醇燃料加注站,加注装置厂家选哪家 - 品牌推荐师
  • 用STM32CubeMx和DMA搞定WS2812B灯带:从单灯测试到彩虹流水灯实战(附完整代码)
  • 告别蓝屏!手把手教你给NVMe固态硬盘装Win7(附驱动整合U盘制作)
  • 从FPU到SSE:x86汇编浮点计算演进与性能调优浅谈
  • 告别护眼APP:手把手教你为Android系统(AOSP 11)添加原生全局色温调节功能
  • 从Demo到集成:手把手教你用Vue项目测试OnlyOffice 7.4破解后的协作编辑功能
  • ESP32-C3安全启动与Flash加密实战:绕过自动重启,一步到位配置Secure Boot V2
  • ESP32-C3的Secure Boot与Flash加密避坑指南:从menuconfig配置到efuse烧录的完整排错记录
  • 华为海思HI3798MV310芯片盒子刷机避坑指南:TTL接线、HiTool设置与固件选择
  • Windows 10/11 也能有 Mac 的丝滑体验?手把手教你用 MyDockFinder 打造高颜值桌面(附运行库避坑指南)
  • 从运放到LDO:手把手分析电压-电压反馈(V-V)在实际电路中的开环增益与稳定性
  • 别再只做温度计了!用STC89C52和DS18B20,我这样做出了一个智能温控小系统
  • Cadence 617实战:手把手教你搞定一个零温漂的Bandgap基准源(附仿真文件)
  • 保姆级教程:用Signac搞定小鼠脑单细胞ATAC数据的TF motif富集分析(附避坑指南)
  • 新手必看:埃夫特ER3B-C60机器人维护保养,从示教器登录到关节调零的保姆级流程
  • 从一张GCViewer图表说起:如何快速定位线上服务的频繁Full GC问题?
  • 用Python递归解决‘聪明士兵’问题:从CSDN题解到面试常考算法实战
  • 保姆级避坑指南:用Kalibr搞定ZED 2双目相机与IMU联合标定,跑通VINS-Fusion
  • DrissionPage元素查找全攻略:从CSS选择器到XPath,一篇搞定所有定位姿势