SolidJS
Scanned 9/5/2026
Install to Claude Code
npx -y skills add Nevaberry/nevaberry-plugins --skill solidjs-knowledge-patch --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Solidjs Knowledge Patch?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/nevaberry-solidjs-knowledge-patch-nevaberry-plugins)More formats (shields.io, HTML) on the badges page.
---
name: solidjs-knowledge-patch
description: SolidJS
version: null
license: MIT
metadata:
author: Nevaberry
---
# SolidJS Knowledge Patch
Use these rules when working with SolidJS, Solid Router, or SolidStart. First
identify which package and runtime own an API: similarly named route, data,
response, and server helpers are not interchangeable.
## Reference index
| Reference | Topics |
| --- | --- |
| [Migration and UI](references/migration-and-ui.md) | Compiler validation, package resolution, JSX custom elements, boolean attributes, event listeners |
| [Reactivity and async](references/reactivity-and-async.md) | Router queries, async-data helpers, server functions, RPC transport |
| [Routing and SolidStart](references/routing-and-solidstart.md) | Filesystem routes, route definitions, navigation, SolidStart runtime and request APIs |
| [Stores and actions](references/stores-and-actions.md) | Action lifecycle, submissions, forms, revalidation, responses, redirects |
Read both routing and actions guidance when a mutation redirects or
revalidates route data.
## Migration triage
Check these compatibility-sensitive patterns first:
| Existing pattern or symptom | Adjustment |
| --- | --- |
| Router data helper named `cache` | Rename it to `query`; remove the old `store` option |
| Route option named `load` | Rename it to `preload` |
| Public router type named `Route` | Use `RouteDescription` |
| Capture listener written with `oncapture:` | Use an `on:` listener object with `capture: true` |
| Nested anchors or another browser-rewritten tree | Correct the invalid HTML; more structures fail compilation |
| Client compiler method imported during SSR | Resolution can succeed, but invoking the client-only method still throws |
| Resolver relies on the package `browser` field | Use export-condition-aware package resolution |
| SolidStart server call loops on a non-JSON response | Use a release containing the 1.3.2 transport fix |
Successful module resolution does not prove that an API is callable in the
current runtime.
## JSX and DOM quick reference
### Customized built-in elements
An `is` attribute opts a customized built-in element into Solid's custom
element behavior:
```tsx
<button is="fancy-button">Open</button>
```
### Boolean attributes
Use `bool:` when the attribute needs boolean-attribute semantics rather than
the property behavior Solid would otherwise choose:
```tsx
<my-element bool:enable={enabled()} />
```
### Non-delegated event options
Pass an event-listener object to `on:` when a non-delegated listener needs
browser options:
```tsx
<div
on:wheel={{
handleEvent(event) {
event.preventDefault();
},
passive: false,
capture: true,
}}
/>
```
The object may include `once`, `passive`, and `capture`. Prefer it over the
deprecated `oncapture:` syntax.
## Router data quick reference
Apply the current API names and contracts together:
| API | Current contract |
| --- | --- |
| `query` | Replaces `cache`; `handleResponse()` preserves headers |
| `createAsyncStorage` | Provides the storage-oriented async-data helper |
| `createAsync` | Exposes `.latest` and honors a supplied name |
| `action` | Supports `onComplete`, exposes errors, and returns a processed response |
| `Submission` | Import from the router package's top level |
| `SearchParams` | Import as a public type; values may be optional or arrays |
| `usePreloadRoute` | Obtains the route-preloading helper |
| `preloadRoute` | Accepts a string path |
Remember these action and form details:
- Clear only completed actions during navigation.
- A supplied action name is hashed instead of being replaced by `"mutate"`.
- Empty string and empty array revalidation values mean no revalidation.
- Form actions use URL-encoded bodies by default.
- Accept `URLSearchParams` only when encoding is not `multipart/form-data`.
## Filesystem routing quick reference
### Select the router around generated routes
`FileRoutes` exposes the generated configuration as both a component and a
regular function, allowing the application to choose and configure its
router:
```tsx
import { FileRoutes } from "@solidjs/start/router";
import { Router } from "@solidjs/router";
export default function App() {
return (
<Router>
<FileRoutes />
</Router>
);
}
```
Use the function form when the router needs the generated configuration
directly.
### Configure a route module
Export a named `route` object for router configuration:
```tsx
import type { RouteDefinition } from "@solidjs/router";
export const route = {
matchFilters: { id: /^\d+$/ },
} satisfies RouteDefinition;
export default function Story() {
return <main>Story</main>;
}
```
Do not repeat `component` in `route`; SolidStart lazy-wraps the default export
and supplies it as the component.
Use these filesystem naming rules:
- Parenthesized parts shape the route tree without participating in URL
matching.
- `[[name]]` declares an optional parameter.
- `[...name]` declares a catch-all whose value is one slash-delimited string.
## Server execution and transport
Place the directive inside a function whose implementation must execute only
on the server:
```ts
async function greeting(name: string) {
"use server";
return `Hello ${name}`;
}
```
Keep the normal TypeScript call shape. A server invocation remains direct,
while a browser invocation becomes an RPC. The transport can carry promises,
streams, and async iterables, so server functions can back existing client
data libraries in SSR and client-rendered applications.
For a mutation followed by navigation, let the router start destination
loading and stream that data in the mutation response. This combines the
update, redirect, and next-page load instead of creating a serial waterfall.
## Request and response quick reference
Export `OPTIONS` from a filesystem API route when the endpoint must answer a
CORS preflight directly:
```ts
export function OPTIONS() {
return new Response(null, {
status: 204,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
},
});
}
```
Type request-local state by augmenting `App.RequestEventLocals`. Import
`getServerFunctionMeta` from `@solidjs/start`; the older
`@solidjs/start/server` export is deprecated.
Treat response helpers as `Response` producers. Preserve headers through
`query().handleResponse()`, forward absolute redirects produced inside
server-side `cache` calls, and retain every `Set-Cookie` value on redirect
responses.
## SolidStart runtime checks
Before changing configuration or deployment code:
- Distinguish the stable Vite Environment API foundation from older 1.x
Vinxi applications and earlier 2.x alpha assumptions.
- Expect the stable line to use Vite 8, Rolldown, and direct deployment-plugin
integration while continuing to target Solid 1.
- Use `vite preview`; when Nitro's preview plugin is active, preview delegates
to Nitro even for a static build without a server entry.
- Import server-side types from `@solidjs/start/server` where needed.
- Expect API routes to honor the configured base URL.
- Configure the public-assets directory when the project does not use
`public`.
- Keep fixes for applications remaining on v1 on the `1.x` line.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!