Clientseitige und serverseitige JS

Geschätzte Lektüre: 9 Minuten 452 Ansichten

JavaScript hat sich von einer einfachen Skriptsprache für Webseiten zu einer vielseitigen Programmiersprache entwickelt, die sowohl im Browser als auch auf Servern eingesetzt wird. Diese Dualität zwischen clientseitiger und serverseitiger Ausführung bildet das Fundament moderner Webentwicklung.

Die Grundlagen: Was bedeutet clientseitig vs. serverseitig?

Der zentrale Unterschied liegt im Ausführungsort des JavaScript-Codes. Clientseitiges JavaScript wird vom Webbrowser des Nutzers ausgeführt, während serverseitiges JavaScript auf einem Server läuft, typischerweise in einer Node.js-Umgebung.

Clientseitiges JavaScript (Frontend-JavaScript) ist direkt in HTML-Dateien eingebettet oder wird als externe Datei geladen und vom Browser interpretiert. Es interagiert mit dem Document Object Model (DOM) – der strukturierten Repräsentation der Webseite – und ermöglicht dynamische Inhalte ohne Neuladen der Seite. Ein einfaches Beispiel:

<button onclick="alert('Hallo vom Client!')">Klick mich</button>

Serverseitiges JavaScript (Backend-JavaScript) hingegen läuft unabhängig vom Browser und generiert oft HTML, das dann an den Client gesendet wird. Ein Node.js-Beispiel:

const http = require('http');
http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('Hallo vom Server!');
}).listen(8080);

Tiefere Einblicke: Architektur und Verantwortlichkeiten

Clientseitiges JavaScript im Detail
Im Browser übernimmt JavaScript drei Hauptaufgaben:

DOM-Manipulation: Dynamische Änderungen der Webseitenstruktur

document.getElementById('demo').innerHTML = 'Neuer Inhalt';

Event-Handling: Reaktion auf Benutzerinteraktionen

document.querySelector('button').addEventListener('click', function() {
  console.log('Button wurde geklickt');
});

Kommunikation mit Servern (AJAX/Fetch):

fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data));

Moderne Frameworks wie React, Angular oder Vue.js bauen auf diesen Grundfunktionen auf und bieten strukturierte Ansätze für komplexe Frontend-Entwicklung.

Serverseitiges JavaScript vertieft
Node.js revolutionierte JavaScript, indem es die Sprache aus dem Browser befreite. Serverseitig übernimmt JavaScript typische Backend-Aufgaben:

Server-Logik: HTTP-Server, Routing

const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Homepage'));

Datenbankinteraktion

const MongoClient = require('mongodb').MongoClient;
MongoClient.connect(uri, (err, client) => {
  const collection = client.db("test").collection("items");
  collection.find().toArray((err, items) => { ... });
});

Authentifizierung und Autorisierung:

app.post('/login', (req, res) => {
  // Prüfe Benutzerdaten
  // Erstelle JWT-Token
});

Kommunikation zwischen Client und Server

Die Interaktion zwischen beiden Welten erfolgt typischerweise über:

HTTP-Anfragen (RESTful APIs oder GraphQL):

// Client
fetch('/api/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'Max' })
});

// Server (Express.js)
app.post('/api/users', (req, res) => {
  const newUser = req.body;
  // Speichere in Datenbank
  res.status(201).json(newUser);
});

WebSockets für Echtzeitkommunikation:

// Client
const socket = new WebSocket('ws://example.com');
socket.onmessage = (event) => {
  console.log('Nachricht vom Server:', event.data);
};

// Server (mit ws-Bibliothek)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
  ws.send('Willkommen!');
});

Sicherheitsaspekte und Unterschiede

Die unterschiedlichen Ausführungsumgebungen bringen spezifische Sicherheitsimplikationen mit sich:

Clientseitige Sicherheit:
Cross-Site Scripting (XSS): Schadcode wird im Browser anderer Nutzer ausgeführt

// Gefährlich, wenn ungefilterter Nutzerinput ausgegeben wird
element.innerHTML = userProvidedContent; // Unsicher!

Lösung: Input-Sanitization, Content Security Policy (CSP)

Serverseitige Sicherheit:
Injection-Angriffe: Unsichere Datenbankabfragen

// Unsicher
db.query(`SELECT * FROM users WHERE id = ${userInput}`);
// Sicher (mit Prepared Statements)
db.query('SELECT * FROM users WHERE id = ?', [userInput]);

