我们为什么要迁移到 TypeScript

2025-06-09

我们为什么要迁移到 TypeScript

过去两周,我们一直在努力将Medusa的部分代码库迁移到 TypeScript。我们这样做有几个原因,所有这些原因都与提升开发者体验有关。现在,我们正在逐步合并迁移的初期阶段,我们很乐意分享一些见解,解释为什么我们一开始没有直接使用 TypeScript,以及为什么我们认为现在是时候了。

背景介绍

在全职开发 Medusa 之前,我们曾为几家不同的电商客户做过代理工作;其中一家客户当时想迁移到其他解决方案,但由于找不到合适的新平台,我们决定从头开始构建一个定制解决方案。我们最初的目标只有一个,那就是优化和自动化客户的所有工作流程,所以我们直接进入了开发模式。随着项目和客户规模的扩大,新的需求也随之出现,我们不得不重新开始。这是我们第一次在项目的可维护性和长期易用性方面权衡各种方案。我们基于以下几点评估了各种方案:

  • 成长型企业发生很大变化
    • 在业务增长阶段,您可以先使用基本工具,但随着流程变得更加复杂,您通常需要调整堆栈中的工具。我们希望构建架构以适应这一洞察;让您能够轻松地使用最佳工具构建您的电商堆栈。注意 * 适合 2 人小团队的最佳工具与适合 25 人团队的最佳工具不同,因此您的堆栈必须是动态的。*
  • 成长型企业需要控制
    • 如果你正在快速发展,你需要掌控何时发生什么;你不能提出一个功能请求,然后坐等两年才实现。你必须能够立即启动整个流程。
  • 客户体验至上
    • 如果你想在众多标准化网站中脱颖而出,就必须高度重视客户体验。客户在访问电商网站时,应该感觉自己仿佛置身于一个品牌世界。为此,你可能需要改变标准的浏览、购买和结账流程,以真正适应产品或品牌的需求。
  • 开发人员是实现上述所有目标的关键
    • 开发人员往往因价格昂贵、速度慢、工作复杂而饱受诟病,这在一定程度上也情有可原;然而,目前有大量项目(Medusa 就是其中之一)致力于提高开发人员的效率,降低对开发人员能力的要求,最终让商家能够更早地利用无头平台技术。随着优秀开发者工具生态系统的不断发展壮大,尽早迁移到无头平台对新商家的吸引力将越来越大。

上述要求是我们早期做出的一些高层决策的基础:

  • 我们创建了一个简单而模块化的架构,为您提供开箱即用的所有基础知识,并提供必要的接口,以便轻松与其他工具集成,为您提供最佳堆栈。
  • 我们开源了所有内容,以便用户和商家能够完全控制构建的内容
  • 我们提供出色的 API 和工具来创建定制的电子商务体验,从而推动业务发展
  • 我们仔细思考如何以最适合开发人员的方式设计事物,并在我们的堆栈中选择开发人员喜欢的工具

为什么我们一开始没有选择 TypeScript

您现在可能会想:好吧,但是如果您想使用开发人员喜欢的工具,为什么不从 TypeScript 开始呢?事实是,当我们开始开发时,我们优化的是速度;由于当时 TypeScript 经验有限,我们觉得如果决定走这条路,可能会有很多未知的问题需要克服。此外,TypeScript 并不像今天这样广泛,如果我们选择了一种几年后就会逐渐消退的语言咳嗽CoffeeScript 和朋友们) ,那将是非常可悲的。这并不是说我们不喜欢 TypeScript,相反,我们一直认为 TypeScript 非常强大,然而,根据 Lindy 的说法,我们决定值得等待一段时间。

一开始就不使用 TypeScript 让我们能够做其他很棒的事情,比如创建一个非常强大的核心架构和一些很棒的插件,这些插件可以为Stripe、Segment、Sendgrid 等系统提供集成。我们能够以惊人的速度做到这一点,并快速迭代,每天更改 API(这是早期客户较少的特权之一),而不会产生太多复杂情况,最终让我们达到了这一点,我们已经弄清楚了数据应该如何流动的细节,并且我们对模块化和可组合性所需的类型和接口有了很好的理解。

为什么现在是时间

当你是某个项目的单独开发者和用户时,你会非常熟悉这些 API,因为它们是你编写的。有时你的记忆可能有点不清楚,但通常情况下,这不会影响你的工作流程,所以你不会太在意 IntelliSense 是否能发挥作用。然而,当你开始处理不是你创作的东西时,情况就会发生很大的变化,而且不仅从用户的角度,也从贡献者的角度。假设你正在编写调用团队中其他人编写的某个函数的代码。虽然你可能已经和你的队友讨论过 API 的工作方式以及应该进行什么样的数据流,但你可能不知道确切的实现细节,这时,准备好所有工具就变得非常有用了。

Medusa TypeScript IntelliSense

我们非常高兴看到 Medusa 社区的蓬勃发展,因此我们深知需要尽可能地改进生态系统中的所有工具,以提供最佳的开发者体验。此外,我们坚信 TypeScript 将会长期存在,因此,现在正是时候!

我们该如何做

迁移整个代码库需要一些时间,所以我们将从最合理的部分开始逐步推进。我们已经在数据层使用了 TypeORM,因此所有数据库实体都已类型化。我们已将 TypeScript 添加到所有核心 API 的控制器中,用于对所有负载和响应进行类型化。这带来了一个惊人的好处:能够在核心项目和我们的 JS 客户端之间共享类型定义,这实际上确保了当您通过我们的客户端库进行调用时,您看到的是用于验证请求负载的准确类属性

下一步

我们将逐步将 TypeScript 添加到核心包中,最终目标是迁移所有代码。如果您有兴趣提供帮助或想尝试 Medusa,请查看我们的GitHub 代码库加入我们的 Discord,在那里您可以直接联系工程团队!

鏂囩珷鏉ユ簮锛�https://dev.to/medusajs/why-we-migerated-to-typescript-after-all-3efa
PREV
2023 年 7 大 Next.js 动画库
NEXT
在不到 10 分钟的时间内将 Shopify 后端转变为开源和无头后端