モノリシックな Express ルーターをドメイン別ルートに分割する
Devin は 2,000 行の Express ルーターをドメインごとのルートファイルに分割し、共通のミドルウェアを抽出して共有したうえで、すべての import を更新し、すべてのテストが通ることを検証します。Devin にモノリスを見せる
おなじみのあのファイル――18か月かけて肥大化したひとつの Express ルーターです。あらゆるドメインのエンドポイントが ターゲットとする構成をどのような形にしたいのかを、Devin に正確に伝えてください。
src/routes/index.ts にすべて集約されていて、ユーザー登録の隣に決済の Webhook、その隣に商品検索が並んでいます。インラインの認可・認証チェックは 40 個のハンドラーにコピペされていて、誰も触りたがりません。注文ロジックを変更すると、300 行上にあるユーザー用エンドポイントが壊れるかもしれないからです。ファイルの先頭は、たいていこんな感じになっています。src/routes/index.ts (before — 2,000 lines)
規約でDevinをガイドする
Devin はコードベースを読み込んでパターンを推論しますが、リファクタリングの場面では Knowledge のエントリが最も効果を発揮します。Devin に従わせたい規約について、エントリを追加します:
- ルーターパターン — 「各ドメインルーターは
Router()を使用し、アプリケーションのルートでapp.use('/domain', domainRouter)としてマウントする」 - ミドルウェア — 「認証ミドルウェアは
src/middleware/に配置し、常にインポートして使用し、その場で定義しない」 - エラーハンドリング — 「すべてのルートハンドラーは
src/lib/asyncHandler.tsのasyncHandlerラッパーを使用し、生の try/catch は使わない」
src/routes/admin.ts のパターンに従ってください。このファイルはすでにきれいに分離されています」のような一文を追加してください。Advanced Devin を使って、Knowledge エントリを生成させることもできます。規約を説明するだけで、確認して保存できる、よく構造化されたエントリを作成します。Devin の PR をレビューする
Devin はすべてのエンドポイントをマッピングし、インポートグラフをトレースし、共通ロジックを抽出し、ドメインファイルを作成し、ルートルーターを組み替えたうえで、テストスイートを実行します。一般的な PR は次のようになります。分割後のクリーンなルートルーターは次のとおりです。また、共有ミドルウェアを正しくインポートしたドメインルートファイルは次のとおりです:すべてのURLパスは同一のままです —
src/routes/index.ts (after — 15 lines)
src/routes/orders.ts (after — excerpt)
/orders は /orders にマウントされた ordersRouter によって処理されるため、既存のクライアントやテストは変更なしでそのまま動作します。(任意)ブランチをチェックアウトしてローカル環境でテストする
このような構造的なリファクタリングの場合は、マージする前にブランチをローカルに pull して確認しておくことをおすすめします。Windsurf やお好みの IDE でチェックし、アプリを起動していくつかのエンドポイントにアクセスし、ルーティング、ミドルウェア、エラー処理が以前と同様に動作していることを確認してください。何か気になる点があれば、PR にコメントを残してください — Devin がそれを拾い上げて修正を反映します。
