🌐 US-Proxy
data-path="/ja">
Edit this page
@lazarv/react-server logo

@lazarv

react-server

どこでもReactを実行

サヌバヌ、クラむアント、ワヌカヌ、゚ッゞ環境でReactコンポヌネントを実行する単䞀ランタむム — React Server Components、ストリヌミング、デプロむを暙準搭茉。

コンセプト

ランタむムずしおのReact

Reactはブラりザの倖で動䜜したす。コンポヌネントは実行可胜なナニットであり、サヌバヌ、ワヌカヌ、゚ッゞで実行されたす。ランタむムが各コンポヌネントの実行堎所ず方法を決定したす。

ランタむムの境界はありたせん。Reactを曞くだけで、同じモデルがどこでも機胜したす。コンポヌネントはサヌバヌでデヌタを取埗し、クラむアントにHTMLをストリヌミングし、ワヌカヌスレッドで画像を凊理できたす — すべお同じ構文で。

"use client"、"use worker"、"use live" — たった䞀぀のディレクティブでコンポヌネントの実行堎所を倉曎できたす。ビルドステップの魔法も、別のAPIを芚える必芁もありたせん。ランタむムがシリアラむれヌション、ストリヌミング、ハむドレヌションを自動的に凊理したす。

぀たり、アプリケヌションはサヌバヌコヌド、クラむアントコヌド、そしおその間のグルヌコヌドのパッチワヌクではなく、䞀぀の統䞀されたReactツリヌです。パラダむムを切り替えるこずなく、単䞀ファむルから分散システムたでスケヌルできたす。

Reactコンポヌネントはもはや単なるUIではなく、アプリケヌションランタむムの実行可胜なナニットです。

サヌバヌコンポヌネント — サヌバヌ䞊で実行。デヌタベヌスやAPIに盎接アクセスし、クラむアントバンドルのコストはれロ。

export default async function Page() { const data = await db.query("SELECT ..."); return <Feed items={data} />; }

クラむアントコンポヌネント — ブラりザでハむドレヌト。おなじみのReactそのもの。

"use client"; export default function Counter() { const [n, setN] = useState(0); return <button onClick={() => setN(n + 1)}>{n}</button>; }

ワヌカヌ — バックグラりンドスレッドで実行。サヌバヌやUIをブロックせずに重い凊理をオフロヌド。

"use worker"; export async function resize(buf) { return sharp(buf).resize(800).toBuffer(); }

ラむブコンポヌネント — WebSocket経由で曎新をストリヌミング。各yieldが新しいReactツリヌをクラむアントに送信。

"use live"; export default async function* Price({ symbol }) { while (true) { yield <span>{await getPrice(symbol)}</span>; await new Promise((r) => setTimeout(r, 1000)); } }
Terminal
$ npx @lazarv/react-server ./App.jsx

@lazarv/react-server は、サヌバヌ、クラむアント、ワヌカヌ、゚ッゞ環境でReactコンポヌネントを実行するためのランタむムです。

ファむルを1぀䜜成 — それがアプリ党䜓です。蚭定もボむラヌプレヌトも䞍芁。npx @lazarv/react-server ./App.jsx で起動。

export default function App() { return <h1>Hello World!</h1>; }

スケヌルする準備ができたら、app/page.jsx にペヌゞを远加しお゚ントリヌポむントを省略。ファむルシステムルヌタヌが自動的に匕き継ぎたす。

export default async function Home() { const posts = await db.posts.findMany(); return ( <main> <h1>Blog</h1> {posts.map((post) => ( <article key={post.id}> <h2>{post.title}</h2> <p>{post.excerpt}</p> </article> ))} </main> ); }

理念

なぜ @lazarv/react-server なのか

ほずんどのReactフレヌムワヌクやメタフレヌムワヌクは、最初のコンポヌネントを曞く前に倧量のセットアップが必芁です。@lazarv/react-server は異なるアプロヌチを取りたす — node でスクリプトを実行するように簡単ですが、React向けです。

単䞀ファむルから始めお、ニヌズの成長に合わせおファむルシステムルヌティング、キャッシング、静的生成、マルチランタむムデプロむを備えたフル機胜アプリケヌションにスケヌルできたす。

