Closed1

Remix の Splat Routes は最も優先順位が低いので注意が必要

uttkuttk

どういうこと?

Remix には Splat Routes というルーティング機能があり、その機能を使うと複数のパス ( セグメント ) にマッチするページを実装できます。

以下の api.$.ts のように $ のみセグメントを定義すると、/api/* のような URL にマッチするようになります 👇

./app/routes/api.$.ts
import { json } from '@remix-run/node';

export default function loader() {
  return json({ message: "この`loader()`は`/api/*`にマッチします" })
}

しかし、ここで注意なのが Splat Routes の優先順位は必ず最後になるため、似たような機能である Dynamic Segments と併用すると意図した挙動にならないことがあります。

具体例を挙げると、

  • $username.profile.ts ← Dynami Routes で定義したページ
  • api.$.ts ← Splat Routes で定義したページ

二つのページがあった時に /api/profile へリクエストすると、直感的には api.$.ts にマッチしそうですが、Splat Routes の優先順位は必ず最後になるため、$username.profile.ts にマッチしてしまいます。

そのため、Splat Routes を使う場合は URL のフォールバックとして使い、それ以外の用途では使用しない方が良さそうです。

動作環境

package.json
 "dependencies": {
    "@remix-run/node": "^2.8.1",
    "@remix-run/react": "^2.8.1",
    "@remix-run/serve": "^2.8.1",
  },
  "devDependencies": {
    "@remix-run/dev": "^2.8.1",
  },

参考

https://github.com/remix-run/remix/issues/9227

このスクラップは2024/04/24にクローズされました