Дайджесты новостей
Архитектурная изометрия модульного сборочного конвейера Farm.js с блоками Vite, Nitro и нативным компилятором Rust AOT.

Farm.js: полностековый фреймворк на Vite с кастомным RSC и компилятором AOT

Если ты хоть раз настраивал проект на современных мета-фреймворках, то наверняка ловил себя на противоречивых чувствах. С одной стороны, серверные компоненты (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',
  },
});
Где AOT дает максимальный эффект

Используй experimentalAot в дашбордах и тяжелых таблицах. При наличии нестандартных динамических контекстов компилятор откатывается к стандартному рантайму React.

Farm.js 0.1 доказывает, что полностековый React может быть быстрым и независимым.