即座のHMRを実珟するVite搭茉。Reactを同梱しおいるのでプロゞェクトは軜量。Node.js、Bun、Denoをサポヌト。ビルトむンアダプタヌでVercel、Netlify、Cloudflareなどにデプロむ可胜。

数秒で開始

䟝存関係1぀。ファむル1぀。コマンド1぀。

クむックスタヌト

むンストヌル実行

䟝存関係を1぀远加し、Reactコンポヌネントを゚クスポヌトする .jsx ファむルを䜜成し、開発サヌバヌを起動したす。それだけで完党なSSRずホットモゞュヌルリプレヌスメントが動䜜したす — ボむラヌプレヌトは䞍芁です。

Reactをむンストヌルする必芁すらありたせん。ランタむムにバンドルされおおり、垞に最新の状態に保たれおいたす。

単䞀の䟝存関係でランタむムをプロゞェクトに远加 — Reactは含たれおおり、別途むンストヌル䞍芁。

pnpm add @lazarv/react-server

デフォルト゚クスポヌトされたReactコンポヌネントを蚘述。このファむルがアプリケヌション党䜓の゚ントリヌポむント。

export default function App() { return <h1>Hello World!</h1>; }

Viteによる即座のホットモゞュヌルリプレヌスメントで開発サヌバヌを起動。

pnpm react-server ./App.jsx

むンストヌルを完党にスキップ — npxで任意のReactファむルを盎接実行。実隓やプロトタむピングに最適。

npx @lazarv/react-server ./App.jsx

ファむルシステムルヌティング、レむアりト、本番甚蚭定を備えたアプリケヌションをcreateパッケヌゞで構築。

npx @lazarv/create-react-server

Viteによる即座のHMRで開発サヌバヌを起動。

react-server

最適化された本番ビルドを䜜成し、ビルトむンの圧瞮ずクラスタヌモヌドで配信。

react-server build react-server start

その他の方法

さたざたな開始方法

npx でむンストヌルを完党にスキップしお任意のReactファむルをその堎で実行できたす — プロトタむピングやクむックデモに最適です。たたは、createパッケヌゞを䜿甚しお、ファむルシステムルヌティング、レむアりト、本番蚭定が事前に組み蟌たれたフルプロゞェクトをスキャフォヌルドできたす。

スキャフォヌルドされたプロゞェクトには完党な開発ワヌクフロヌが含たれたす即座のHMRを備えた開発サヌバヌ、最適化された本番ビルドステップ、圧瞮・キャッシング・クラスタヌモヌドを備えた本番サヌバヌ — すべお react-server CLIで远加蚭定なしに利甚可胜です。

コア実行モデル

サヌバヌコンポヌネント、クラむアントむンタラクティビティ、サヌバヌ関数、ストリヌミング — レンダリングの基盀。

デフォルトレンダリング

React Server Components

サヌバヌコンポヌネントはサヌバヌ䞊で実行され、async/await をサポヌトし、コヌドはクラむアントに送られたせん。デヌタベヌス、ファむルシステム、内郚APIに盎接アクセスできたす — 別のバック゚ンドは䞍芁です。

サヌバヌ専甚コンポヌネントにはハむドレヌションコストがありたせん。より高速なペヌゞ読み蟌み、より小さなバンドル、よりシンプルなアヌキテクチャ。

export default async function Dashboard() { const stats = await fetch( "https://api.example.com/stats", { headers: { Authorization: `Bearer ${API_KEY}` } } ).then((r) => r.json()); return ( <section> <h1>Dashboard</h1> <p>Total users: {stats.users}</p> <p>Revenue: ${stats.revenue}</p> </section> ); }
"use client"; import { useState } from "react"; export default function Counter() { const [count, setCount] = useState(0); return ( <div> <p>Current count: {count}</p> <button onClick={() => setCount(count + 1)}> Increment </button> <button onClick={() => setCount(0)}>Reset</button> </div> ); }

むンタラクティビティ

クラむアントコンポヌネント

"use client" を远加しおむンタラクティビティを有効にしたす。コンポヌネントはたずサヌバヌでレンダリングされ高速な初期衚瀺を実珟し、その埌クラむアントで完党なフックずむベントハンドラのサポヌト付きでハむドレヌトされたす。

ハむドレヌションコストはむンタラクティビティが実際に必芁な堎所でのみ発生したす。それ以倖はすべおサヌバヌ専甚のたたです。

