action is not tree-shakeable: read-only apps bundle the form path and signals' optimistic lanes (~3–4 KB br)
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 45/100
- issue の種類
- リファクタリング
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- typescript
- 領域
- performance
調査の方向性
Start from the router's source for setupNativeEvents and createRouterContext (form-submit interception and submission state), plus the module exporting action from @solidjs/router. Map which symbols pull verdictValue, dissolveLane, laneRead, isPending and latest from @solidjs/signals, then design the import-time registration seam so importing action installs them. Done means: a bundle of examples/hackernews without import { action } drops those symbols (~3–4 KB brotli, measured via solidjs/solid's scripts/size harness), while a bundle with action behaves identically — form interception, submissions and optimistic state unchanged.
索引モデルが issue の本文から書いたものです。
説明
Summary
A read-only app (no forms, no mutations — examples/hackernews in solidjs/solid is the canonical case) still bundles the router's action machinery: the form-submit interception in setupNativeEvents, the submission state wired in createRouterContext, action's own glue, and — through it — the optimistic-lane machinery from @solidjs/signals. None of it is reachable from the app's code, but the router core references it statically, so tree-shaking cannot remove it.
Proposal: make action self-installing. The core keeps a tiny seam (a submit hook + a submissions slot); import { action } from "@solidjs/router" registers the form path and the lane-backed submission state into that seam at import time. An app that never imports action bundles none of it. No laziness, no async — plain import-driven tree-shaking, the same shape Solid uses for its own opt-in features.
Measurements
Taken with solidjs/solid's size harness (scripts/size, Rolldown bundle, brotli) on @solidjs/[email protected] against solid-js / @solidjs/web 2.0.0-rc.13 — see solidjs/solid#3838 (page: base + router scenario). Local macOS / Node 26; minified bytes are exact, brotli ±tens of bytes vs Linux CI.
| minified | brotli | |
|---|---|---|
| router standalone (solid/web external) | 32,430 | 11,216 |
| router's marginal cost on a server-component page | +38,779 | +12,137 |
Of the +38,779 min marginal:
- router's own code: 28,008 —
createRouterContext3,029 ·setupNativeEvents2,398 (includes the form-action path) ·querycache 1,814 ·setupLinkClaims1,486 ·actionglue ≈ 2,360 · scroll restoration 788 ·browserHistory594 · … - retained from
@solidjs/signals: +8,583 — pulled byaction: the optimistic lanes (verdictValue,dissolveLane,laneRead),isPending/latest,createEffect,onSettled - retained from the server-function client: +1,188 (
GET/decodeResponse—query's, legitimately) - retained from
@solidjs/web: +1,137 (takeHydrationValue,registerElementClaim) - retained from
solid-js: +364
For a read-only app the action-attributable part is roughly the action glue + the form path inside setupNativeEvents + the signals lane machinery — on the order of 11–13 K minified, ≈ 3–4 KB brotli, carried for a feature the app never imports.
For scale: the router's standalone 11.2 KB br is larger than the entire eager frames (server-components) client after this week's size pass (10.9 KB), and about two-thirds of the whole solid-js + @solidjs/web hydrating runtime.
What "done" looks like
- An app importing
Router/ routes /A/useNavigate/query/preloadbut notactionbundles no form-submit interception, no submission state, and none of signals' lane machinery (verdictValue,dissolveLane,laneRead,isPending,latestabsent from the bundle unless the app uses them itself). - An app that imports
actionbehaves exactly as today (form interception, submissions, optimistic state) — the registration is at import time, synchronous, no behaviour change. - Measurable: a variant of solidjs/solid's
page: base + routerscenario (or anexamples/hackernewsscenario) with and withoutimport { action }; expected delta ≈ 3–4 KB brotli on the read-only variant.
Secondary candidates (same shape, smaller)
Scroll restoration (788 min) and the form path in setupNativeEvents could follow the same import-driven pattern. query / preload is the read side and should stay in the core.
Method, for reproduction
The attribution came from solidjs/solid's scripts/size/attribute.mjs over the harness bundle (per-function minified bytes; module-level reachability via the bundler's graph). Removing action's reach is measurable on an edited copy of the router's dist/ through the same bundler before any source change — happy to share the scripts.
- 主要言語
- TypeScript
- スター
- 1.3k
- フォーク
- 182
- 平均マージ
- 19時間 2分
- マージ済み PR(30日)
- 36
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
solidjs/solid-router のほかの issue
-
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
solidjs/solid-router#654 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
solidjs/solid-router#643 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
<A> costs ~6us of server CPU per instance during SSR (20x a plain <a>), mostly mergeProps/splitProps対応中かも @birkskyum が 59 日前に担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
solidjs/solid-router#583 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
solidjs/solid-router#569 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 3/5 1〜2日 初心者へのやさしさ 38/100
solidjs/solid-router#518 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
solidjs/solid-router の issue をすべて見る
似ている issue
-
[bug] diagnostics.dumpBody:Buffer 形态请求(透传 lane)跳过 dumps/ 落盘,仅留 raw/-unknown-対応中かも @ranxianglei が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
ranxianglei/billion-context#2421 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
pending triage
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
nuxt/test-utils#1842 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
MoonshotAI/kimi-code#4146 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
farbenmeer/tapi#531 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
メンテナーはふだん 1 日以内に返信