Rendering React
Paket @nuforge/react me-render pohon View reaktif dari sebuah Frame dengan React. Sebuah Frame memuat pohon View hidup yang dihasilkan dari program Anda, dan paket ini mengikat pohon tersebut ke React sehingga UI diperbarui otomatis saat state reaktif berubah.
Rendering klien
Bungkus aplikasi Anda dengan NuProvider dan render sebuah frame dengan NuFrame:
'use client';
import { NuProvider, NuFrame } from '@nuforge/react';
export function Page({ nu, frame }) {
return (
<NuProvider nu={nu}>
<NuFrame frame={frame} />
</NuProvider>
);
}
Ekspor
NuProvider— menaruh instance Nu pada konteks React sehingga turunannya dapat menjangkaunya.useNu()— membaca Nu dari konteks. Panggil di dalam komponen yang di-render di bawah sebuahNuProvider.observer(Component)— sebuah higher-order component (gaya mobx-react-lite) yang me-render ulang komponen yang dibungkus setiap kali state reaktif yang dibacanya berubah.NuFramesendiri adalah sebuah observer, sehingga ia diperbarui secara langsung saat state berubah.NuFrame— me-render pohon View dari sebuah frame.
Pemetaan DOM
Saat pohon View dipetakan ke elemen DOM, nama atribut dinormalisasi ke padanan React-nya:
classmenjadiclassName.formenjadihtmlFor.- Sebuah binding dua arah (
value:={x}di DSL) me-render input terkontrol. Ia mempertahankan propvaluedan menambahkan handleronChangeyang menulis nilai baru (atauchecked) kembali ke state.
Rendering server (RSC / SSR)
Untuk output statis tanpa JS klien, impor dari entry server. NuStatic dan renderView keduanya diekspor dari @nuforge/react/server:
import { Nu } from '@nuforge/core';
import { Parser } from '@nuforge/parser';
import { NuStatic } from '@nuforge/react/server';
import * as t from '@nuforge/types';
// A React Server Component — no client JS for the runtime
export default function Page() {
const nu = Nu.create();
nu.load(t.state({ program: Parser.parseProgram(SOURCE) }));
const frame = nu.createFrame({ component: { name: 'App' } });
return <NuStatic frame={frame} />;
}
NuStatic dan renderView bersifat murni: keduanya tidak memakai hook, tidak memo, dan tidak membawa banner 'use client'. Hal itu membuat keduanya menghasilkan first paint statis tanpa JavaScript runtime yang dikirim ke browser. Saat Anda butuh interaktivitas, pasangkan output statis dengan NuFrame klien (yang ter-hydrate) agar halaman menjadi hidup setelah first paint.
Ini siap untuk Next.js App Router: entry klien membawa banner 'use client', sementara entry server tetap bebas dari direktif klien sehingga dapat berjalan di dalam React Server Component.
Hooks & helper
Hook praktis memangkas boilerplate saat menyambungkan runtime ke React:
'use client';
import { useNuFromSource, useFrame, NuProvider, NuFrame } from '@nuforge/react';
export function Demo({ source }: { source: string }) {
const nu = useNuFromSource(source); // parse + load sekali, dibuang saat unmount
const frame = useFrame(nu, 'App'); // membuat frame, dibuang saat unmount
return (
<NuProvider nu={nu}>
<NuFrame frame={frame} />
</NuProvider>
);
}
useNuFromSource(source, opts?)— bangun runtime dari DSL dalam satu pemanggilan (membungkusNu.fromSource).useFrame(nu, component)— membuat dan otomatis membuang frame.useObserved(compute)— primitif granular: re-render hanya saat nilai reaktif yang dibaca di dalamcomputeberubah, jadi Anda membaca tepat yang dibutuhkan alih-alih membungkus seluruh komponen:
import { useObserved, useNode } from '@nuforge/react';
function TitleField({ id }: { id: string }) {
const node = useNode(id); // lookup bertipe dari <NuProvider>
const title = useObserved(() => node?.props.title); // re-render hanya saat title berubah
return <input value={String(title ?? '')} readOnly />;
}
useNode(id)— cari node berdasarkan id dari provider terdekat.
Langkah berikutnya
- Ekspor Kode — ubah sebuah program menjadi komponen React mandiri tanpa nuforge saat runtime.
- Memulai — siapkan proyek dan render frame pertama Anda.