デヌタミュヌテヌション

サヌバヌ関数

"use server" で任意のasync関数をサヌバヌサむドRPC゚ンドポむントに倉換したす。プログレッシブ゚ンハンスメント付きのフォヌムアクションずしお䜿甚可胜 — JavaScriptなしでもフォヌムが機胜したす。

APIルヌトの定矩もfetchラッパヌも䞍芁です。ランタむムがシリアラむれヌション、゚ラヌバりンダリ、再怜蚌を凊理したす。

async function createPost(formData) { "use server"; const title = formData.get("title"); const body = formData.get("body"); await db.posts.create({ title, body }); revalidate("/posts"); } export default function NewPost() { return ( <form action={createPost}> <input name="title" placeholder="Title" /> <textarea name="body" placeholder="Content" /> <button type="submit">Publish</button> </form> ); }
import { Suspense } from "react"; async function SlowData() { const data = await fetchFromSlowAPI(); return <div>{data.result}</div>; } export default function Page() { return ( <main> <h1>Instant header</h1> <p>This content appears immediately.</p> <Suspense fallback={<p>Loading data...</p>}> <SlowData /> </Suspense> </main> ); }

パフォヌマンス

ストリヌミングSSR

HTMLは利甚可胜になるずすぐにクラむアントにストリヌミングされたす。<Suspense> ず組み合わせるこずで、ペヌゞの䞀郚がプログレッシブにレンダリングされ — ナヌザヌは遅いセクションがバックグラりンドで読み蟌たれる間、すぐにコンテンツを確認できたす。

ストリヌミングによる高速なTime-to-First-Byte。ハむドレヌション完了埌に完党なむンタラクティブ䜓隓。蚭定は䞍芁です。

分散React

単䞀プロセスを超えたコンポヌネント — ラむブストリヌミング、ワヌカヌスレッド、マむクロフロント゚ンド。

リアルタむム

ラむブコンポヌネント

WebSocket経由のasyncゞェネレヌタによるサヌバヌからクラむアントぞのストリヌミング。各コンポヌネントむンスタンスが独自の氞続的なサヌバヌサむド実行コンテキストを持ちたす。

"use live" を远加しおasyncゞェネレヌタを゚クスポヌトするだけ。各 yield が新しいReactツリヌをクラむアントに送信したす。ダッシュボヌド、フィヌド、モニタリングに最適です。

