一键导入
solidstart-routing
SolidStart file-based routing: routes directory structure, dynamic routes, nested layouts, route groups, app.tsx setup with FileRoutes component.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
SolidStart file-based routing: routes directory structure, dynamic routes, nested layouts, route groups, app.tsx setup with FileRoutes component.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
SolidJS advanced components: SuspenseList for coordinating multiple Suspense boundaries, NoHydration for skipping hydration of static content.
SolidJS advanced utilities: createRoot for manual disposal, createUniqueId for SSR-safe IDs, useTransition for batching async updates, observable for RxJS interop, modifyMutable for batch updates.
SolidJS control flow: Show for conditionals, Switch/Match for multiple conditions, For/Index for lists, Dynamic for dynamic components, Suspense for async data.
SolidJS advanced JSX attributes: @once for static values, attr:*/bool:*/prop:* for Web Components, textContent for text nodes, innerHTML for raw HTML.
SolidJS lifecycle: onMount for DOM access after mount, onCleanup for resource disposal, effect lifecycle management, component vs effect cleanup.
Core SolidJS primitives: signals use getter functions count(), components run once (no re-renders), effects track automatically, stores use direct property access, memos for computed values. Fine-grained reactivity means targeted DOM updates.
| name | solidstart-routing |
| description | SolidStart file-based routing: routes directory structure, dynamic routes, nested layouts, route groups, app.tsx setup with FileRoutes component. |
| metadata | {"globs":["src/routes/**/*","src/app.tsx","src/entry-*.tsx"]} |
public/ # Static assets
src/
├── routes/ # File-based routing
├── entry-client.tsx # Client entry
├── entry-server.tsx # Server entry
├── app.tsx # Root component
Routes created by files in src/routes/. Each file must default export a component.
routes/index.tsx → /routes/about.tsx → /aboutroutes/blog.tsx → /blog// routes/index.tsx
export default function Index() {
return <div>Home</div>;
}
routes/users/[id].tsx → /users/:idroutes/posts/[[slug]].tsx → /posts/:slug? (optional)routes/docs/[...path].tsx → /docs/* (catch-all)// routes/users/[id].tsx
import { useParams } from "@solidjs/router";
export default function UserProfile() {
const params = useParams();
return <div>User {params.id}</div>;
}
Create directories for nested routes:
routes/blog/article-1.tsx → /blog/article-1// routes/blog/article-1.tsx
export default function Article() {
return <article>Content</article>;
}
Create layout file with same name as directory:
// routes/blog.tsx - layout
import { RouteSectionProps } from "@solidjs/router";
export default function BlogLayout(props: RouteSectionProps) {
return (
<div>
<nav><h1>Blog</h1></nav>
<main>{props.children}</main>
</div>
);
}
// routes/blog/article-1.tsx - nested route
export default function Article() {
return <article>Content</article>;
}
Use parentheses for organization (don't affect URL):
routes/
├── (auth)/
│ ├── login.tsx → /login
│ └── signup.tsx → /signup
└── (marketing)/
├── about.tsx → /about
└── contact.tsx → /contact
Rename index files with parentheses for clarity:
routes/blog/(blog).tsx → /blog (instead of routes/blog/index.tsx)Use parentheses to escape nested structure:
routes/
├── users.tsx # Layout
├── users/
│ ├── index.tsx # /users
│ └── projects.tsx # /users/projects
└── users(details)/
└── [id].tsx # /users/:id (separate layout)
Export route object for preloading:
import type { RouteDefinition } from "@solidjs/router";
export const route = {
preload({ params }) {
return getData(params.id);
}
} satisfies RouteDefinition;
export default function Page() {
return <div>Content</div>;
}
import { Suspense } from "solid-js";
import { Router } from "@solidjs/router";
import { FileRoutes } from "@solidjs/start/router";
export default function App() {
return (
<Router root={(props) => <Suspense>{props.children}</Suspense>}>
<FileRoutes />
</Router>
);
}
Critical: Always wrap router root with <Suspense> - routes are lazy-loaded.
entry-client.tsx:
import { mount, StartClient } from "@solidjs/start/client";
mount(() => <StartClient />, document.getElementById("app")!);
entry-server.tsx:
import { StartServer, createHandler } from "@solidjs/start/server";
export default createHandler(StartServer);