React CRA & Jest から Vite & Vitest への移行で得られた教訓
この記事は、2024 年 12 月 16 日に公開された EDOCODE Advent Calendar 2024 用です。
前回の記事は、EDOCODE プロダクトマネージャー 山田 泰司氏が執筆しました: Notion Webhook とノーコードツール「Make」を使った自動メールシステム (記事は日本語です)。
親会社のWano Advent Calendarもぜひチェックしてください!
はじめに
当社のアプリ Gojiberry は、販売者が顧客から貴重なフィードバックを収集するのに役立つ Shopify アンケート アプリです。
私たちは、アプリにバグがなく、既存の機能を壊すことなく自信を持って新機能をリリースできることを保証するために、最初からテスト駆動開発 (TDD) で Gojiberry を構築してきました。この基盤により、Create React App (CRA) から Vite への移行などの大規模な変更を最小限の中断で行うことができました。
CRA が非推奨になり、その依存関係が時代遅れになったとき、私たちは成長するアプリをより適切にサポートできる最新のビルド ツールにアップグレードする時期が来たと判断しました。コードベースのサイズが大きいため、多少の複雑さが加わりましたが、Vite への切り替えには努力の価値があることがわかりました。
私たちの目標は、2 つの React プロジェクトを移行することでした。
- ?アンケート: 回答を収集するためにエンドユーザーに表示されます。
- ?管理者ダッシュボード: 販売者がアンケートを設定し、分析を表示するために使用します。
実用的な顧客フィードバックを収集したい Shopify ストアのオーナーの方は、今すぐ Shopify App Store で Gojiberry を試してみてください!
移行の動機
CRA は以前は役に立ちましたが、現在は保守されておらず、その依存関係は時代遅れになっています。これにはいくつかの課題が生じました:
- ? 古いライブラリ: 非同期テストの処理に大幅な改善が導入された user-events v14 のような重要なライブラリに更新できませんでした。
- ? 遅いテスト: Jest テストは時間の経過とともに遅くなり、Vite と Vitest によって提供されるビルドとテストの高速化が必要でした。
- ⚖️ 一貫性のない動作: モノリポジトリ内の 2 つのプロジェクトでは、両方とも同じユーザー イベント バージョンを使用しており、1 つはすべてのアクションを act() でラップする必要がありましたが、もう 1 つは必要ありませんでした。この矛盾により混乱が生じ、開発が遅れました。
ユーザーイベント v14 の主な変更点
ユーザー イベント v14 の最大の改善点の 1 つは、すべてのインタラクション メソッドで await を使用する必要があることです。これにより、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 とリミックス:
- ? コードベースの再構成: どちらのフレームワークでも、規約に合わせてコードベースを再構成する必要があり、これは時間のかかるプロセスでした。
- ?️ インフラストラクチャの変更: これらのフレームワークはシングル ページ アプリケーション (SPA) フレームワークではないため、これらを採用するには、展開およびホスティング インフラストラクチャの更新が必要になります。
- ⚖️ ニーズに対して過剰です: これらはサーバー側のレンダリングとルーティングに優れた機能を提供しますが、これらの機能は私たちのユースケースには不要でした。
-
Vite を選んだ理由:
- ? 最小限のコード変更: Vite では既存のコードベースにほとんど変更を加える必要がなかったので、移行が簡単かつ効率的になりました。
- ?️ Jest との 1 対 1 の互換性: Vitest は Jest と高い互換性があるため、最小限の調整でほとんどのテスト コードを再利用できます。
- ⚡ パフォーマンスの向上: Vite ではビルド時間が短縮され、Vitest ではテスト実行が大幅に高速化されました。
Vite を選択することで、本格的なフレームワークを採用する複雑さを回避しながら、最新の軽量ビルド ツールのメリットを享受できました。
移行プロセス
モノリポには 2 つの個別の npm プロジェクトが含まれているため、移行には体系的に取り組みました。移行の実行方法は次のとおりです:
-
小さいプロジェクトから始めます:
- ?️ 最初に小規模なプロジェクトを移行することで、大規模なプロジェクトを危険にさらすことなく、潜在的な落とし穴を特定することができました。
-
移行手順:
各プロジェクトのプロセスは次の手順に従いました:- ? Vite への移行: CRA を Vite に置き換え、エラーを修正し、アプリが正しくビルドされて実行されることを確認します。
- ? TypeScript エラーを修正: Vite ではより厳格な TypeScript ルールが導入され、コードベースの問題が明らかになりました。これらを修正するとコードの回復力が高まり、悪い習慣が減りました。
- ✅ Vitest に移行: テストを Jest から Vitest に移行します。
- ? テスト エラーを修正: Jest と Vitest が特定のシナリオを処理する方法の違いによって引き起こされる破損したテストに対処します。
- ? user-events v14 にアップグレード: テスト ライブラリを更新し、壊れたテストを修正します。多くのテストでは手動による修正が必要でしたが、ほとんどの問題は、必要なときに React の状態変更を待たないなど、不適切なテスト ケースに起因していました。これは、テストのエラーを見つけて修正する貴重な機会でした。
-
より大きなプロジェクトに対して繰り返します:
- ?小規模なプロジェクトの移行が成功した後、同じ手順をより大きなプロジェクトに適用しました。
直面した課題
- ? テストの失敗: Vitest への移行とユーザー イベント v14 へのアップグレードにより、多数のテストが失敗しました。ただし、これらの失敗により、React の状態変更に対する await 呼び出しの欠落など、テスト ケースの根本的な問題が明らかになりました。これらを修正することで、テストの精度と信頼性が向上しました。
- ?️ TypeScript の厳格さ: Vite のより厳格な TypeScript ルールにより、コード内に問題のあるパターンが明らかになりました。これらのエラーを修正するには余分な労力が必要でしたが、最終的にはよりクリーンで回復力のあるコードベースが完成しました。
結果
CRA から Vite への移行、および Vitest およびユーザー イベント v14 への移行により、開発ワークフローが大幅に改善されました。
- ⚡ ビルド時間とテスト時間の短縮: 移行後、テスト スイートは 30% 短縮された時間で完了し、CI パイプラインが大幅に高速化されました。
- ? 瞬時のホット リロード: 開発中の Vite のホット モジュール交換 (HMR) はほぼ瞬時に行われ、CRA よりも大幅に改善され、開発がよりシームレスかつ効率的になりました。
- ? テストの明確さと信頼性の向上: ユーザー イベント v14 と Vitest へのアップグレードにより、テストがよりクリーンで一貫性のあるものになりました。移行中に多くの誤ったテストが修正されたため、隠れたバグを見つけてコード全体の品質を向上させることができました。
- ?️ 弾力性のあるコードベース: Vite のより厳格な TypeScript ルールにより、コード内に改善の余地があるいくつかの領域が明らかになり、アプリがより堅牢になり、不正行為の可能性が減りました。
この移行はゲームチェンジャーであり、コードベースの信頼性を維持しながら、より高速に反復できるようになりました。
学んだ教訓
私たちの経験から得られるポイントをいくつか紹介します:
- ? 小規模から開始: リスクを軽減し、プロセスを改善するために、小規模なプロジェクトから始めます。
- ⏳ 壊れたテストを計画する: 一部のテスト ケースが壊れることを想定し、それらを修正する時間を割り当てます。こうした失敗によって、対処する価値のあるより深い問題が明らかになることがよくあります。
- ?️ より厳格なルールを採用する: 厳格な TypeScript ルールとフレームワークの違いは、最初は障害のように感じるかもしれませんが、最終的にはより良いコードベースにつながります。
- ? フレームワークを慎重に評価します: 既存のアーキテクチャと目標に合ったツールを選択します。
結論
CRA から Vite および Vitest への移行により、ワークフローが大幅に改善されました。より厳格な TypeScript ルールのおかげで、ビルドの高速化、ユーザー イベント v14 によるクリーンなテスト コード、およびより復元力の高いコードベースを享受できるようになりました。
この移行をよりスムーズにした主な要因の 1 つは、テスト駆動開発 (TDD) への初期投資でした。包括的なテストスイートを導入したことで、既存の機能を壊すことなく、自信を持って大規模な変更を加えることができました。
同様の移行を検討している場合、私たちの経験があなたの旅の指針となる貴重な洞察を提供することを願っています。
明日、2024 年 12 月 17 日の記事は、Gojiberry のプロダクト マーケティング マネージャー、Amee Xu による B2C から B2B への切り替え: マーケターの告白 となります。
ワノグループでは人材を募集しています!ご興味がございましたら、以下のリンクを使用して募集中のポジションをご確認ください:
求人 |ワノグループ
以上がReact CRA & Jest から Vite & Vitest への移行で得られた教訓の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます
