Vidact is een tool die React-functiecomponenten tijdens het build-proces compileert naar VanillaJS. Hierdoor wordt de runtime-overhead geminimaliseerd: de body van een component wordt slechts één keer uitgevoerd bij het mounten, waarna setState-aanroepen uitsluitend de specifieke tekstnodes en attributen bijwerken die de betreffende state gebruiken.
Belangrijke aspecten van Vidact zijn:
- Performance: De bundle-groottes zijn zeer compact, waarbij een eenvoudige counter-app inclusief runtime slechts 8.0 kB groot is.
- Vidact Start: Een uitgebreid framework dat functionaliteiten toevoegt zoals Server Side Rendering (SSR), file-based routing en hydratatie.
- Ondersteuning en Beperkingen: Vidact ondersteunt een gedocumenteerde subset van React 19. Elementen zoals class components,
createRef en bepaalde third-party pakketten worden niet ondersteund. Bij gebruik hiervan stopt de compiler het build-proces met een specifieke foutmelding, in plaats van terug te vallen op de volledige React-runtime.
Vidact: React gecompileerd naar VanillaJS
Snelstart: npx vidact my-app
Beta: Vidact compileert een gedocumenteerde subset van React 19 en weigert de rest tijdens het build-proces.
Voorbeelden in actie
De onderstaande voorbeelden zijn geschreven in standaard React, gecompileerd door Vidact en geïmplementeerd op deze pagina:
- Counter
- Form
- Keyed list
- Branches
Voorbeeld: Counter.tsx
import { useState } from 'react'
export function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
<output>Count: {count}</output>
</div>
)
}
Resultaat:
- Knop: Increment
- Tekst: Count: 0
Analyse:
- Component calls: 1
- DOM mutations: 0
- Tree diffs: 0
Live gemeten door een MutationObserver die deze demo bewaakt.
Bundle-groottes (gzipped)
- Counter app (inclusief runtime): 8.0 kB
tests/runtime-size/fixtures/counter.tsx
- TodoMVC (inclusief runtime): 11.8 kB
examples/todomvc/src/TodoApp.tsx
Belangrijk detail: De component-body wordt slechts één keer uitgevoerd, bij het mounten.
Het overkoepelende framework: Vidact Start
Vidact Start voegt functionaliteiten toe zoals file routes, server loaders, SSR (Server Side Rendering), hydratatie en client-navigatie. Omdat dezelfde compiler zowel de server- als de browser-build produceert, komen de markup die de server verzendt en de DOM die de client hydrateert voort uit één enkele beschrijving van de component.
Voorbeeld: Route-definitie
src/routes/products/$productId.tsx
import { defineFileRoute } from '@vidact/start'
const loader = async ({ params }) => ({
product: await findProduct(params.productId),
})
export function ProductRoute({ loaderData }) {
return <h1>{loaderData.product.name}</h1>
}
export const Route = defineFileRoute({
loader,
component: ProductRoute,
})
Wat niet wordt ondersteund
Bepaalde onderdelen vallen buiten de ondersteunde subset, waaronder:
- Class components
createRef
- De meeste
Children-helpers
- React DevTools
- Third-party pakketten die vooraf zijn gecompileerd tegen de React-runtime in plaats van tegen React-vormige broncode.
Deze beperkingen leiden niet tot stille fouten. De compiler stopt het build-proces bij de regel die de fout veroorzaakt en specificeert de betreffende API. Er is geen fallback-mechanisme dat in plaats daarvan React laadt.
Voorbeelden van build-output fouten
src/Clock.tsx:3:28: UnsupportedSyntax: React class components are unsupported; use a function component and Vidact errorBoundary
src/Toggle.tsx:5:18: UnsupportedSyntax: unsupported React event prop onWiggle; use a supported React 19 event name
Vidact: React gecompileerd naar VanillaJS
Snelstart: npx vidact my-app
Beta: Vidact compileert een gedocumenteerde subset van React 19 en weigert de rest tijdens het build-proces.
Voorbeelden in actie
De onderstaande voorbeelden zijn geschreven in standaard React, gecompileerd door Vidact en geïmplementeerd op deze pagina:
- Counter
- Form
- Keyed list
- Branches
Voorbeeld: Counter.tsx
import { useState } from 'react'
export function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
<output>Count: {count}</output>
</div>
)
}
Resultaat:
- Knop: Increment
- Tekst: Count: 0
Analyse:
- Component calls: 1
- DOM mutations: 0
- Tree diffs: 0
Live gemeten door een MutationObserver die deze demo bewaakt.
Bundle-groottes (gzipped)
- Counter app (inclusief runtime): 8.0 kB
tests/runtime-size/fixtures/counter.tsx
- TodoMVC (inclusief runtime): 11.8 kB
examples/todomvc/src/TodoApp.tsx
Belangrijk detail: De component-body wordt slechts één keer uitgevoerd, bij het mounten.
Het overkoepelende framework: Vidact Start
Vidact Start voegt functionaliteiten toe zoals file routes, server loaders, SSR (Server Side Rendering), hydratatie en client-navigatie. Omdat dezelfde compiler zowel de server- als de browser-build produceert, komen de markup die de server verzendt en de DOM die de client hydrateert voort uit één enkele beschrijving van de component.
Voorbeeld: Route-definitie
src/routes/products/$productId.tsx
import { defineFileRoute } from '@vidact/start'
const loader = async ({ params }) => ({
product: await findProduct(params.productId),
})
export function ProductRoute({ loaderData }) {
return <h1>{loaderData.product.name}</h1>
}
export const Route = defineFileRoute({
loader,
component: ProductRoute,
})
Wat niet wordt ondersteund
Bepaalde onderdelen vallen buiten de ondersteunde subset, waaronder:
- Class components
createRef
- De meeste
Children-helpers
- React DevTools
- Third-party pakketten die vooraf zijn gecompileerd tegen de React-runtime in plaats van tegen React-vormige broncode.
Deze beperkingen leiden niet tot stille fouten. De compiler stopt het build-proces bij de regel die de fout veroorzaakt en specificeert de betreffende API. Er is geen fallback-mechanisme dat in plaats daarvan React laadt.
Voorbeelden van build-output fouten
src/Clock.tsx:3:28: UnsupportedSyntax: React class components are unsupported; use a function component and Vidact errorBoundary
src/Toggle.tsx:5:18: UnsupportedSyntax: unsupported React event prop onWiggle; use a supported React 19 event name