Sobes.tech
Middle

Πού περνάς τα σύνορα μεταξύ ανάπτυξης frontend και backend;

sobes.tech AI

Απάντηση από AI

Το όριο βρίσκεται στο επίπεδο του API. Το backend είναι υπεύθυνο για:

  • Επιχειρηματική λογική
  • Διαχείριση δεδομένων (βάση δεδομένων, cache)
  • Εξουσιοδότηση και αυθεντικοποίηση (αν δεν είναι διαχωρισμένο σε ξεχωριστή υπηρεσία)
  • Παροχή δεδομένων και λειτουργιών μέσω API (REST, GraphQL κ.λπ.)

Το frontend είναι υπεύθυνο για:

  • Διεπαφή χρήστη (HTML, CSS)
  • Αλληλεπίδραση με τον χρήστη (JavaScript/Ruby με Hotwire κ.λπ.)
  • Κατανάλωση δεδομένων και κλήση λειτουργιών μέσω του API του backend
  • Παρουσίαση δεδομένων που λαμβάνονται από το backend

Στην κλασική προσέγγιση, το backend δημιουργεί σελίδες HTML, και το frontend απλώς προσθέτει διαδραστικότητα. Στο SPA (Single Page Application), τα όρια είναι πιο σαφή, καθώς η αλληλεπίδραση γίνεται αποκλειστικά μέσω API.

Παράδειγμα:

# app/controllers/api/users_controller.rb
# Backend: Υπεύθυνο για την ανάκτηση του χρήστη από τη βάση δεδομένων και τη μορφοποίηση των δεδομένων για το 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: Υπεύθυνο για το αίτημα δεδομένων από το backend και την εμφάνισή τους
document.addEventListener('DOMContentLoaded', () => {
  fetch(`/api/users/${userId}`) // userId λαμβάνεται στο frontend
    .then(response => response.json())
    .then(data => {
      document.getElementById('user-name').innerText = data.name;
      document.getElementById('user-email').innerText = data.email;
    });
});

Σε υβριδικές προσεγγίσεις, όπως το Hotwire, μέρος της λογικής απόδοσης μπορεί να μεταφερθεί στο backend, αλλά η αλληλεπίδραση βασίζεται ακόμα στη μεταφορά δεδομένων ή τμημάτων HTML μέσω συγκεκριμένων πρωτοκόλλων (π.χ., Turbo Streams).

# app/controllers/posts_controller.rb
# Backend: Απόδοση HTML για 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
      # Διαχείριση σφαλμάτων
    end
  end

  private

  def post_params
    params.require(:post).permit(:body)
  end
end
<!-- _post.html.erb -->
<!-- Τμήμα HTML που αποστέλλεται στο frontend μέσω Turbo Stream -->
<div>
  <%= post.body %>
</div>

Βασική αρχή: το backend παρέχει δεδομένα και υπηρεσίες, το frontend τα καταναλώνει και τα οπτικοποιεί για τον χρήστη.