Solid
@flagward/solid — provider, useFlag y useFlags.
Instalación
npm install @flagward/solidRequiere Solid 1.8 o más reciente. @flagward/core viene incluido — no lo
instalas por separado.
Guía rápida
Envuelve la app en el provider una sola vez:
// index.tsx
import { render } from 'solid-js/web';
import { FlagwardProvider } from '@flagward/solid';
import App from './App';
render(
() => (
<FlagwardProvider apiKey="your-environment-api-key" host="https://flags.example.com">
<App />
</FlagwardProvider>
),
document.getElementById('root')!,
);Luego pide una flag donde de verdad se toma la decisión:
import { useFlag } from '@flagward/solid';
function Checkout() {
const { value, isLoading } = useFlag('new-checkout');
return (
<Switch>
<Match when={isLoading()}>
<LegacyCheckout />
</Match>
<Match when={value()}>
<NewCheckout />
</Match>
<Match when={!value()}>
<LegacyCheckout />
</Match>
</Switch>
);
}El valor es un accessor
Los hooks devuelven Accessors, así que llamarlos dentro del JSX mantiene
el tracking de grano fino sobre el que está construido Solid:
const { value } = useFlag('new-checkout');
return (
<Show when={value()} fallback={<LegacyCheckout />}>
<NewCheckout />
</Show>
);Un if (value()) plano en el cuerpo del componente se ejecuta una sola
vez, fuera de cualquier scope de tracking, así que no vuelve a ejecutarse
cuando la flag cambia. Lee el accessor dentro del JSX, de createMemo o de
createEffect cuando el resultado deba mantenerse en vivo.
El contexto puede ser reactivo
En todo lugar donde se toma un contexto — el provider, useFlag,
getFlag — acepta una signal o un getter plano tan fácilmente como un
objeto plano:
const [user, setUser] = createSignal({ plan: 'standard' });
const { value } = useFlag('beta', user);
setUser({ plan: 'pro' }); // la flag se reevalúa, el DOM se actualizaHooks
Recurre a useFlag. useFlags se gana su lugar cuando las claves no se
conocen donde escribes el código, cuando necesitas una flag donde un hook
no puede ir (getFlag funciona en cualquier lugar), o cuando un componente
lee varias flags:
const { flags, isLoading, error, getFlag } = useFlags();
flags(); // { "new-checkout": true, ... }
getFlag('beta'); // una flag, contexto de la app
getFlag('beta', { plan: 'pro' }); // una flag, este contextoDe dónde viene el contexto
<FlagwardProvider apiKey={apiKey} context={user}> // quién es el usuario
useFlag('beta', { plan: 'pro' }) // solo esta llamadaUn contexto pasado a useFlag pertenece únicamente a esa llamada — no se
publica en ningún lugar, y el mapa que devuelve useFlags se resuelve solo
contra el contexto del provider.
Perder la red
El provider abre un stream de SSE y lo mantiene sincronizado por sí solo:
una flag cambiada en el servidor llega a cada componente en menos de un
segundo, volver a estar en línea vuelve a leer las flags, y donde no hay
EventSource — renderizado en servidor, Node plano — las actualizaciones
en vivo se reportan como apagadas mientras las flags ya leídas siguen
funcionando.
Fuera de Solid
import { FlagwardClient, evaluateFlag } from '@flagward/solid';El cliente y el evaluador se reexportan aquí, así que un store, un route guard, o un módulo plano pueden usarlos sin un componente.