This commit is contained in:
Philippe Torrel
2026-08-05 09:49:28 +02:00
parent 07dfcec4ef
commit c548ea97a1
32 changed files with 4588 additions and 1956 deletions

View File

@@ -563,10 +563,7 @@ Projektarbeit
- Einführung in REACT - Einführung in REACT
- VDOM von REACT - VDOM von REACT
- Build Tools im Vergleich & Einführung in Vite - Build Tools im Vergleich & Einführung in Vite
- Komponenten in React - ES6 Module mit ohne ohne Bundler
- Wiederverwendbare Komponenten in React
- Gestaltungsmöglichkeiten in Frameworks
- EventHandler in React
**Übungen:** **Übungen:**

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
@@ -9,7 +9,7 @@
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
<!DOCTYPE html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />

View File

@@ -0,0 +1,530 @@
{
"name": "u01_hello-react",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "u01_hello-react",
"version": "1.0.0",
"dependencies": {
"react": "^19.2.8",
"react-dom": "^19.2.8"
},
"devDependencies": {
"esbuild": "^0.28.1"
}
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
"integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
"integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
"integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
"integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
"integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
"integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
"integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
"integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
"integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
"integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
"integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
"integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
"integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
"cpu": [
"mips64el"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
"integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
"integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
"integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
"integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
"integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
"integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
"integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
"integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openharmony-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
"integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
"integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
"integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
"integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
"integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/esbuild": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
"integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.28.1",
"@esbuild/android-arm": "0.28.1",
"@esbuild/android-arm64": "0.28.1",
"@esbuild/android-x64": "0.28.1",
"@esbuild/darwin-arm64": "0.28.1",
"@esbuild/darwin-x64": "0.28.1",
"@esbuild/freebsd-arm64": "0.28.1",
"@esbuild/freebsd-x64": "0.28.1",
"@esbuild/linux-arm": "0.28.1",
"@esbuild/linux-arm64": "0.28.1",
"@esbuild/linux-ia32": "0.28.1",
"@esbuild/linux-loong64": "0.28.1",
"@esbuild/linux-mips64el": "0.28.1",
"@esbuild/linux-ppc64": "0.28.1",
"@esbuild/linux-riscv64": "0.28.1",
"@esbuild/linux-s390x": "0.28.1",
"@esbuild/linux-x64": "0.28.1",
"@esbuild/netbsd-arm64": "0.28.1",
"@esbuild/netbsd-x64": "0.28.1",
"@esbuild/openbsd-arm64": "0.28.1",
"@esbuild/openbsd-x64": "0.28.1",
"@esbuild/openharmony-arm64": "0.28.1",
"@esbuild/sunos-x64": "0.28.1",
"@esbuild/win32-arm64": "0.28.1",
"@esbuild/win32-ia32": "0.28.1",
"@esbuild/win32-x64": "0.28.1"
}
},
"node_modules/react": {
"version": "19.2.8",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
"integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "19.2.8",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
"integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
"license": "MIT",
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
"react": "^19.2.8"
}
},
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
}
}
}

View File

@@ -0,0 +1,18 @@
{
"name": "u01_hello-react",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "npx esbuild src/index.jsx --bundle --watch --outfile=dist/bundle.js --loader:.js=jsx"
},
"keywords": [],
"type": "module",
"dependencies": {
"react": "^19.2.8",
"react-dom": "^19.2.8"
},
"devDependencies": {
"esbuild": "^0.28.1"
}
}

View File

@@ -0,0 +1,12 @@
import React from 'react';
function App() {
console.log('init App'); // JS logic
return (
<div className="container pt-5">
<h1>Hello React!</h1>
</div>
); // JSX - View
}
export default App;

View File

@@ -0,0 +1,12 @@
import React, { StrictMode } from 'react';
import ReactDOM from 'react-dom/client';
// import von Komponente
import App from './App';
ReactDOM.createRoot(document.getElementById('root')) //
.render(
<StrictMode>
<App />
</StrictMode>,
);

