Known deviations
Names without an equivalent are listed in Not available.
Names without an equivalent are listed in Not available. Behavior not called out in the table follows the corresponding Solid API.
| Area | Solid | ShadowJS |
|---|---|---|
| Effect timing | Effects re-run after every write outside a batch | Queued, flushed in a microtask (ADR-007); memos are fresh at once |
| Effect arguments | createEffect((prev) => next, init) |
No prev/initial value; the return value is the cleanup |
createMemo seed |
createMemo(fn, init) |
No seed; prev is undefined first |
createRoot |
Not owned by the surrounding scope | Attached unless { detached: true } |
runWithOwner, onCleanup, onMount |
Errors go to the owner; onCleanup returns fn; onMount's return is ignored |
runWithOwner rethrows; onCleanup returns void; onMount's return is a cleanup |
| Signal equality | === |
Object.is |
useId |
createUniqueId() works anywhere |
Throws outside an owner |
useContext |
undefined without a provider |
Throws CONTEXT_MISSING |
splitProps |
A key belongs to the first matching group | A key belongs to every group that lists it |
| Store setter | Path updaters get plain values | Path updaters get drafts; do not return arrays of drafts |
Store undefined |
Setting undefined deletes the key |
Keeps it; use delete |
createMutable |
exists | none |
createResource |
Tuple | One object |
Keyed For |
n/a | key= rows get an item accessor |
Portal |
Wrapper div, bubbles through the component tree |
No wrapper; DOM-tree bubbling |
lazy().preload() |
Resolves to the module | Resolves to the component |
| Event handlers | Re-bound when the expression changes (on:) |
Bound once |
innerHTML="literal" |
Sets the property | Becomes an attribute; use an expression |
| Destructured props, derived consts | Lose reactivity | Stay live inside components |
renderToStringAsync |
Resolves to a string | Resolves to { html, data } |
| Head tags in SSR | MetaProvider plus getAssets() |
A createServerHead() collector passed as the head option |