Přejít k navigační liště

Zdroják » Různé » Jak jsem zkoušel Inertia.js s Reactem a Djangem

Jak jsem zkoušel Inertia.js s Reactem a Djangem

Články Různé

Popíšu vám, jak jsem objevil Inertia.js. Ukážu, čím se odlišuje od podobných projektů, a co se mi na ní líbí.

Nálepky:

Po přechodu na single-page aplikaci (přibližně před rokem) se naše produktivita nezlepšila i přesto, že jsme tým prakticky zdvojnásobili. Říkal jsem si, že se to časem srovná. K přechodu nás donutil vývoj okolo 3rd party cookies, protože naše aplikace běží v iframe v administraci e-shopu. Pak přišel Hotwire od lidí okolo Rails, všimnul jsem si HTMX. Tyto knihovny používají HTML over the wire přístup, který pro nás není vhodný.

Inertia.js

A proto mě zaujala Inertia.js, která se od nich odlišuje. Snaží se totiž definovat protokol, jak by spolu měli React, Vue nebo Svelte aplikace a backend komunikovat. Díky tomu můžeme vytvářet JavaScriptové SPA bez nutnosti psát API a client-side routování. Na serveru jsou oficiálně podporované Laravel a Rails. Pro Django existuje neoficiální balíček.

Inertia funguje velmi podobně jako klasická webová aplikace. Stále píšeme controllery, čteme data pomocí ORM a renderujeme views. V případě Inertia jsou ale views JavaScriptové komponenty. Takové řešení vytváří velmi úzkou provázanost mezi backendem a frontendem, což je v případě klasických MVC aplikací běžná praxe a podle autora knihovny i jejich benefit.

Tento přístup je pro nás zajímavý hlavně kvůli Polaris – Design Systému od Shopify. Většinu HTML a CSS si nepíšeme sami, ale používáme React komponenty připravené Shopify.

Ve view pouze definuju, jaká komponenta se má použít a jaké props dostane. render_inertia rozhodne, jestli vrátí JSON nebo HTML odpověď.

def home(request):
    props = {
        "events": [{
            "id": 1,
            "title": "Title",
            "description": "description, wow"
        }],
    }
    return render_inertia(request, "Home", props)
Code language: JavaScript (javascript)

Přechod mezi stránkami

Pro přechod mezi stránkami existuje komponenta Link. Díky ní Inertia načte pouze data a nedochází k full-page refresh. Ineria totiž pošle požadavek s hlavičkou X-Inertia. Server v takovém případě pošle JSON místo HTML.

Nedílnou součástí každé aplikace jsou formuláře. Inertia proto nabízí helper funkce pro všechny podporované frameworky.

Ukázka

Samotný kód vypadá následovně. V případě Reactu má hook useForm na starosti uchování stavu, odeslání dat na server a validace. Způsob zpracování požadavku je velmi podobný klasickému odeslání formuláře. Pokud je potřeba uživateli zobrazit validační hlášku, stačí do props přidat klíč errors. Inertia helper useForm potom zpřístupní pomocí stejnojmenného klíče.

import React from 'react'
import { Link, useForm } from '@inertiajs/inertia-react'

export default function Create() {
    const { data, setData, post, processing, errors } = useForm({
        email: '',
        password: '',
        remember: false,
    })

    function submit(e) {
        e.preventDefault()
        post('/inertia/create')
    }

    return (
        <div>
            <h2>Create event</h2>
            <Link href="/inertia">Back</Link>
            <form onSubmit={submit}>
                <input type="text" value={data.email} onChange={e => setData('email', e.target.value)} />
                {errors.email && <div>{errors.email}</div>}
                <input type="password" value={data.password} onChange={e => setData('password', e.target.value)} />
                {errors.password && <div>{errors.password}</div>}
                <input type="checkbox" checked={data.remember} onChange={e => setData('remember', e.target.checked)} /> Remember Me
                <button type="submit" disabled={processing}>Login</button>
            </form>
        </div>
    )
}
Code language: JavaScript (javascript)

Zpracování POST requestu na serveru.

from inertia.views import render_inertia
from inertia.share import share, share_flash

def event_create(request):
    if request.method == "POST":
        data = json.loads(request.body)
        if not data["email"]: # Just so there's some validation
            share_flash(request, error=True, errors={"email": ["email can't be empty"]})
        else:
            share_flash(request, success=f"event {data['email']} created")
            return redirect(reverse("inertia_react:index"))

    return render_inertia(request, "Events.Create", {})
Code language: PHP (php)

Závěr

Momentálně převádíme jednu aplikaci na Inertia a zatím z toho mám dobrý pocit. Jsem velmi zvědavý, jak se osvědčí.

Inertia představuje velmi tenkou vrstvu mezi tradičními webovými frameworky a moderními frontendovými frameworky. Možnost použít React místo klasických šablon bez nutnosti vybudovat nejdříve API, je pro mě velmi lákavá. Nemusí to být ani konečný stav. Inertia může být krok mezi jednotlivými komponentami a SPA.

Komentáře

Odebírat
Upozornit na
guest
0 Komentářů
Nejstarší
Nejnovější Most Voted

Frugal computing: architektura pro dobu dražší infrastruktury

Vývojáři se naučili zrychlovat dotazy, přidávat cache, škálovat služby a hlídat účet za cloud. Frugal computing začíná o jednu otázku dřív: musí se výpočet, přesun dat, volání modelu nebo uložení vůbec stát? Rostoucí spotřeba datových center a nové evropské reportování ho posouvají do návrhu architektury, dřív než do závěrečné poznámky o udržitelnosti v prezentaci.

Odysseus: PewDiePie vydal open-source AI workspace, který běží na vašem vlastním hardwaru

AI
Komentáře: 0
Felix Kjellberg, youtuber se 110 miliony odběratelů, strávil rok učením se programovat a fine-tuningem vlastních AI modelů. Výsledkem je Odysseus – bezplatný, open-source workspace pro práci s umělou inteligencí, který neposílá žádná data do cloudu. Projekt má týden, přes 61 000 hvězdiček na GitHubu a znovu otevírá otázku, komu vlastně patří váš digitální kontext.

Když Git už nestačí: jak izolovat databázový stav pro pokusy AI agentů

Gitová větev vývojářům oddělí kód, ale databáze často zůstává společná. U AI agentů je to slabé místo: rychle spouštějí migrace, mění data a zkoušejí víc cest najednou. Databázová větev jim dá vlastní pracovní prostor, jenže tím práce nekončí. Ještě je potřeba řešit citlivá data, oprávnění, životnost větve i zbytek stavu aplikace.