11 KiB
11 KiB
marp, theme, paginate, backgroundColor, header, footer, title
| marp | theme | paginate | backgroundColor | header | footer | title |
|---|---|---|---|---|---|---|
| true | gaia | true | Web Engineering – DHBW Stuttgart | Michael Czechowski – SoSe 2026 | Web Engineering |
Web Engineering
DHBW Stuttgart · Informatik / Wirtschaftsinformatik
Sommersemester 2026
Willkommen!
1. Sitzung: 08.05.2026
Wer bist du, was machst du?
- B.Sc. Wirtschaftsinformatik (Leibniz-FH Hannover)
- Angestellt bei PONS Langenscheidt GmbH in Stuttgart
- Honorardozent und Berater
Bisherige Vorlesungen (DHBW/Leibniz-FH):
- Social Engineering, Mobile Medien, Web Eng
Vorlesungsplan
| Sitzung | Datum | Thema |
|---|---|---|
| 1 | 08.05. | Intro, Projektgruppen, Internet 101 |
| 2 | 15.05. | HTML und CSS (Frameworks) |
| 3 | 22.05. | JS (Frameworks) und npm |
| 4 | 29.05. | nodeJS: Scripting, Running and Building |
| 5 | 05.06. | Express API, CRUD und "Middlewares" |
| 6 | 12.06. | Projektwerkstattbericht |
| 7 | 19.06. | Testing (unit, integration, end-to-end) |
| 8 | 26.06. | TypeScript |
| 9 | 03.07. | Docker, Proxies and DBs |
| 10 | 10.07. | Wrap-up & Projektsupport |
| 11 | 17.07. | Präsentation |
Prüfungsleistung – Übersicht
Eigenes Projekt: Web-App ODER Backend (API/CLI).
Grundanforderungen (75 Punkte)
| Punkte | Bereich |
|---|---|
| 20 | Idee, Konzeption, Planung |
| 5 | Plattformunabhängigkeit |
| 25 | Clean Code (KISS, SOLID, DI, Testing, Error Handling) |
| 15 | Präsentation |
| 10 | Dokumentation |
Zusatzpunkte (max. 10): TypeScript, Docker, Dev/Prod-Parity, .env, npm-Publish, Domain, HTTPS, Responsive Design.
Prüfungsleistung – Idee & Konzeption (20 P.)
- "Powerpoint"-Präsentation + Folien
- Aussagekräftiger Arbeitstitel + Beschreibung
- Elevator Pitch (max. 1 Min.)
- Repo-Link (GitHub / GitLab / Codeberg / BitBucket)
- Logs: wie hat sich Projekt verändert vs. Ursprungsidee?
- Schematischer Projektaufbau (UML o. Ä.)
Prüfungsleistung – Clean Code (25 P.)
README.md(clone, start, contribute)- KISS – Keep It Simple, Stupid
- SOLID – SRP, OCP, LSP, ISP, DIP
- DI – Dependency Injection
- Testing-Pyramide (Unit, Integration, E2E)
- Exception/Error Handling
Prüfungsleistung – Abgabe & Termine
- Code-Upload: bis 27.07.
- Präsentation: 17.07. (Gruppen, ~10 Min.)
Details: https://git.dailysh.it/DHBW/pruefungsleistung
Internet 101 – Zeitleiste
| Jahr | Ereignis |
|---|---|
| 1966 | ARPANET |
| 1969 | RFCs |
| 1986 | IETF |
| 1992 | Internet Society |
| 1974 | TCP/IP und HTTP(S) |
| 1987 | Domain Names und DNS |
| 1993 | "Erster" Browser: Mosaic |
| 1994 | W3C (HTML, XML, CSS, SVG, WCAG etc.) |
| 1995 | ECMAScript (JS) |
| 2006/08 | V8 JS Runtime Engine |
| Heute | 1,3 Mio. km Unterseekabel |
Internet 101 – Browser Request
Browser Server
| |
|-- GET /products -------------->|
|<-- HTTP 200 + index.html -----|
| |
|-- GET /script.js ------------->|
|<-- HTTP 200 + script.js ------|
| |
|-- GET /api/products ---------->|
|<-- HTTP 200 + JSON ------------|
HTTP – Hypertext Transfer Protocol
Request:
GET /products HTTP/1.1
Host: localhost:8080
Response:
HTTP/1.1 200 OK
Content-Type: application/json
[{"id": 1, "name": "Produkt A"}, ...]
Entwicklungsumgebung
Tools:
- Node.js + npm
- VS Code
- Git
- Chrome DevTools
Versionierung mit Git
git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/user/repo.git
git push -u origin main
HTML – Hypertext Markup Language
HTML Grundlagen
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Meine Seite</title>
</head>
<body>
<h1>Überschrift</h1>
<p>Textabsatz</p>
</body>
</html>
Semantisches HTML
<header>Navigationsbereich</header>
<nav>Navigation</nav>
<main>
<article>
<section>
<h2>Überschrift</h2>
<p>Inhalt</p>
</section>
</article>
</main>
<footer>Fußzeile</footer>
HTML – Tabellen und Listen
<table>
<thead>
<tr><th>Name</th><th>Preis</th></tr>
</thead>
<tbody>
<tr><td>Produkt A</td><td>29,99 €</td></tr>
</tbody>
</table>
<ul>
<li>Punkt 1</li>
<li>Punkt 2</li>
</ul>
CSS – Cascading Style Sheets
CSS Grundlagen
/* Element */
body { font-family: Arial, sans-serif; }
/* Klasse */
.button { background: #005f8a; color: white; }
/* ID */
#header { height: 60px; }
/* Attribut */
input[type="text"] { border: 1px solid #ccc; }
CSS Layout – Flexbox
.container {
display: flex;
justify-content: space-between;
align-items: center;
}
CSS Layout – Grid
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
CSS – Box Model
.box {
margin: 10px;
border: 2px solid #005f8a;
padding: 20px;
width: 200px;
box-sizing: border-box;
}
CSS Responsive
@media (max-width: 768px) {
.grid {
grid-template-columns: 1fr;
}
}
JavaScript
JavaScript Grundlagen
// Variablen
let name = "Welt";
const alter = 25;
// Funktionen
function gruss(name) {
return `Hallo, ${name}!`;
}
// Arrow Functions
const add = (a, b) => a + b;
// Arrays
const arr = [1, 2, 3];
arr.map(x => x * 2); // [2, 4, 6]
DOM Manipulation
// Element auswählen
const title = document.querySelector('h1');
// Inhalt ändern
title.textContent = 'Neue Überschrift';
// Event Listener
button.addEventListener('click', () => {
alert('Geklickt!');
});
Fetch API
fetch('/api/products')
.then(res => res.json())
.then(data => {
console.log(data);
})
.catch(err => console.error(err));
Async/Await
async function loadProducts() {
try {
const res = await fetch('/api/products');
const data = await res.json();
return data;
} catch (err) {
console.error('Fehler:', err);
}
}
JavaScript Frameworks – Kategorien
| Kategorie | Beispiele |
|---|---|
| CSS Frameworks | Tailwind, Bootstrap, shadcn/ui |
| Frontend Frameworks | React, Vue, Svelte, Astro |
| Rendering / Meta | Next.js, Nuxt, Gatsby |
| Build Tools / Bundler | Webpack, Vite, Parcel, esbuild |
| Backend Frameworks | Express, Fastify, NestJS |
Vanilla JS – Counter
<button id="myButton">Clicked 0 times</button>
<script>
let count = 0;
const btn = document.getElementById('myButton');
btn.addEventListener('click', () => {
count++;
btn.textContent = `Clicked ${count} times`;
});
</script>
✓ hohe Kompatibilität, simpel ✗ State-Management, Re-Rendering wird schnell komplex
React – Counter (JSX)
import { useState } from "react";
function MyButton() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Clicked {count} times
</button>
);
}
- Component-Based Architecture
- Virtual DOM, JSX, Hooks
- großes Ökosystem (React Router, Redux, …)
Vue 3 – Composition API
<script setup>
import { ref } from "vue";
const count = ref(0);
</script>
<template>
<button @click="count++">
Clicked {{ count }} times
</button>
</template>
- Reactive Data Binding
- Single-File Components (
.vue) - Vue Router, Pinia (State)
Svelte – Counter
<script>
let count = 0;
</script>
<button on:click={() => count += 1}>
Clicked {count} {count === 1 ? 'time' : 'times'}
</button>
- Compiler-Based – kein Runtime-Framework
- Reactive Assignments (
let) - Built-in Animationen
Astro – Content-First
---
const greeting = "Hallo DHBW";
---
<html>
<body>
<h1>{greeting}</h1>
<MyReactButton client:load />
</body>
</html>
- Islands Architecture – Komponenten mehrerer Frameworks mischen
- Default: kein JS im Output (nur statisches HTML)
- Hydration on demand (
client:load,client:visible)
Rendering Frameworks
| Frontend | SSR | SSG | File Routing | |
|---|---|---|---|---|
| Next.js | React | ✓ | ✓ | /app/page.js |
| Nuxt | Vue | ✓ | ✓ | /pages/*.vue |
| Gatsby | React | – | ✓ | GraphQL Data |
Build Tools – Webpack
- Module Bundling (JS, CSS, Images)
- Module Loaders + großes Plugin-Ökosystem
- Code Splitting, HMR
- Konfigurations-lastig (
webpack.config.js)
→ Standard für viele Legacy-Setups.
Build Tools – Vite
// vite.config.js
import { defineConfig } from "vite";
export default defineConfig({
server: {
proxy: {
"/api": {
target: "http://localhost:4567",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, "")
}
}
}
});
- Rollup unter der Haube, HMR mit ES Modules
- Tree-Shaking, Code Splitting, React + Vue out-of-the-box
Build Tools – Parcel
{
"name": "my-project",
"source": "src/index.html",
"browserslist": "> 0.5%, last 2 versions, not dead",
"scripts": {
"start": "parcel",
"build": "parcel build"
},
"devDependencies": {
"parcel": "latest"
}
}
- Zero-Config
- Auto-Resolution, HMR
- TS / CSS-Preprocessors out-of-the-box
Microfrontends
- Mehrere unabhängige Frontend-Apps in einer Page
- Module Federation (Webpack 5)
- single-spa: https://single-spa.js.org/
- Anwendungsfall: große Teams, unterschiedliche Tech-Stacks pro Domain
→ Komplexitätskosten: nur bei echtem Skalierungsbedarf.
Demo-Repos
- https://github.com/nextlevelshit/dhbw-client-js (Counter, multi-framework)
- https://github.com/nextlevelshit/node-cache-api (API + Tests)
- https://github.com/nextlevelshit/dhbw-docker (Compose-Stack)
Fragen?
- Was ist der Unterschied zwischen
letundconst? - Wie funktioniert
fetch()? - Was macht
box-sizing: border-box?