View File

@@ -0,0 +1,14 @@
// Factory Function
const MathFn = () => {
// closures
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
const multiply = (a, b) => a * b;
const divide = (a, b) => {
return b === 0 ? NaN : a / b;
};
export { add, subtract, multiply, divide };
};
export default MathFn;

View File

@@ -0,0 +1,27 @@
import { add, subtract, divide, multiply } from './math';
import math from './math';
import MathFn from './MathFn';
const app = MathFn();
console.log(app.add(1, 2)); // => 3;
console.log(app.subtract(3, 2)); //=> 1
console.log(app.multiply(2, 3)); // => 6
console.log(app.divide(6, 3)); // => 2
console.log(add(1, 2)); // => 3;
console.log(subtract(3, 2)); //=> 1
console.log(multiply(2, 3)); // => 6
console.log(divide(6, 3)); // => 2
// -----------------------
console.log(math.add(1, 2)); // => 3;
console.log(math.subtract(3, 2)); //=> 1
console.log(math.multiply(2, 3)); // => 6
console.log(math.divide(6, 3)); // => 2

View File

@@ -0,0 +1,37 @@
// explizite Freigabe von Einheiten
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// Übung 2: Mathfunktionen als Modul
// Programmiere zwei weitere Module, die jeweils eine Funktion multiply und divide enthalten. Importiere die Funktionen in der main.js-Datei und führe sie aus.
export const multiply = (a, b) => a * b;
export const divide = (a, b) => {
return b === 0 ? NaN : a / b;
};
// Übung 3: Exportieren Funktionen als Objekt
// Anstatt die Funktionen add, subtract, multiply und divide benannt zu exportieren, exportiere sie als Standard-Export in einem Objekt. Importiere das Objekt in der main.js-Datei und führe die Funktionen aus.
export default {
add,
subtract,
multiply,
divide,
// add: add,
// subtract: subtract,
// multiply:multiply,
// divide: divide,
};
// Übung 2: Mathfunktionen als Modul
// Programmiere zwei weitere Module, die jeweils eine Funktion multiply und divide enthalten. Importiere die Funktionen in der main.js-Datei und führe sie aus.
// Übung 3: Exportieren Funktionen als Objekt
// Anstatt die Funktionen add, subtract, multiply und divide benannt zu exportieren, exportiere sie als Standard-Export in einem Objekt. Importiere das Objekt in der main.js-Datei und führe die Funktionen aus.

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@
"license": "ISC", "license": "ISC",
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"esbuild": "^0.27.0", "esbuild": "^0.28.1",
"http-server": "^14.1.1" "http-server": "^14.1.1"
} }
} }

View File

@@ -1,4 +0,0 @@
import { add, subtract } from './math';
console.log(add(1, 2)); // => 3;
console.log(subtract(3, 2)); //=> 1

View File

@@ -1,13 +0,0 @@
// explizite Freigabe von Einheiten
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// Übung 2: Mathfunktionen als Modul
// Programmiere zwei weitere Module, die jeweils eine Funktion multiply und divide enthalten. Importiere die Funktionen in der main.js-Datei und führe sie aus.
// Übung 3: Exportieren Funktionen als Objekt
// Anstatt die Funktionen add, subtract, multiply und divide benannt zu exportieren, exportiere sie als Standard-Export in einem Objekt. Importiere das Objekt in der main.js-Datei und führe die Funktionen aus.

View File

@@ -2,6 +2,7 @@ import math from './math.js'; // ohne bundler kompletter pfad
// import '../../node_modules/jquery/dist/jquery.js'; // import '../../node_modules/jquery/dist/jquery.js';
import '../../node_modules/lodash/lodash.js'; import '../../node_modules/lodash/lodash.js';
// identisch zu <script src="../../node_modules/lodash/lodash.js"></script>
// https://esm.sh/ // https://esm.sh/
import $ from 'https://esm.sh/jquery@4.0.0'; import $ from 'https://esm.sh/jquery@4.0.0';