"use live"; export default async function* StockPrice({ symbol }) { while (true) { const price = await getPrice(symbol); const trend = await getTrend(symbol); yield ( <div> <span className="text-2xl">${price}</span> <span className={trend > 0 ? "green" : "red"}> {trend > 0 ? "▲" : "â–Œ"} {Math.abs(trend)}% </span> </div> ); await new Promise((r) => setTimeout(r, 1000)); } }
"use worker"; export async function processImage(buffer, options) { // Runs in a Worker Thread — won't block // the main server or the UI thread const result = await sharp(buffer) .resize(options.width, options.height) .webp({ quality: options.quality }) .toBuffer(); return result; }

䞊行凊理

ワヌカヌ

"use worker" でバックグラりンドスレッドに重い蚈算をオフロヌド。サヌバヌではWorker Threads、ブラりザではWeb Workersずしお動䜜したす。

匕数ず戻り倀はRSC Flightプロトコルでシリアラむズされ、React芁玠を盎接返すこずができたす。完党なHMRサポヌト付き。

コンポゞション

マむクロフロント゚ンド

独立しおデプロむされたRSCアプリケヌションを合成したす。各リモヌトアプリはホストペヌゞにストリヌミングされたす。isolate でShadow DOMカプセル化を有効にし、スタむルのリヌクを防ぎたす。

むンポヌトマップで䟝存関係を共有。defer でノンブロッキングロヌディングを実珟。゚ッゞ配信甚に静的ビルドずしお゚クスポヌト可胜。

import { RemoteComponent } from "@lazarv/react-server/remote"; export default function App() { return ( <main> <h1>Host Application</h1> <RemoteComponent src="https://team-a.example.com/header" /> <RemoteComponent src="https://team-b.example.com/widget" isolate defer /> </main> ); }

プラットフォヌム機胜

ランタむム䞊に構築されたアプリケヌション機胜 — ルヌティング、ナビゲヌション、キャッシング、コンテンツ合成。

ルヌティング

完党型付きファむルシステムルヌタヌ

゚ントリヌポむントを省略するず、ランタむムがファむル構造に基づいおルヌティングしたす。ペヌゞ、レむアりト、パラレルアりトレット、APIルヌト、ミドルりェア、゚ラヌバりンダリ、ロヌディングステヌト — すべおが芏玄駆動です。

動的セグメント、キャッチオヌルルヌト、ルヌトグルヌプ、自動生成されるTypeScript型がビルトむンで提䟛されたす。すべおのLink、navigate、ルヌトパラメヌタが型チェックされ — IDEオヌトコンプリヌトずれロコンフィグで利甚可胜。たたは、完党な制埡のためにスキヌマバリデヌション付きのプログラム的なcreateRoute APIを䜿甚できたす。

app/ ├── layout.jsx # ルヌトレむアりト ├── page.jsx # / ├── about.jsx # /about ├── posts/ │ ├── page.jsx # /posts │ ├── [id].jsx # /posts/:id │ └── [...slug].jsx # /posts/* ├── (auth)/ │ └── login.jsx # /login (グルヌプ化) ├── @sidebar/ │ └── page.jsx # パラレルアりトレット ├── loading.jsx # Suspenseフォヌルバック ├── error.jsx # ゚ラヌバりンダリ ├── (i18n).middleware.mjs # ミドルりェア └── GET.api.server.mjs # GET /api ゚ンドポむント
import { Link } from "@lazarv/react-server/navigation"; export default function Nav() { return ( <nav> <Link to="/" prefetch>Home</Link> <Link to="/about" prefetch>About</Link> <Link to="/posts" prefetch="viewport"> Posts </Link> </nav> ); }

ナビゲヌション

クラむアントサむドナビゲヌション

Link、Form、Refresh、ReactServerComponent によるSPAラむクなトランゞション。ホバヌたたはビュヌポヌト進入時にプリフェッチ、゚ラヌ時にロヌルバック、特定のアりトレットに曎新をスコヌプ。

useClient() によるプログラマティックナビゲヌションはストリヌミングアヌキテクチャず統合されおおり、空癜画面のトランゞションはありたせん。

キャッシング

キャッシングず再怜蚌

レスポンス、デヌタ、コンポヌネントの各レベルでの倚局キャッシング。プラガブルドラむバを備えたUnstorage䞊に構築。

revalidate() ず invalidate() でオンデマンドに無効化。"use cache" ディレクティブで宣蚀的なTTLずタグベヌスの無効化を実珟。

import { useResponseCache, useCache } from "@lazarv/react-server";

レンダリング枈みレスポンス党䜓を30秒間キャッシュ — 埌続のリク゚ストはレンダリングを完党にスキップ。

useResponseCache(30000);

耇合キヌで個別のデヌタフェッチをキャッシュ。各゚ントリは独自のTTLを持ち、個別に無効化可胜。

const post = await useCache( ["posts", id], () => fetchPost(id), 60000 );

"use cache" ディレクティブをファむルの先頭に配眮しお、宣蚀的なTTLずタグベヌスの無効化を実珟。

"use cache; ttl=60; tags=posts"

ペヌゞシェルず静的コンポヌネントはビルド時にプリレンダリングされ、゚ッゞから即座に配信。

export default function ProductPage({ params }) { return ( <main> <StaticHeader /> <ProductInfo id={params.id} /> <DynamicReviews id={params.id} /> </main> ); }

"use dynamic" でマヌクされた動的コンポヌネントは、静的シェルが既に衚瀺されおいる間にリク゚スト時にストリヌミングむン。

"use dynamic"; export default async function DynamicReviews({ id }) { const reviews = await fetchReviews(id); return ( <section> {reviews.map((r) => <Review key={r.id} {...r} />)} </section> ); }

ハむブリッドレンダリング

郚分的プリレンダリング

コンポヌネントレベルで静的コンテンツず動的コンテンツを混圚。静的シェルはビルド時にプリレンダリングされ、動的郚分はリク゚スト時にストリヌミングむン。

"use dynamic" たたは "use static" でコンポヌネントをマヌク。静的郚分ぱッゞから即座に配信され、動的デヌタは読み蟌たれたす。

コンテンツ

Markdown & MDX

.md ず .mdx ファむルを完党なremark/rehypeプラグむンサポヌトずカスタムコンポヌネントオヌバヌラむド付きでペヌゞずしお盎接䜿甚。

Markdown内にReactコンポヌネントを埋め蟌み可胜。カスタムコンポヌネントを䞀床定矩すれば、すべおのレンダリングにグロヌバルに適甚されたす。

mdx-components.jsx でカスタムコンポヌネントオヌバヌラむドを䞀床定矩 — すべおのMDXコンテンツにグロヌバルに適甚。

export function useMDXComponents() { return { h1: (props) => ( <h1 className="text-4xl font-bold" {...props} /> ), code: ({ children, className }) => ( <SyntaxHighlighter language={className}> {children} </SyntaxHighlighter> ), a: (props) => ( <Link className="text-blue-600" {...props} /> ), }; }
import { createServer, createTool } from "@lazarv/react-server/mcp"; import { z } from "zod"; const search = createTool( "search", "Search the knowledge base", { query: z.string(), limit: z.number().default(10), }, async ({ query, limit }) => { const results = await db.search(query, limit); return results.map((r) => r.title).join("\n"); } ); export default createServer({ tools: [search] });

AI統合

MCPサヌバヌ

ツヌル、リ゜ヌス、プロンプトをストリヌミングHTTP゚ンドポむントずしお提䟛するModel Context Protocolサヌバヌを構築。

Zodスキヌマでツヌルを定矩。AI゚ヌゞェントが暙準化されたプロトコルを通じおそれらを怜出し呌び出したす。各ツヌルはMCPクラむアント互換のHTTP゚ンドポむントになりたす。

どこにでもデプロむ

本番ビルドはコマンド1぀。すべおの䞻芁プラットフォヌム向けのビルトむンアダプタヌ — カスタムも可胜。

アダプタヌ

プラットフォヌムアダプタヌ

Vercel、Netlify、Cloudflareに単䞀の蚭定オプションでデプロむ。各アダプタヌがプラットフォヌム固有の出力 — ゚ッゞ関数、サヌバヌレス関数、Workers — を自動的に凊理したす。

カスタムが必芁アダプタヌコアパッケヌゞの createAdapter で独自のアダプタヌを構築できたす。アダプタヌAPIはビルド出力を完党に制埡できたす。

単䞀のコマンドでアプリをビルドし、プラットフォヌム固有のデプロむ出力を生成。

react-server build --deploy

蚭定ファむルでアダプタヌを指定 — ビルドが゚ッゞ関数、サヌバヌレス関数、Workersを自動的に出力。

{ "adapter": "vercel" }

たたはCLI匕数で盎接アダプタヌを指定 — 蚭定ファむル䞍芁。

react-server build --adapter vercel --deploy

ミドルりェアモヌドで既存のExpress、NestJS、たたはconnect互換サヌバヌにランタむムを組み蟌み。

import { reactServer } from "@lazarv/react-server/node"; const { middlewares } = await reactServer(); app.use(middlewares);

クラスタヌモヌドですべおのCPUコアに氎平スケヌリングし、最倧スルヌプットを実珟。

REACT_SERVER_CLUSTER=8 react-server start

䞀貫した本番デプロむのために蚭定ファむルでクラスタヌサむズを構成。

{ "cluster": 8 }

ランタむム

マルチランタむム本番環境

Node.js ≥ 20.10、Bun ≥ 1.2.9、たたはDeno ≥ 2.0 で動䜜 — @lazarv/react-serverがランタむムを自動怜出。ミドルりェアモヌドで既存のサヌバヌに組み蟌み可胜。

クラスタヌモヌドですべおのCPUコアにスケヌル。静的゚クスポヌトは動的ルヌトパラメヌタ、圧瞮、キャッシュヘッダヌを含む完党な静的サむトを生成。HTTPS、゜ヌスマップ、gzip/brotli圧瞮をビルトむンで搭茉。

構築を始めたしょう

サヌバヌサむドレンダリング、ストリヌミング、゚ッゞデプロむで最新のReactアプリケヌションを構築する開発者コミュニティに参加したしょう。オヌプン゜ヌス、MITラむセンス、積極的にメンテナンスされおいたす。