--- marp: true theme: gaia paginate: true backgroundColor: #fff header: "Web Engineering – DHBW Stuttgart" footer: "Michael Czechowski – SoSe 2026" title: JavaScript & Frameworks --- ![bg cover opacity:0.2](./assets/background.png) # Web Engineering **DHBW Stuttgart** · Informatik / Wirtschaftsinformatik **Sommersemester 2026** · Sitzung 3 — JS, Frameworks & Build Tools --- # Ressourcen zum Selbstlernen - **CODE CRISPIES** — [codecrispi.es](https://codecrispi.es/) - **Online Code-Editor** — [codepen.io](https://codepen.io/pen/) - **MDN** (Mozilla Developer Network) — [developer.mozilla.org/de/](https://developer.mozilla.org/de/) - **Flexbox-Spiel** — [flexboxfroggy.com](https://flexboxfroggy.com/) - **Grid-Spiel** — [cssgridgarden.com](https://cssgridgarden.com/) # JavaScript --- # ECMAScript - **Ecma International** — European Computer Manufacturers Association - Seit **1997** standardisiert als **ECMA-262** - Implementierungen: **JavaScript** (Netscape, später Mozilla), **JScript** (Microsoft), **ActionScript** (Adobe Flash) etc. - Aktuelle Version: **ECMAScript 2024 (ES15)**, jährliche Releases **Browser-Kompatibilität:** - Faustregel: **ES2017+** läuft in allen modernen Browsern - Ältere Targets via Transpiler (Babel, esbuild, swc, tsc) - Kompatibilitätstabelle: [kangax.github.io/compat-table](https://kangax.github.io/compat-table/) --- # JavaScript Grundlagen ```javascript // 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 ```javascript // Element auswählen const title = document.querySelector('h1'); // Inhalt ändern title.textContent = 'Neue Überschrift'; // Event Listener button.addEventListener('click', () => { alert('Geklickt!'); }); ``` --- # Fetch API ```javascript fetch('/api/products') .then(res => res.json()) .then(data => { console.log(data); }) .catch(err => console.error(err)); ``` --- # Async/Await ```javascript async function loadProducts() { try { const res = await fetch('/api/products'); const data = await res.json(); return data; } catch (err) { console.error('Fehler:', err); } } ``` --- ![bg fit](./assets/demos/web-engineering-mandala.png) --- # Web Engineering Mandala Interaktive version: [nextlevelshit.github.io/web-engineering-mandala](https://nextlevelshit.github.io/web-engineering-mandala/) 3 Schichten: - **Core Layer** — JS, HTML, CSS (vanilla) - **Build Layer** — bundlers, runtimes, template engines, pre/post processors - **Application Layer** — frontend, backend, frameworks, SSR, CSS-utilities 3 Segmente: HTML (blau) · JavaScript (rot) · CSS (grün) · Mittelpunkt: `package.json` --- # 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 ```html ``` **Pro:** hohe Kompatibilität, simpel **Contra:** State-Management und Re-Rendering werden schnell komplex --- # React – Counter (JSX) ![bg right:25% fit](./assets/logos/frameworks/react.svg) ```jsx import { useState } from "react"; function MyButton() { const [count, setCount] = useState(0); return ( ); } ``` - **Component-Based** Architecture - **Virtual DOM**, JSX, Hooks - großes Ökosystem (React Router, Redux, …) --- # Vue 3 – Composition API ![bg right:25% fit](./assets/logos/frameworks/vue.svg) ```vue ``` - **Reactive Data Binding** - Single-File Components (`.vue`) - Vue Router, Pinia (State) --- # Svelte – Counter ![bg right:25% fit](./assets/logos/frameworks/svelte.svg) ```svelte ``` - **Compiler-Based** – kein Runtime-Framework - Reactive Assignments (`let`) - Built-in Animationen --- # Astro – Content-First ![bg right:25% fit](./assets/logos/frameworks/astro.svg) ```astro --- const greeting = "Hallo DHBW"; ---

{greeting}

``` - **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 | ja | ja | `/app/page.js` | | **Nuxt** | Vue | ja | ja | `/pages/*.vue` | | **Gatsby** | React | nein | ja | GraphQL Data | --- # Build Tools – Webpack ![bg right:25% fit](./assets/logos/frameworks/webpack.svg) - 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 ![bg right:25% fit](./assets/logos/frameworks/vite.svg) ```javascript // 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 ![bg right:25% fit](./assets/logos/frameworks/parcel.png) ```json { "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)