Cross-Site Request Forgery (CSRF): Unbefugte Aktionen im Namen des Benutzers
Lösung: CSRF-Tokens, SameSite-Cookie-Attribute

Performance-Überlegungen

Clientseitige Performance:
• Bundle-Größe minimieren (Code-Splitting, Tree-Shaking)
• Lazy Loading von Ressourcen
• Web Worker für CPU-intensive Aufgaben

Serverseitige Performance:
• Caching (Redis, Memcached)
• Clustering (Mehrkernnutzung)
• Asynchrone Verarbeitung (Event-Loop optimal nutzen)

Praxisbeispiel: E-Commerce-Anwendung

Clientseitig:
• Produktfilterung ohne Seitenneuladung
• Warenkorbverwaltung im LocalStorage
• Animierte Übergänge zwischen Seiten

// Dynamische Produktfilterung
const filterProducts = (criteria) => {
  fetch(`/api/products?filter=${encodeURIComponent(criteria)}`)
    .then(response => response.json())
    .then(products => {
      renderProductList(products);
      history.pushState({}, '', `?filter=${criteria}`);
    });
};

Serverseitig:
• Produktdaten aus Datenbank abfragen
• Zahlungsabwicklung mit externen APIs
• Generierung personalisierter Empfehlungen

// Produkt-API-Endpoint
app.get('/api/products', async (req, res) => {
  try {
    const filter = req.query.filter || '';
    const products = await Product.find({
      $or: [
        { name: new RegExp(filter, 'i') },
        { description: new RegExp(filter, 'i') }
      ]
    }).limit(50);
    res.json(products);
  } catch (error) {
    res.status(500).json({ error: 'Serverfehler' });
  }
});

Moderne Entwicklungen: Isomorphes/Universal JavaScript

Eine interessante Entwicklung ist das Konzept des isomorphen JavaScript, wo derselbe Code sowohl client- als auch serverseitig ausgeführt werden kann. Frameworks wie Next.js (React) oder Nuxt.js (Vue) ermöglichen dies:
Serverseitiges Rendering (SSR): Erstes Rendering auf dem Server für bessere SEO und Ladezeiten
Clientseitige Hydration: Übernahme der Interaktivität im Browser

// Next.js Beispiel - Komponente die auf Server und Client läuft
function HomePage({ serverRenderedData }) {
  const [clientData, setClientData] = useState(null);
  
  useEffect(() => {
    // Clientseitige Datenabfrage
    fetch('/api/client-data')
      .then(res => res.json())
      .then(data => setClientData(data));
  }, []);

  return (
    <div>
      <p>Serverseitig: {serverRenderedData}</p>
      <p>Clientseitig: {clientData || 'Lade...'}</p>
    </div>
  );
}

export async function getServerSideProps() {
  // Wird auf dem Server ausgeführt
  const res = await fetch('https://api.example.com/server-data');
  const data = await res.json();
  return { props: { serverRenderedData: data } };
}

Entwicklungswerkzeuge und Ökosystem

Clientseitig:
• Browser-Entwicklertools (Debugging, Performance-Analyse)
• Webpack, Rollup (Bundling)
• Jest, Cypress (Testing)

Serverseitig:
• Node.js Debugger, VS Code Integration
• PM2, Forever (Prozessmanagement)
• Mocha, Chai, Supertest (Testing)

Zukunftsperspektiven

Die Grenzen zwischen client- und serverseitigem JavaScript verschwimmen zunehmend:
• Edge Computing: Ausführung von JavaScript an CDN-Kanten (Cloudflare Workers, Deno Deploy)
Progressive Web Apps: Kombination aus Web- und App-Eigenschaften
WebAssembly: Performance-kritische Teile können in anderen Sprachen geschrieben werden

Rückgrat moderner Webanwendungen

Die Dualität von clientseitigem und serverseitigem JavaScript bildet das Rückgrat moderner Webanwendungen. Während clientseitiges JavaScript für interaktive, ansprechende Benutzeroberflächen sorgt, übernimmt serverseitiges JavaScript die Datenverarbeitung, Geschäftslogik und Sicherheit. Das Verständnis beider Konzepte und ihrer Interaktion ist essentiell für die Entwicklung ganzheitlicher Webanwendungen. Durch Technologien wie isomorphes JavaScript und Edge Computing entwickeln sich diese Bereiche ständig weiter und bieten spannende Möglichkeiten für zukünftige Webentwickler.

Dieses Dokument teilen

Clientseitige und serverseitige JS

Oder Link kopieren

INHALT

Abonnieren

×
Cancel