Sobes.tech
Middle

Waar trek je de grens tussen frontend- en backend-ontwikkeling?

sobes.tech AI

Antwoord van AI

De grens ligt op API-niveau. De backend is verantwoordelijk voor:

  • Bedrijfslogica
  • Gegevensbeheer (database, cache)
  • Autorisatie en authenticatie (indien niet in een aparte service)
  • Het leveren van gegevens en functies via API (REST, GraphQL, etc.)

Het frontend is verantwoordelijk voor:

  • Gebruikersinterface (HTML, CSS)
  • Interactie met de gebruiker (JavaScript/Ruby met Hotwire/etc.)
  • Het consumeren van gegevens en het aanroepen van functies via de API van de backend
  • Het presenteren van gegevens die van de backend zijn ontvangen

In de klassieke aanpak genereert de backend HTML-pagina's, en voegt het frontend alleen interactiviteit toe. In SPA (Single Page Application) is de grens duidelijker, omdat de interactie uitsluitend via API plaatsvindt.

Voorbeeld:

# app/controllers/api/users_controller.rb
# Backend: Verantwoordelijk voor het ophalen van de gebruiker uit de database en het formatteren van gegevens voor het 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: Verantwoordelijk voor het aanvragen van gegevens bij de backend en het weergeven ervan
document.addEventListener('DOMContentLoaded', () => {
  fetch(`/api/users/${userId}`) // userId wordt op frontend verkregen
    .then(response => response.json())
    .then(data => {
      document.getElementById('user-name').innerText = data.name;
      document.getElementById('user-email').innerText = data.email;
    });
});

In hybride benaderingen, zoals Hotwire, kan een deel van de renderlogica naar de backend worden verschoven, maar de interactie blijft gebaseerd op het overdragen van gegevens of HTML-fragmenten via specifieke protocollen (bijvoorbeeld Turbo Streams).

# app/controllers/posts_controller.rb
# Backend: Renders HTML voor 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
      # Foutafhandeling
    end
  end

  private

  def post_params
    params.require(:post).permit(:body)
  end
end
<!-- _post.html.erb -->
<!-- HTML-fragment dat via Turbo Stream naar de frontend wordt gestuurd -->
<div>
  <%= post.body %>
</div>

Het fundamentele principe: de backend levert gegevens en services, de frontend consumeert en visualiseert ze voor de gebruiker.