首页 web前端 js教程 从 React CRA 和 Jest 迁移到 Vite 和 Vitest 的经验教训

从 React CRA 和 Jest 迁移到 Vite 和 Vitest 的经验教训

Dec 27, 2024 am 06:28 AM

Lessons Learned Migrating from React CRA & Jest to Vite & Vitest

本文适用于 EDOCODE 2024 年降临节日历,于 2024 年 12 月 16 日发布。

上一篇文章由 EDOCODE 产品经理 Taiji Yamada 撰写:使用 Notion Webhooks 和无代码工具“Make”的自动化电子邮件系统(文章为日语)。

另外,请查看我们母公司集团公司的和之降临节日历!

简介

我们的应用程序 Gojiberry 是一款 Shopify 调查应用程序,可帮助商家从客户那里收集有价值的反馈。

从一开始,我们就通过测试驱动开发 (TDD) 来构建 Gojiberry,以确保我们的应用程序没有错误,并且我们可以在不破坏现有功能的情况下自信地发布新功能。这个基础使我们能够进行大规模的更改,例如从 Create React App (CRA) 迁移到 Vite,同时将干扰降至最低。

当 CRA 被弃用并且它的依赖项变得过时时,我们决定是时候升级到现代构建工具,以更好地支持我们不断增长的应用程序。我们的代码库规模较大,增加了一些复杂性,但事实证明,转向 Vite 的努力是值得的。

我们的目标是迁移我们的两个 React 项目:

  • ?调查:向最终用户显示以收集他们的回复。
  • ?管理仪表板:商家用来配置调查和查看分析。

如果您是 Shopify 店主,希望收集可行的客户反馈,请立即在 Shopify 应用商店中试用 Gojiberry!

迁移的动机

CRA 过去为我们提供了很好的服务,但它不再被维护,而且它的依赖项也已经过时了。这带来了一些挑战:

  • 过时的库:我们无法更新到用户事件 v14 等关键库,它在处理异步测试方面引入了重大改进。
  • 缓慢的测试:随着时间的推移,Jest 测试变得越来越慢,我们希望 Vite 和 Vitest 提供更快的构建和测试时间。
  • ⚖️ 不一致的行为:在我们的 monorepo 中的两个项目中,两个项目都使用相同的用户事件版本,一个需要使用 act() 包装每个操作,而另一个则不需要。这种不一致造成了混乱并减慢了开发速度。
用户事件 v14 的主要变化

用户事件 v14 中最大的改进之一是要求对所有交互方法使用 wait。这消除了在await waitFor 中包装操作的需要,使测试代码更干净且更易于维护。

之前(用户事件 v13):

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import MyComponent from './MyComponent';

test('updates state on click', async () => {
  render(<MyComponent />);

  userEvent.click(screen.getByRole('button'));

  await waitFor(() => {
    expect(screen.getByText('Updated state')).toBeInTheDocument();
  });
});
登录后复制
登录后复制

之后(用户事件 v14):

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import MyComponent from './MyComponent';

test('updates state on click', async () => {
  render(<MyComponent />);

  userEvent.click(screen.getByRole('button'));

  await waitFor(() => {
    expect(screen.getByText('Updated state')).toBeInTheDocument();
  });
});
登录后复制
登录后复制

此更改无需使用 waitFor 显式管理状态更改,从而简化了测试。开发人员不再需要考虑何时包含await waitFor,因为库会自动处理它。

用户事件 v14 和 Vitest 的改进解决了其中许多问题,提供了更干净、更快、更一致的开发体验。

考虑的替代方案

在选择 Vite 之前,我们评估了 Next.js 和 Remix。虽然两者都是强大的框架,但它们需要对我们的代码库和基础设施进行重大更改:

  • Next.js 和 Remix

    • 代码库重组:这两个框架都要求我们重组代码库以适应它们的约定,这将是一个耗时的过程。
    • ?️ 基础设施变化:这些框架不是单页应用程序 (SPA) 框架,因此采用它们需要更新我们的部署和托管基础设施。
    • ⚖️ 对我们的需求来说太过分了:虽然它们为服务器端渲染和路由提供了出色的功能,但这些功能对于我们的用例来说是不必要的。
  • 为什么我们选择Vite

    • 最少的代码更改:Vite 几乎不需要对我们现有的代码库进行任何更改,从而使转换简单而高效。
    • ?️ 与 Jest 一对一兼容性:由于 Vitest 与 Jest 高度兼容,我们可以通过最少的调整重用大部分测试代码。
    • 性能改进:Vite 提供了更快的构建时间,Vitest 显着加快了测试执行速度。