View File

@@ -0,0 +1,88 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Webseite mit SASS</title>
<link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="image/svg+xml" href="/favicon/favicon.svg" />
<link rel="shortcut icon" href="/favicon/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
<meta name="apple-mobile-web-app-title" content="Donkey-Coder" />
<link rel="manifest" href="/favicon/site.webmanifest" />
<!-- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" /> -->
<link rel="stylesheet" href="/assets/css/main.css" />
<script src="/assets/js/build.js" defer></script>
</head>
<body>
<!-- nav.menu-main>ul.list>li*4>a[href="#"]{Link $} -->
<nav class="menu-main">
<ul class="list">
<li><a href="/">Home</a></li>
<li>
<a href="#projects">Projects</a>
<ul class="sublist">
<li><a href="/projects/product-manager.html">Product Manager</a></li>
</ul>
</li>
<li><a href="/about.html">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<main>
<div class="container py-5">
<h1>About us</h1>
<p>
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ut, alias architecto tenetur, temporibus at ex
reprehenderit libero veniam esse quis qui recusandae dolorum consectetur molestias dignissimos dolorem rem
maxime repudiandae eveniet dolores. Aut error esse eligendi magni alias ducimus eaque, iste laudantium quas
soluta quasi provident expedita architecto modi dolorem quam voluptatum harum? Nemo, neque velit modi
accusamus rem, iste reprehenderit minus delectus numquam animi in, adipisci repudiandae tenetur quo possimus
sed. Sequi hic voluptatum odio ullam velit? Libero dicta nam perferendis quos, totam deserunt dolores, at
assumenda eligendi repudiandae vel alias nemo molestiae omnis tempore numquam excepturi, reprehenderit eveniet
deleniti eaque! Aperiam, repellat nostrum! Odio, dicta perspiciatis sapiente ducimus similique voluptatum
adipisci eligendi vitae corrupti dolorum officiis, veritatis rerum omnis labore sunt suscipit architecto.
Officia excepturi exercitationem quasi error natus repellendus voluptas facilis incidunt eligendi fuga! Natus
totam minus, blanditiis quo sint sit cum nesciunt culpa suscipit laborum vitae? At possimus dolorum rem
recusandae similique vitae soluta modi ad ex vero fugit hic ipsa ipsam doloribus laboriosam deserunt voluptate
aut quos minima in porro facilis delectus, quaerat nulla. Obcaecati architecto maiores natus delectus enim
odio magni perferendis necessitatibus, ullam vitae nisi neque aliquam, tempore numquam, consequuntur
blanditiis dolores. Debitis exercitationem dignissimos aspernatur minima ipsam quis voluptas quasi ipsa
dolorum, ad facilis corrupti doloribus aut magni distinctio voluptate fugit eos beatae cum culpa omnis
recusandae quod eligendi assumenda! Eos perferendis nam a deserunt dolore tempore corporis, numquam ut ducimus
possimus veritatis aperiam maxime quidem. Beatae ad vitae inventore, minus molestiae quam porro a consequuntur
corrupti. Ducimus deserunt perferendis sit eum maxime labore sed aliquam optio repellat eius vitae, magnam,
necessitatibus vel fuga provident quibusdam velit culpa dolorem doloribus sint excepturi. Repellat ducimus
dolorum perferendis? Id similique iusto natus aliquid nesciunt, perferendis exercitationem corrupti maxime, ut
laudantium at adipisci optio esse.
</p>
</div>
</main>
<!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} -->
<footer class="footer-main">
<div class="container">
<div class="row">
<div class="col">
<h3>Address</h3>
<p>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem
totam maxime itaque earum
</p>
</div>
<div class="col">
<h3>Social Media</h3>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nisi, earum.</p>
</div>
<div class="col">
<h3>Privacy Policy</h3>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Eveniet, porro!</p>
</div>
</div>
</div>
</footer>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,22 @@
<!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} -->
<footer class="footer-main">
<div class="container">
<div class="row">
<div class="col">
<h3>Address</h3>
<p>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem
totam maxime itaque earum
</p>
</div>
<div class="col">
<h3>Social Media</h3>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nisi, earum.</p>
</div>
<div class="col">
<h3>Privacy Policy</h3>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Eveniet, porro!</p>
</div>
</div>
</div>
</footer>

