当前位置: 首页 > 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.jsqmd.com/news/913841/

相关文章:

  • 从Matlab到边缘设备:手把手教你将训练好的U-Net模型导出为ONNX并在OpenCV DNN中部署
  • 别再死记硬背了!用“3-8译码器”和“数据选择器”的例子,彻底搞懂CPU地址总线和存储寻址
  • 从Fbank到WavLM:PyTorch声纹识别项目中的音频特征提取全攻略(附性能对比)
  • 树莓派4B摄像头配置进阶:libcamera-hello实测、VNC黑屏修复与OpenCV兼容性指南
  • Unity UGUI Slider 从入门到精通:除了血条,还能做哪些酷炫的交互?
  • 从1mm到8mm:手把手教你用MATLAB NIFTI工具包对脑图谱进行无损重采样(以BN_Atlas为例)
  • 178软文网:全流程软文营销推广服务对企业品牌运营的价值提升
  • 告别‘TOPSAR-Split’报错:SNAP2StaMPS处理Sentinel-1 IW模式数据的三大核心配置与脚本修改详解
  • 【文字三国志:第四篇】天命重构,后端 API 设计文档
  • Jetson Orin Nano到手后,除了刷机,用jtop监控性能的完整配置流程
  • 保姆级教程:用Python+Open3D复现Removert算法,搞定动态SLAM点云预处理
  • Codesys电子凸轮实战:手把手教你用禾川PLC和SoftMotion库搭建飞剪程序
  • 别再纠结驱动了!Java直连网络打印机(IP+端口9100)打印PDF保姆级教程
  • 别再死记硬背公式了!用Python的NumPy和Matplotlib,5分钟带你直观理解最小二乘法
  • 游戏开发实战:用SAT算法搞定Unity/Unreal中复杂3D模型的碰撞检测(附C++/C#代码)
  • 告别raspistill:在树莓派Bookworm系统上配置CSI摄像头并玩转libcamera命令
  • 避开遥感地类分析的那些“坑”:一次南京江北新区土地利用变化研究的复盘与思考
  • Unity手游开发避坑:90Hz安卓机锁45帧?手把手教你用Surface.setFrameRate强制60帧
  • TVA 对 CV 的代际超越逻辑(10)
  • 2026年当下广西厂房装修服务团队选择标准深度解析:聚焦南宁华兴装饰工程有限公司 - 2026年企业资讯
  • 微信群有投票功能吗怎么弄|西瓜评选实操教程 - 投票小程序
  • 【AI培训中台-管理端-内容管理】
  • 手把手教你逆向拼多多H5/Temu的anti_content参数(附完整JavaScript代码)
  • 告别复杂参数!用Fooocus的‘Style’和‘Negative Prompt’快速生成高质量AI图片
  • 别让jbd2偷走你的磁盘性能:实战排查Ext4文件系统IO飙升(附CentOS 6/7解决方案)
  • 轻松搞定论文:6款2026年顶尖AI写论文工具深度横评
  • UE5.1+ControlRig避坑实录:从创建控制器到驱动骨骼,新手最常遇到的3个报错及解决方法
  • 告别点灯:用STM32CubeMX和WS2812B打造你的第一个桌面氛围灯项目(附完整工程)
  • 2026年4月加注装置品牌找哪家,移动式加油站/LNG撬装加气装置/撬装加油装置/船舶甲醇燃料加注站,加注装置厂家选哪家 - 品牌推荐师
  • 手把手教你写一个QQ音乐免费下载的油猴脚本(附完整源码与常见问题排查)