Sobes.tech
Middle

Dove traccia il confine tra sviluppo frontend e backend?

sobes.tech AI

Risposta dell'AI

Il confine si trova a livello di API. Il backend si occupa di:

  • Logica di business
  • Gestione dei dati (database, cache)
  • Autorizzazione e autenticazione (se non esternalizzate in un servizio separato)
  • Fornire dati e funzioni tramite API (REST, GraphQL, ecc.)

Il frontend si occupa di:

  • Interfaccia utente (HTML, CSS)
  • Interazione con l'utente (JavaScript/Ruby con Hotwire/etc.)
  • Consumo di dati e chiamate di funzioni tramite API del backend
  • Presentazione dei dati ricevuti dal backend

Nell'approccio classico, il backend genera pagine HTML, il frontend aggiunge solo interattività. In SPA (Single Page Application), il confine è più netto, poiché l'interazione avviene esclusivamente tramite API.

Esempio:

# app/controllers/api/users_controller.rb
# Backend: Responsabile di recuperare l'utente dal database e formattare i dati per il frontend
class Api::UsersController < ApplicationController
  def show
    user = User.find(params[:id])
    render json: user.as_json(only: [:id, :name, :email])
  end
end
// app/javascript/packs/user_profile.js
// Frontend: Responsabile di richiedere dati al backend e visualizzarli
document.addEventListener('DOMContentLoaded', () => {
  fetch(`/api/users/${userId}`) // userId ottenuto nel frontend
    .then(response => response.json())
    .then(data => {
      document.getElementById('user-name').innerText = data.name;
      document.getElementById('user-email').innerText = data.email;
    });
});

Negli approcci ibridi, come Hotwire, parte della logica di rendering può essere spostata al backend, ma l'interazione si basa ancora sulla trasmissione di dati o frammenti HTML tramite protocolli specifici (ad esempio Turbo Streams).

# app/controllers/posts_controller.rb
# Backend: Rende HTML per Turbo Stream
class PostsController < ApplicationController
  def create
    @post = Post.new(post_params)
    if @post.save
      render turbo_stream: turbo_stream.append(:posts, partial: 'posts/post', locals: { post: @post })
    else
      # Gestione degli errori
    end
  end

  private

  def post_params
    params.require(:post).permit(:body)
  end
end
<!-- _post.html.erb -->
<!-- Frammento HTML inviato al frontend tramite Turbo Stream -->
<div>
  <%= post.body %>
</div>

Principio fondamentale: il backend fornisce dati e servizi, il frontend li consuma e li visualizza per l'utente.