View File

@@ -8,7 +8,7 @@
<li><a href="/projects/product-manager.html">Product Manager</a></li> <li><a href="/projects/product-manager.html">Product Manager</a></li>
</ul> </ul>
</li> </li>
<li><a href="#">About</a></li> <li><a href="/about.html">About</a></li>
<li><a href="#">Contact</a></li> <li><a href="#">Contact</a></li>
</ul> </ul>
</nav> </nav>

View File

@@ -0,0 +1,38 @@
<!doctype html>
<html lang="de">
@@include('head.html')
<body>
@@include('menu-main.html')
<main>
<div class="container py-5">
<h1>About us</h1>
<p>
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ut, alias architecto tenetur, temporibus at ex
reprehenderit libero veniam esse quis qui recusandae dolorum consectetur molestias dignissimos dolorem rem
maxime repudiandae eveniet dolores. Aut error esse eligendi magni alias ducimus eaque, iste laudantium quas
soluta quasi provident expedita architecto modi dolorem quam voluptatum harum? Nemo, neque velit modi
accusamus rem, iste reprehenderit minus delectus numquam animi in, adipisci repudiandae tenetur quo possimus
sed. Sequi hic voluptatum odio ullam velit? Libero dicta nam perferendis quos, totam deserunt dolores, at
assumenda eligendi repudiandae vel alias nemo molestiae omnis tempore numquam excepturi, reprehenderit eveniet
deleniti eaque! Aperiam, repellat nostrum! Odio, dicta perspiciatis sapiente ducimus similique voluptatum
adipisci eligendi vitae corrupti dolorum officiis, veritatis rerum omnis labore sunt suscipit architecto.
Officia excepturi exercitationem quasi error natus repellendus voluptas facilis incidunt eligendi fuga! Natus
totam minus, blanditiis quo sint sit cum nesciunt culpa suscipit laborum vitae? At possimus dolorum rem
recusandae similique vitae soluta modi ad ex vero fugit hic ipsa ipsam doloribus laboriosam deserunt voluptate
aut quos minima in porro facilis delectus, quaerat nulla. Obcaecati architecto maiores natus delectus enim
odio magni perferendis necessitatibus, ullam vitae nisi neque aliquam, tempore numquam, consequuntur
blanditiis dolores. Debitis exercitationem dignissimos aspernatur minima ipsam quis voluptas quasi ipsa
dolorum, ad facilis corrupti doloribus aut magni distinctio voluptate fugit eos beatae cum culpa omnis
recusandae quod eligendi assumenda! Eos perferendis nam a deserunt dolore tempore corporis, numquam ut ducimus
possimus veritatis aperiam maxime quidem. Beatae ad vitae inventore, minus molestiae quam porro a consequuntur
corrupti. Ducimus deserunt perferendis sit eum maxime labore sed aliquam optio repellat eius vitae, magnam,
necessitatibus vel fuga provident quibusdam velit culpa dolorem doloribus sint excepturi. Repellat ducimus
dolorum perferendis? Id similique iusto natus aliquid nesciunt, perferendis exercitationem corrupti maxime, ut
laudantium at adipisci optio esse.
</p>
</div>
</main>
@@include('footer-main.html')
</body>
</html>

View File

@@ -38,27 +38,6 @@
</div> </div>
</main> </main>
<!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} --> @@include('footer-main.html')
<footer class="footer-main">
<div class="container">
<div class="row">
<div class="col">
<h3>Address</h3>
<p>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem
totam maxime itaque earum?
</p>
</div>
<div class="col">
<h3>Social Media</h3>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nisi, earum.</p>
</div>
<div class="col">
<h3>Privacy Policy</h3>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Eveniet, porro!</p>
</div>
</div>
</div>
</footer>
</body> </body>
</html> </html>

