Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Define `__SOLID_SERVER_COMPONENTS__` at build time so libraries can drop server-component-only client code

Ouverte
#396 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
55/100
Type d'issue
Fonctionnalité
Clarté
Clairement spécifiée
Activité
Active
Stack technique
rollup, typescript, vite
Domaine
build-system

Piste de recherche

Start in the main plugin's config() hook, next to the existing optimizeDeps.rolldownOptions.transform.jsx, and trace how serverFunctions.components and user define values are resolved. Add the constant in both requested define locations and cover the true, false, and user-provided cases; update the RFC 11 integration surface and server-components skill docs. Done when the checklist is covered and plugin tests pass.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Problem

@solidjs/router ships a client fallback for server-component forms. These forms arrive as URLs in the HTML with no client reference. When no action() handler is installed, the router intercepts POSTs under actionBase and lazily imports its action layer.

Only server-component apps need this, but every router app pays for it. In a minimal router app with no server functions (Vite 8, gzip):

  • about 0.85 KB eager (up to 1.4 KB when it's the app's only dynamic import);
  • a 16.8 KB lazy chain: the serverForms chunk (8.6 KB) plus the decode chunk (7.0 KB) and a server chunk (1.2 KB) behind it.

The router's flat build inlines all of it eagerly (about 8 KB).

Proposal

The plugin defines a global constant __SOLID_SERVER_COMPONENTS__. Core owns and documents the name, with the meaning "server components are enabled for this build".

  • Value: true when serverFunctions.components is truthy (including 'external'), otherwise false. It must always be defined: if it's left undefined, nothing can be removed.
  • Set it in both top-level define (build, and dev source via /@vite/env) and optimizeDeps.rolldownOptions.transform.define (dev pre-bundled dependencies; the optimizer ignores top-level define).
  • Respect a user-provided define[__SOLID_SERVER_COMPONENTS__].
  • Applying it to all environments is fine; it's harmless on the server.

Why a define

Whether a check folds away depends on the form:

Form Rollup Rolldown 1.2.6 esbuild
Imported, never-written let flag folds doesn't fold doesn't fold
Literal define folds folds folds

Cost

Zero for apps. One config entry in the plugin.

Router follow-up

declare const __SOLID_SERVER_COMPONENTS__: boolean | undefined;
if (typeof __SOLID_SERVER_COMPONENTS__ !== "undefined" && __SOLID_SERVER_COMPONENTS__) {
  /* intercept */ import("./serverForms.js")...
}
Bundler, solid entry today, KB gz eager / lazy with false
Rolldown 18.84 / 16.22 17.97 / 0
Rollup 19.74 / 15.22 18.94 / 0
esbuild 22.62 eager, serverForms lazy 20.95, serverForms gone
  • With true, output matches today and serverForms stays lazy, so server-component apps without action() still don't pay for it eagerly.
  • In the flat build, false saves about 7–8 KB eager.
  • The router's own build (tsc + Rollup) keeps the guard; no config change is needed.
  • Without the plugin, the fallback is off at runtime and the bytes are the same as today. Server-component setups without the plugin define the constant themselves, as documented in core.

Alternatives considered

  • configureClient setup modules: too much wiring through start mode.
  • A runtime flag in server-functions/frames: doesn't fold under Rolldown or esbuild (measured above).
  • The router installing the fallback from serverRouteComponent/action: leaves a coverage gap, because forms can arrive with neither present.
  • Asking Rolldown upstream to fold imported constants: out of our control.

Implementation sketch

This goes in the main plugin's config() hook, next to the existing optimizeDeps.rolldownOptions.transform.jsx, using the serverFunctions.components value resolved in solidPlugin().

const SC_KEY = "__SOLID_SERVER_COMPONENTS__";
// inside config():
const scDefine = { [SC_KEY]: userConfig.define?.[SC_KEY] ?? JSON.stringify(serverComponents) };
return {
  define: scDefine,
  optimizeDeps: {
    // ...existing
    rolldownOptions: { transform: { jsx: { runtime: "classic" }, define: scDefine }, plugins: [/* existing */] }
  }
};

Checklist

  • Plugin: define plus optimizeDeps.rolldownOptions.transform.define; respect the user's value.
  • Core docs: RFC 11 integration surface and the server-components skill (cross-link).
  • Router: wrapped guard; vitest define true plus an off-path test; changeset.
Langage dominant
TypeScript
Étoiles
522
Forks
72
Merge moyen
1 j 8 h
PR mergées (30 j)
29

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de solidjs/solid-vite-plugin

Toutes les issues de solidjs/solid-vite-plugin

Issues similaires

Plus d'issues TypeScript

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.