通过选择 Vite,我们避免了采用成熟框架的复杂性,同时获得了现代轻量级构建工具的好处。

迁移过程

我们系统地进行了迁移,因为我们的 monorepo 包含两个独立的 npm 项目。以下是我们执行迁移的方式:

  1. 从较小的项目开始

    • ?️ 首先迁移较小的项目使我们能够识别潜在的陷阱,而不会冒较大项目的风险。
  2. 迁移步骤

    每个项目的流程都遵循以下步骤:

    • 迁移到 Vite:用 Vite 替换 CRA,修复任何错误,并确保应用程序正确构建和运行。
    • 修复 TypeScript 错误:Vite 引入了更严格的 TypeScript 规则,暴露了代码库中的问题。修复这些问题使代码更具弹性并减少了不良做法。
    • 迁移到 Vitest:将测试从 Jest 转换到 Vitest。
    • 修复测试错误:解决由于 Jest 和 Vitest 处理某些场景的方式差异而导致的任何损坏的测试。
    • 升级到用户事件 v14:更新测试库并修复损坏的测试。虽然许多测试需要手动修复,但大多数问题源于不正确的测试用例,例如在必要时不等待 React 状态更改。这是在我们的测试中发现并纠正错误的宝贵机会。
  3. 对更大的项目重复

    • ?成功迁移较小的项目后,我们将相同的步骤应用于较大的项目。

遇到的挑战

  • 损坏的测试:迁移到 Vitest 并升级到 user-events v14 导致大量测试失败。然而,这些失败揭示了我们的测试用例中的潜在问题,例如缺少对 React 状态更改的等待调用。解决这些问题提高了我们测试的准确性和可靠性。
  • ?️ TypeScript 严格性:Vite 更严格的 TypeScript 规则暴露了我们代码中的有问题的模式。虽然修复这些错误需要付出额外的努力,但最终结果是一个更干净、更有弹性的代码库。

结果

从 CRA 迁移到 Vite,以及向 Vitest 和用户事件 v14 的过渡,为我们的开发工作流程带来了重大改进:

  • 更快的构建和测试时间:迁移后,我们的测试套件现在可以在减少 30% 的时间内完成,显着加快了我们的 CI 管道。
  • 即时热重载:Vite 在开发过程中的热模块替换(HMR)几乎是瞬时的,相对于 CRA 来说是一个巨大的改进,使开发更加无缝和高效。
  • 提高了测试清晰度和可靠性:升级到 user-events v14 和 Vitest 带来了更干净、更一致的测试。迁移过程中修复了许多错误的测试,帮助我们发现隐藏的错误并提高整体代码质量。
  • ?️ 弹性代码库:Vite 更严格的 TypeScript 规则暴露了我们代码中需要改进的几个领域,使应用程序更加健壮并减少了不良实践的可能性。

迁移改变了游戏规则,使我们能够更快地迭代,同时保持对代码库的信心。

经验教训

以下是我们的一些经验总结:

  • 从小处开始:从小项目开始,以降低风险并完善流程。
  • 针对损坏的测试制定计划:预期某些测试用例会损坏并分配时间来修复它们。这些失败往往揭示出值得解决的更深层次的问题。
  • ?️ 接受更严格的规则:虽然更严格的 TypeScript 规则和框架差异最初感觉像是障碍,但它们最终会带来更好的代码库。
  • 仔细评估框架:选择与您现有架构和目标相符的工具。

结论

从 CRA 迁移到 Vite 和 Vitest 为我们的工作流程带来了显着改进。现在,由于更严格的 TypeScript 规则,我们可以享受更快的构建、带有用户事件 v14 的更干净的测试代码以及​​更具弹性的代码库。

使这一过渡更加顺利的关键因素之一是我们对测试驱动开发 (TDD) 的早期投资。通过一套全面的测试,我们能够自信地进行大规模更改,而不会破坏现有功能。

如果您正在考虑进行类似的迁移,我们希望我们的经验能够提供宝贵的见解来指导您的旅程。


明天,2024 年 12 月 17 日,这篇文章将是 从 B2C 转向 B2B:营销人员的自白,作者:Gojiberry 产品营销经理 Amee Xu。

和之集团,我们正在招聘!如果您有兴趣,请使用以下链接查看我们的空缺职位:

工作机会 |和之集团

以上是从 React CRA 和 Jest 迁移到 Vite 和 Vitest 的经验教训的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1266
29
C# 教程
1239
24
神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

使用Next.js(后端集成)构建多租户SaaS应用程序 使用Next.js(后端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

See all articles