Если ты хоть раз настраивал проект на современных мета-фреймворках, то наверняка ловил себя на противоречивых чувствах. С одной стороны, серверные компоненты (RSC) и Server Actions — штука удобная: не нужно писать контроллеры API ради одной формы и гонять лишний JavaScript на клиент. С другой стороны, монополия Next.js App Router принесла громоздкую экосистему с медленным холодным стартом dev-сервера, непрозрачным кэшированием и привязкой к платформе Vercel.
Я всегда с интересом слежу за независимыми альтернативами, и релиз Farm.js 0.1 от команды Farming Labs стал приятным сюрпризом. Разработчики скрестили скорость Vite с полноценным стеком RSC, добавив под капот нативный AOT-компилятор на Rust.
Архитектура: Vite, Nitro и кастомный RSC
Главное отличие Farm.js — отказ от монолитного сборочного конвейера. Пока классические решения опираются на тяжелые связки Webpack или форки, Farm.js берет проверенный Vite в dev-режиме и универсальный движок Nitro для сборки.
В результате мы получаем мгновенный запуск и сверхбыстрый HMR. При этом развертывание свободно: благодаря Nitro-адаптерам проект одинаково собирается под Node.js, Bun, Docker или бессерверные Cloudflare Workers и AWS Lambda. Похожий эволюционный путь недавно прошел и SvelteKit 3.0: переход на Vite-конфигурацию и чистые subpath-импорты, где интеграция с Vite упростила жизнь инженерам.
Маршрутизация в Farm.js построена внутри app/ с автоматической генерацией строгих типов TypeScript. Ты объявляешь серверные экшены прямо внутри компонента с директивой 'use server':
// app/routes/items/page.tsx
import { db } from '@/lib/db';
async function updateItem(formData: FormData) {
'use server';
const id = formData.get('id') as string;
const title = formData.get('title') as string;
await db.items.update({ where: { id }, data: { title } });
}
export default async function ItemsPage() {
const items = await db.items.findMany();
return (
<main className="container">
<h1>Каталог компонентов</h1>
<form action={updateItem}>
<input name="title" placeholder="Новое название" />
<button type="submit">Сохранить</button>
</form>
<ul>
{items.map((item) => (
<li key={item.id}>{item.title}</li>
))}
</ul>
</main>
);
}
Экспериментальный AOT-компилятор
Самая любопытная фича — Ahead-of-Time (AOT) компилятор в связке с нативным Rust-рендерером Strata.
Стандартный React при изменении состояния строит виртуальное дерево и запускает reconciliation. AOT-компилятор Farm.js анализирует JSX еще на этапе сборки: для чистых компонентов он исключает виртуальный DOM и генерирует прямые мутации реальных узлов. В тестах на key-swap это дало ускорение до 6.8 раза при снижении нагрузки на CPU. А серверный движок Strata на Rust рендерит HTML-поток без оверхеда, как и Релиз Nuxt 4.5: переход на Vite 8, Rspack 2 и экспериментальное SSR-стриминг вещание.
Включается оптимизация в farm.config.ts:
import { defineConfig } from '@farm.js/core';
export default defineConfig({
renderer: 'react',
react: {
experimentalAot: true,
strataNativeSSR: true,
},
nitro: {
preset: 'node-server',
},
});
Используй experimentalAot в дашбордах и тяжелых таблицах. При наличии нестандартных динамических контекстов компилятор откатывается к стандартному рантайму React.
Farm.js 0.1 доказывает, что полностековый React может быть быстрым и независимым.
