💬 SPA Routes
??ェブサイトのページ遷移(ルーティング)
📺 まず動画で見る(YouTube)
▶ 【最新版】Claude(クロード)完全解説!20以上の便利機能をこの動画1本で全て解説 ↗
※ jpskill.com 編集部が参考用に選んだ動画です。動画の内容と Skill の挙動は厳密には一致しないことがあります。
📜 元の英語説明(参考)
MUST use when editing src/routes/ segments, src/spa/router/desktopRouter.config.tsx or desktopRouter.config.desktop.tsx (always change both together), mobileRouter.config.tsx, or when moving UI/logic between routes and src/features/.
🇯🇵 日本人クリエイター向け解説
??ェブサイトのページ遷移(ルーティング)
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 1
💬 こう話しかけるだけ — サンプルプロンプト
- › Spa Routes の使い方を教えて
- › Spa Routes で何ができるか具体例で見せて
- › Spa Routes を初めて使う人向けにステップを案内して
これをClaude Code に貼るだけで、このSkillが自動発動します。
📖 Claude が読む原文 SKILL.md(中身を展開)
この本文は AI(Claude)が読むための原文(英語または中国語)です。日本語訳は順次追加中。
SPA Routes and Features Guide
SPA structure:
src/spa/– Entry points (entry.web.tsx,entry.mobile.tsx,entry.desktop.tsx) and router config (router/). Router lives here to avoid confusion withsrc/routes/.src/routes/– Page segments only (roots).src/features/– Business logic and UI by domain.
This project uses a roots vs features split: src/routes/ only holds page segments; business logic and UI live in src/features/ by domain.
Agent constraint — desktop router parity: Edits to the desktop route tree must update both src/spa/router/desktopRouter.config.tsx and src/spa/router/desktopRouter.config.desktop.tsx in the same change (same paths, nesting, index routes, and segment registration). Updating only one causes drift; the missing tree can fail to register routes and surface as a blank screen or broken navigation on the affected build.
When to Use This Skill
- Adding a new SPA route or route segment
- Defining or refactoring layout/page files under
src/routes/ - Moving route-specific components or logic into
src/features/ - Deciding where to put a new component (route folder vs feature folder)
1. What Belongs in src/routes/ (roots)
Each route directory should contain only:
| File / folder | Purpose |
|---|---|
_layout/index.tsx or layout.tsx |
Layout for this segment: wrap with <Outlet />, optional shell (e.g. sidebar + main). Should be thin: prefer re-exporting or composing from @/features/*. |
index.tsx or page.tsx |
Page entry for this segment. Only import from features and render; no business logic. |
[param]/index.tsx (e.g. [id], [cronId]) |
Dynamic segment page. Same rule: thin, delegate to features. |
Rule: Route files should only import and compose. No new features/ folders or heavy components inside src/routes/.
2. What Belongs in src/features/
Put domain-oriented UI and logic here:
- Layout building blocks: sidebars, headers, body panels, drawers
- Hooks and store usage for that domain
- Domain-specific forms, lists, modals, etc.
Organize by domain (e.g. Pages, Home, Agent, PageEditor), not by route path. One route can use several features; one feature can be used by several routes.
Each feature should:
- Live under
src/features/<FeatureName>/ - Export a clear public API via
index.tsorindex.tsx - Use
@/features/<FeatureName>/...for internal imports when needed
3. How to Add a New SPA Route
-
Choose the route group
(main)/– desktop main app(mobile)/– mobile(desktop)/– Electron-specificonboarding/,share/– special flows
-
Create only segment files under
src/routes/- e.g.
src/routes/(main)/my-feature/_layout/index.tsxandsrc/routes/(main)/my-feature/index.tsx(and optional[id]/index.tsx).
- e.g.
-
Implement layout and page content in
src/features/- Create or reuse a domain (e.g.
src/features/MyFeature/). - Put layout (sidebar, header, body) and page UI there; export from the feature’s
index.
- Create or reuse a domain (e.g.
-
Keep route files thin
- Layout:
export { default } from '@/features/MyFeature/MyLayout'or compose a few feature components +<Outlet />. - Page: import from
@/features/MyFeature(or a specific subpath) and render; no business logic in the route file.
- Layout:
-
Register the route (desktop — two files, always)
desktopRouter.config.tsx: Add the segment withdynamicElement/dynamicLayoutpointing at route modules (e.g.@/routes/(main)/my-feature).desktopRouter.config.desktop.tsx: Mirror the sameRouteObjectshape: identicalpath/index/ parent-child structure. Use the static imports and elements already used in that file (see neighboring routes). Do not register in only one of these files.- Mobile-only flows: use
mobileRouter.config.tsxinstead (no need to duplicate into the desktop pair unless the route truly exists on both).
3a. Desktop router pair (desktopRouter.config × 2)
| File | Role |
|---|---|
desktopRouter.config.tsx |
Dynamic imports via dynamicElement / dynamicLayout — code-splitting; used by entry.web.tsx and entry.desktop.tsx. |
desktopRouter.config.desktop.tsx |
Same route tree with synchronous imports — kept for Electron / local parity and predictable bundling. |
Anything that changes the tree (new segment, renamed path, moved layout, new child route) must be reflected in both files in one PR or commit. Remove routes from both when deleting.
4. How to Divide Files (route vs feature)
| Question | Put in src/routes/ |
Put in src/features/ |
|---|---|---|
| Is it the route’s layout wrapper or page entry? | Yes – _layout/index.tsx, index.tsx, [id]/index.tsx |
No |
| Does it contain business logic or non-trivial UI? | No | Yes – under the right domain |
| Is it a reusable layout piece (sidebar, header, body)? | No | Yes |
| Is it a hook, store usage, or domain logic? | No | Yes |
| Is it only re-exporting or composing feature components? | Yes | No |
Examples
- Route (thin):\
src/routes/(main)/page/_layout/index.tsx→export { default } from '@/features/Pages/PageLayout' - Feature (real implementation):\
src/features/Pages/PageLayout/→ Sidebar, DataSync, Body, Header, styles, etc. - Route (thin):\
src/routes/(main)/page/index.tsx→ ImportPageTitle,PageExplorerPlaceholderfrom@/features/Pagesand@/features/PageExplorer; render with<PageTitle />and placeholder. - Feature:\
Page list, actions, drawers, and hooks live under
src/features/Pages/.
5. Progressive Migration (existing code)
We are migrating existing routes to this structure step by step:
- Phase 1 (done):
/pageroute – segment files insrc/routes/(main)/page/, implementation insrc/features/Pages/. - Later phases: home, settings, agent/group, community/resource/memory, mobile/share/onboarding.
When touching an old route that still has logic or features/ inside src/routes/:
- Prefer adding new code in
src/features/<Domain>/and importing from routes. - For larger refactors, move existing route-only logic into the right feature and then thin out the route files (re-export or compose from features).
- Use
git mvwhen moving files so history is preserved.
6. Reference Structure (after Phase 1)
Route (thin):
src/routes/(main)/page/
├── _layout/index.tsx → re-export or compose from @/features/Pages/PageLayout
├── index.tsx → import from @/features/Pages, @/features/PageExplorer
└── [id]/index.tsx → import from @/features/Pages, @/features/PageExplorer
Feature (implementation):
src/features/Pages/
├── index.ts → export PageLayout, PageTitle
├── PageTitle.tsx
└── PageLayout/
├── index.tsx → Sidebar + Outlet + DataSync
├── DataSync.tsx
├── Sidebar.tsx
├── style.ts
├── Body/ → list, actions, drawer, etc.
└── Header/ → breadcrumb, add button, etc.
Router config continues to point at route paths (e.g. @/routes/(main)/page, @/routes/(main)/page/_layout); route files then delegate to features.