View File

@@ -213,27 +213,6 @@
<!-- ▲ /product-manager ▲ --> <!-- ▲ /product-manager ▲ -->
</main> </main>
<!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} --> @@include('footer-main.html')
<footer class="footer-main">
<div class="container">
<div class="row">
<div class="col">
<h3>Address</h3>
<p>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem
totam maxime itaque earum?
</p>
</div>
<div class="col">
<h3>Social Media</h3>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nisi, earum.</p>
</div>
<div class="col">
<h3>Privacy Policy</h3>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Eveniet, porro!</p>
</div>
</div>
</div>
</footer>
</body> </body>
</html> </html>

View File

@@ -66,6 +66,9 @@ task('css', (done) => {
// JS bzw. TS ================================== // JS bzw. TS ==================================
import { spawn } from 'node:child_process';
import { fileURLToPath } from 'node:url';
import path from 'node:path';
import rollupStream from '@rollup/stream'; import rollupStream from '@rollup/stream';
import { babel } from '@rollup/plugin-babel'; // Plugin für rollup. JS Dateien werden über Babel direkt beim bundlen in "altes" JS über babel kompiliert import { babel } from '@rollup/plugin-babel'; // Plugin für rollup. JS Dateien werden über Babel direkt beim bundlen in "altes" JS über babel kompiliert
import { nodeResolve } from '@rollup/plugin-node-resolve'; // import Kurzschreibweise (suche Module im node_modules Ordner) import { nodeResolve } from '@rollup/plugin-node-resolve'; // import Kurzschreibweise (suche Module im node_modules Ordner)
@@ -73,12 +76,27 @@ import commonJs from '@rollup/plugin-commonjs'; // commonjs module werden module
import source from 'vinyl-source-stream'; import source from 'vinyl-source-stream';
import buffer from 'vinyl-buffer'; import buffer from 'vinyl-buffer';
import rollupReplace from '@rollup/plugin-replace'; // Umbenennung von Variablen in den Modulen möglich import rollupReplace from '@rollup/plugin-replace'; // Umbenennung von Variablen in den Modulen möglich
import typescript from '@rollup/plugin-typescript'; // For TypeScript support needs "typescript" and "tslib" import esbuild from 'rollup-plugin-esbuild'; // TypeScript strippen ohne TS-Compiler-API (TS 7+ kompatibel)
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const tscBin = path.join(__dirname, 'node_modules', 'typescript', 'bin', 'tsc');
// declare the cache variable outside of task scopes // declare the cache variable outside of task scopes
let cache; let cache;
// $ gulp ts // $ gulp typecheck — Typen prüfen (tsc CLI, kein Emit)
task('typecheck', (done) => {
const child = spawn(process.execPath, [tscBin, '--noEmit'], {
stdio: 'inherit',
cwd: __dirname,
});
child.on('error', done);
child.on('close', (code) => {
done(code === 0 ? undefined : new Error(`typecheck failed with exit code ${code}`));
});
});
// $ gulp ts — Bundle (esbuild strippt Types, Babel downlevelt für Browser)
task('ts', () => { task('ts', () => {
// Updated path to look in dev/scripts for a main.ts file // Updated path to look in dev/scripts for a main.ts file
const sourceFile = './dev/scripts/main.ts'; const sourceFile = './dev/scripts/main.ts';
@@ -93,7 +111,14 @@ task('ts', () => {
// define the cache in Rollup options // define the cache in Rollup options
cache, cache,
plugins: [ plugins: [
typescript(), // Added TypeScript plugin esbuild({
include: /\.[jt]sx?$/,
exclude: /node_modules/,
sourceMap: true,
// Babel übernimmt Browser-Downleveling; esbuild nur TS→JS
target: 'esnext',
tsconfig: './tsconfig.json',
}),
rollupReplace({ rollupReplace({
'process.env.NODE_ENV': JSON.stringify('development'), 'process.env.NODE_ENV': JSON.stringify('development'),
preventAssignment: true, preventAssignment: true,
@@ -107,7 +132,7 @@ task('ts', () => {
plugins: ['@babel/plugin-transform-runtime'], // kontrolliert, ob ein Modul bereits eingebunden und bindet es nicht erneut ein plugins: ['@babel/plugin-transform-runtime'], // kontrolliert, ob ein Modul bereits eingebunden und bindet es nicht erneut ein
babelHelpers: 'runtime', babelHelpers: 'runtime',
compact: true, compact: true,
extensions: ['.js', '.ts'], // Tell babel to process TS files extensions: ['.js', '.ts'],
}), }),
], ],
}) })
@@ -168,6 +193,7 @@ task('watcher', () => {
// ==== DEV MODE ==================== // ==== DEV MODE ====================
task('dev', series('css', 'ts', 'html', parallel('watcher', 'server'))); task('dev', series('css', 'ts', 'html', parallel('watcher', 'server')));
task('check', series('typecheck', 'ts'));
// =================================== // ===================================
task('test', (done) => { task('test', (done) => {

View File

@@ -15,6 +15,7 @@
<script src="/assets/js/build.js" defer></script> <script src="/assets/js/build.js" defer></script>
</head> </head>
<body> <body>
<!-- header.header-main>.content-box>figure>img[alt="Logo"]+figc{The Donkey Coders} --> <!-- header.header-main>.content-box>figure>img[alt="Logo"]+figc{The Donkey Coders} -->
<header class="header-main"> <header class="header-main">
@@ -61,7 +62,7 @@
<li><a href="/projects/product-manager.html">Product Manager</a></li> <li><a href="/projects/product-manager.html">Product Manager</a></li>
</ul> </ul>
</li> </li>
<li><a href="#">About</a></li> <li><a href="/about.html">About</a></li>
<li><a href="#">Contact</a></li> <li><a href="#">Contact</a></li>
</ul> </ul>
</nav> </nav>
@@ -90,14 +91,14 @@
</main> </main>
<!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} --> <!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} -->
<footer class="footer-main"> <footer class="footer-main">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h3>Address</h3> <h3>Address</h3>
<p> <p>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem
totam maxime itaque earum? totam maxime itaque earum
</p> </p>
</div> </div>
<div class="col"> <div class="col">
@@ -110,6 +111,7 @@
</div> </div>
</div> </div>
</div> </div>
</footer> </footer>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@@ -4,42 +4,45 @@
"description": "", "description": "",
"main": "gulpfile.js", "main": "gulpfile.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "start": "gulp dev",
"test": "echo \"Error: no test specified\" && exit 1",
"typecheck": "tsc --noEmit",
"build:ts": "gulp ts"
}, },
"keywords": [], "keywords": [],
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.28.5", "@babel/core": "^7.29.7",
"@babel/plugin-transform-runtime": "^7.28.5", "@babel/plugin-transform-runtime": "^7.29.7",
"@babel/preset-env": "^7.28.5", "@babel/preset-env": "^7.29.7",
"@babel/runtime": "^7.28.4", "@babel/runtime": "^7.29.7",
"@rollup/plugin-babel": "^6.1.0", "@rollup/plugin-babel": "^7.1.0",
"@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-commonjs": "^29.0.3",
"@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-replace": "^6.0.3", "@rollup/plugin-replace": "^6.0.3",
"@rollup/plugin-typescript": "^12.3.0",
"@rollup/stream": "^3.0.1", "@rollup/stream": "^3.0.1",
"@types/bootstrap": "^5.2.11", "@types/bootstrap": "^5.2.11",
"@types/toastify-js": "^1.12.4", "@types/toastify-js": "^1.12.4",
"browser-sync": "^3.0.4", "browser-sync": "^3.0.4",
"core-js": "^3.46.0", "core-js": "^3.49.0",
"del": "^8.0.1", "del": "^8.0.1",
"esbuild": "^0.28.1",
"gulp": "^5.0.1", "gulp": "^5.0.1",
"gulp-autoprefixer": "^10.0.0", "gulp-autoprefixer": "^10.0.0",
"gulp-clean-css": "^4.3.0", "gulp-clean-css": "^4.3.0",
"gulp-file-include": "^2.3.0", "gulp-file-include": "^2.3.0",
"gulp-html-minifier-terser": "^7.1.0", "gulp-html-minifier-terser": "^8.0.0",
"gulp-plumber": "^1.2.1", "gulp-plumber": "^1.2.1",
"gulp-rename": "^2.1.0", "gulp-rename": "^2.1.0",
"gulp-replace": "^1.1.4", "gulp-replace": "^1.1.4",
"gulp-sass": "^6.0.1", "gulp-sass": "^6.0.1",
"gulp-sizereport": "^1.2.1", "gulp-sizereport": "^1.2.1",
"gulp-sourcemaps": "^2.6.5", "gulp-sourcemaps": "^3.0.0",
"gulp-terser": "^2.1.0", "gulp-terser": "^2.1.0",
"rollup": "^4.53.1", "rollup": "^4.62.4",
"sass": "^1.93.3", "rollup-plugin-esbuild": "^6.2.1",
"tslib": "^2.8.1", "sass": "^1.102.0",
"typescript": "^5.9.3", "typescript": "^7.0.2",
"vinyl-buffer": "^1.0.1", "vinyl-buffer": "^1.0.1",
"vinyl-paths": "^5.0.0", "vinyl-paths": "^5.0.0",
"vinyl-source-stream": "^2.0.0" "vinyl-source-stream": "^2.0.0"
@@ -47,8 +50,11 @@
"dependencies": { "dependencies": {
"@splidejs/splide": "^4.1.4", "@splidejs/splide": "^4.1.4",
"bootstrap": "^5.3.8", "bootstrap": "^5.3.8",
"lodash": "^4.17.21", "lodash": "^4.18.1",
"toastify-js": "^1.12.0", "toastify-js": "^1.12.0",
"validator": "^13.15.22" "validator": "^13.15.35"
},
"allowScripts": {
"esbuild@0.28.1": true
} }
} }

View File

@@ -35,7 +35,7 @@
<li><a href="/projects/product-manager.html">Product Manager</a></li> <li><a href="/projects/product-manager.html">Product Manager</a></li>
</ul> </ul>
</li> </li>
<li><a href="#">About</a></li> <li><a href="/about.html">About</a></li>
<li><a href="#">Contact</a></li> <li><a href="#">Contact</a></li>
</ul> </ul>
</nav> </nav>
@@ -242,14 +242,14 @@
</main> </main>
<!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} --> <!-- footer.footer-main>.row>.col*3>h3{Headline}+p{lorem10} -->
<footer class="footer-main"> <footer class="footer-main">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h3>Address</h3> <h3>Address</h3>
<p> <p>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem
totam maxime itaque earum? totam maxime itaque earum
</p> </p>
</div> </div>
<div class="col"> <div class="col">
@@ -262,6 +262,7 @@
</div> </div>
</div> </div>
</div> </div>
</footer> </footer>
</body> </body>
</html> </html>

View File

@@ -1,18 +1,14 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "es6", "target": "es2015",
"module": "esnext", "module": "esnext",
"moduleResolution": "node", "moduleResolution": "bundler",
"ignoreDeprecations": "6.0",
"strict": true, "strict": true,
"esModuleInterop": true, "esModuleInterop": true,
"skipLibCheck": true, "skipLibCheck": true,
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"sourceMap": true, "sourceMap": true,
"baseUrl": "./", "noEmit": true
"paths": {
"*": ["node_modules/*"]
}
}, },
"include": ["dev/scripts/**/*.ts"] "include": ["dev/scripts/**/*.ts"]
} }