Remix v2でbasePathを設定したい
公開日:
前提
@remix-run/node@1.19.3
@remix-run/react@1.19.3
@remix-run/serve@1.19.3
バージョンは 2 ではないですが、future_flag
を使用して、v2 のルーティングシステムを採用しています。
https://remix.run/blog/future-flags
remix.config.js
/** @type {import('@remix-run/dev').AppConfig} */
module.exports = {
future: {
v2_routeConvention: true,
},
};
やりたいこと
Remix
のアプリにおいてサブパスを設定したい。
例えば
app/
├── routes/
│ ├── _index.tsx
│ └── about.tsx
└── root.tsx
こんな感じのルーティングだったとして、
/hoge/about
でアクセスしたときにapp/routes/about.tsx
が表示されて欲しい。
結論
remix-flat-routes
という npm パッケージを使用しましょう。
https://www.npmjs.com/package/remix-flat-routes
remix.config.js
const { flatRoutes } = require('remix-flat-routes');
/**
* @type {import("@remix-run/dev").AppConfig}
*/
module.exports = {
// ignore all files in routes folder to prevent
// default remix convention from picking up routes
ignoredRouteFiles: ['**/*'],
routes: async (defineRoutes) => {
return flatRoutes('routes', defineRoutes, { basePath: 'hoge' });
},
};
簡単に設定できます。
試行錯誤 1
https://remix.run/docs/en/main/discussion/routes#manual-route-configuration
こいつを使って上手くできないものか
// 公式より引用
/** @type {import('@remix-run/dev').AppConfig} */
export default {
routes(defineRoutes) {
return defineRoutes((route) => {
route('/', 'home/route.tsx', { index: true });
route('about', 'about/route.tsx');
route('concerts', 'concerts/layout.tsx', () => {
route('/', 'concerts/home.tsx', { index: true });
route('trending', 'concerts/trending.tsx');
route(':city', 'concerts/city.tsx');
});
});
},
};
できなさそう…
試行錯誤 2
https://remix.run/docs/en/main/file-conventions/routes#route-file-naming
全てのファイル名の先頭にv2.
をつければ良いのでは
app/
├── routes/
│ ├── v2._index.tsx
│ └── v2.about.tsx
└── root.tsx
いや理想の動作はするけど…
かなりイカしてない。
最後に
https://github.com/remix-run/remix/discussions/2891
Remix のリポジトリでもかなり議論されている模様。
ライブラリ作成感謝。
では
Bye