️ React Islands Integration

Lila provides a powerful "React Islands" architecture, allowing you to embed interactive React components directly into your Jinja2 templates. This approach combines the best of both worlds: the SEO and performance of server-side rendering with Lila, and the interactivity of React.

Installation

To set up the React environment in your project from the root directory, run:

CLI Command

lila-react create
            

This will scaffold the package.json, vite.config.js, and the react/ directory structure.

Usage

Once installed, you can use the new Jinja2 helpers vite_assets() and react().

Example of a full HTML template:

templates/html/react.html

<!DOCTYPE html>
<html lang="{{ lang }}">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="color-scheme" content="light dark" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <meta name="description" content="{{ description }}" />
    <meta name="keywords" content="{{ keywords }}" />
    <meta name="author" content="{{ author }}" />
    <title>{{ title }}</title>
    <link rel="icon" type="image/x-icon" href="/public/img/lila.png" />
    <link rel="stylesheet" href="/public/css/lila.css" />
    {{ vite_assets() | safe }}
  </head>
  <body>
    <main class="mt-4 container">
      <h1>Example React integration</h1>
      <div>{{ react('Counter', {'start': 3}) | safe }}</div>
    </main>
  </body>
</html>
            
How it Works

Development (DEBUG=True):
The vite_assets() helper injects scripts pointing to http://localhost:5173. You can start the dev server with:

Terminal

npm run dev
# OR
lila-react dev
            
Re-rendering React Islands

You can trigger a re-render of your React islands from standard JavaScript (e.g., from Twig templates, jQuery, or other non-React components) using the global function window.renderReactComponent(name).

This is useful for updating components that rely on shared client-side data like localStorage from other independent DOM elements without needing a complete page reload.

Terminal

//Example in client
// Re-render all React components on the page
renderReactComponent();

// Re-render only components named 'CartBadge'
renderReactComponent('CartBadge');
            

Production (DEBUG=False):
Run npm run build to compile your React code into public/build. The helper will automatically detect the manifest.json and load the hashed CSS and JS files for optimal performance.

Benefits

React Render (render components with htmlResponse without templates Jinja)

This reactRender method is used to return the HTML directly and load a React page or component, with styles, meta tags, custom scripts, and content/props.

ReactRender

from lila.core.templates import render,renderMarkdown,renderReact
...
router = Router()
@router.get("/react-page")
async def react_page(request: Request):
    response =renderReact(request=request,component="Counter",
    props={
        "start": 5
    } ,
    options={
        "title": "React Page",
        "description": "A React page with a counter component",
        "keywords": "React, counter, component",
        "author": "Lila",
        "styles": ["css/lila.css"]
    }                      
    )
    return response