
Anforderungen
- Node.js >=22 (Node 24 empfohlen)
- npm >=10
Technologie-Stack
- Vite 8 – Build-Tool mit HMR
- Vue.js 3.5 – Interaktive Komponenten (TodoList, GallerySwiper, SwiperSlider)
- Bootstrap 5.3 – UI-Framework
- Sass 1.99 – CSS-Vorverarbeitung (Modern-Compiler-API)
- PostCSS – preset-env, pxtorem
- ESLint 10 / Stylelint 17 – Codequalität
- Swiper 12 – Touch-Slider (integriert über Vue-Komponenten)
- Jarallax 3 – Parallax-Scrolling
Schnellstart
cd Build
npm ci
npm run watch # Auto-rebuild on file changes
In einem mpc-Monorepo mit laufendem DDEV kannst du auch vom Stammverzeichnis der Website aus bauen: ddev mp-core-build (entspricht npm run build innerhalb libs/mp-core/Build/).
Die Ausgabe erfolgt in Resources/Public/ (JavaScripts, StyleSheets, Fonts, Icons, Images, Favicons, BackendLayouts).
| Skript | Beschreibung |
|---|---|
build | Lint + Produktions-Build (minimiert, optimiert) |
dev | Lint + Entwicklungs-Build mit Source-Maps |
watch | Entwicklungs-Build mit Dateiüberwachung |
lint | ESLint + Stylelint ausführen |
eslint / eslint.fix | JavaScript-Linting |
stylelint / stylelint.fix | CSS/SCSS-Linting |
Build bereinigen: rm -rf node_modules Resources/Public && npm ci && npm run build
Projektstruktur
Build-Verzeichnis
Build/
├── Assets/
│ ├── Fonts/ # Web fonts (WOFF2)
│ ├── Images/ # Source images, Icons/
│ ├── Scripts/ # JavaScript/Vue
│ │ ├── code/ # Feature modules
│ │ │ ├── Utils/ # Shared utilities (domUtils.js, …)
│ │ │ ├── Vue/ # vue-initialisation.js (component registry)
│ │ │ └── Navigation/ # Primary / Secondary / Tertiary
│ │ └── components/ # Vue SFCs
│ ├── Scss/ # SCSS (ITCSS layers)
│ │ ├── Base/ # Variables, fonts
│ │ ├── Elements/ # Base elements
│ │ ├── Mixins/ # SCSS mixins
│ │ ├── Modules/ # UI components
│ │ ├── Templates/ # Layout helpers
│ │ └── Extensions/ # TYPO3 extension overrides
│ └── Static/ # Copied as-is (BackendLayouts, Favicons)
├── vite.config.js
├── eslint.config.js
├── stylelint.config.js
└── postcss.config.js
Ressourcenverzeichnis
Resources/
├── Private/ # Fluid templates (not web-accessible)
│ ├── Backend/, Language/, Layouts/, Partials/, Templates/
├── Extensions/ # Extension template overrides
│ ├── fluid_styled_content/, form/, indexed_search/, news/
└── Public/ # Compiled assets (web-accessible)
├── Fonts/, Icons/, Images/, JavaScripts/, StyleSheets/, Favicons/
Vite-Einstiegspunkte
Definiert in Build/vite.config.js:
| Bundle | Zweck |
|---|---|
bootstrap.js | Initialisierung des Bootstrap-Frameworks |
screen.js | Haupt-Frontend (sticky Header, Theme usw.) |
vue.js | Vue.js 3-Komponenten (einschließlich Swiper-Integration) |
navigationPrimary/Secondary/Tertiary.js | Navigationsebenen |
print.js | Druckspezifische Stile |
backend.js | TYPO3-Backend-Stile |
ckeditor.js | CKEditor-RTE-Stile |
Hinweis: Swiper ist in das
vue.jsBundle – es gibt keinen separatenswiper.jsEinstiegspunkt.
Neuen Eintrag hinzufügen
- Erstellen Sie eine JS-Datei in
Build/Assets/Scripts/ - Registrieren in
vite.config.js - Ausführen
npm run watch - In Fluid einbinden:
<f:asset.script identifier="myfeature" src="EXT:mp_core/Resources/Public/JavaScripts/myfeature.js" />
<f:asset.css identifier="myfeature" href="EXT:mp_core/Resources/Public/StyleSheets/myfeature.css" />
JavaScript-Architektur
Funktionsmodule (Build/Assets/Scripts/code/)
Kern: main.js, i18n.js, i18nLinkHelper.js
UI: jarallax.js, modalGallery.js, openAccordionAndTabs.js, pagination.js, sticky.js, totop.js
Navigation: nav-toggle.js, Navigation/Primary/navigation.js, Navigation/Secondary/navigation.js, Navigation/Tertiary/navigation.js
Layout: moveHeaderDate.js, moveMeta.js, theme.js
Gemeinsame Hilfsfunktionen (code/Utils/domUtils.js)
debounce(func, wait)-- Leistungsoptimierte Handhabung von Größenanpassung und BildlauftoggleNavState(...)-- Geöffneter/geschlossener Zustand der NavigationhandleDropdownVisibility(element, showCb, hideCb)-- Bootstrap-Dropdown-EreignissetoggleAriaLabelAndTitle(element, openLabel, closeLabel)-- Umschalten von barrierefreien Beschriftungen
Vue.js-Komponenten
Befindet sich in Build/Assets/Scripts/components/:
| Komponente | Beschreibung |
|---|---|
TodoList.vue | Interaktive To-Do-Liste mit localStorage, registriert als CType mpcore_todolist |
GallerySwiper.vue | Swiper-basiertes Galerie-Karussell für das Galerie-Inhaltselement |
SwiperSlider.vue | Generischer Swiper-Slider für Container-Slider-Elemente |
Die Komponentenregistrierung wird in code/Vue/vue-initialisation.js.
Vue-Mounts auf Elementen mit data-container="vue" und data-component="ComponentName" (siehe VueComponents.typoscript und Vorlagen für Inhaltselemente). Optionale data-* Attribute übergeben Props (z. B. data-card-title in TodoList).
Eine neue Komponente erstellen
- Erstellen Sie
.vueDatei inBuild/Assets/Scripts/components/ - Registrieren in
code/Vue/vue-initialisation.js - Build erstellen und über
<f:asset.script>in Fluid (dervue.jsEinstiegspunkt mountet registrierte Komponenten automatisch).
SCSS-Architektur (ITCSS)
Ebenen von niedriger bis hoher Spezifität:
- Einstellungen (
Base/) -- Variablen, Schriftarten, Farbtabellen - Tools (
Mixins/) -- Funktionen, Mixins (keine CSS-Ausgabe) - Allgemein -- Zurücksetzen, Normalisieren (aus Bootstrap)
- Elemente (
Elements/) -- Basis-HTML-Elemente - Objekte -- Layout-Muster
- Komponenten (
Modules/) – Gestaltete UI-Komponenten - Hilfsfunktionen -- Hilfsklassen
Bootstrap-Anpassung
- Helles Design:
Build/Assets/Scss/Base/Bootstrap/_custom-variables.scss - Dunkles Design:
Build/Assets/Scss/Base/Bootstrap/_custom-variables-dark.scss
Asset-Verwaltung
| Asset-Typ | Muster |
|---|---|
| Bilder in SCSS | url('../../Images/Icons/icon.png') (relativer Pfad) |
| Schriftarten | @include font-face('Name', '../../Fonts/file', 400, normal, woff2) |
| Inline-SVG | svg-load('../Images/Icons/arrow.svg') |
| Statische Dateien | Build/Assets/Static/ -> kopiert nach Resources/Public/ |
Vorlagenintegration
Fluid
<f:asset.css identifier="screen" href="EXT:mp_core/Resources/Public/StyleSheets/screen.css" />
<f:asset.script identifier="screen" src="EXT:mp_core/Resources/Public/JavaScripts/screen.js" />
TypoScript
page {
includeCSS.screen = EXT:mp_core/Resources/Public/StyleSheets/screen.css
includeJSFooter.screen = EXT:mp_core/Resources/Public/JavaScripts/screen.js
}
Priorität der Vorlagenpfade: Höhere Zahlen haben Vorrang vor niedrigeren (0 = Kern, 10 = Erweiterung, 20+ = Projekt).
Ersetzungen durch Erweiterungen
| Erweiterung | Pfad | Anmerkungen |
|---|---|---|
| fluid_styled_content | Resources/Extensions/fluid_styled_content/Private/ | Im Bootstrap-5-Stil |
| Formular | Resources/Extensions/form/ | Bootstrap-Formulare + YAML-Konfiguration |
| Nachrichten | Resources/Extensions/news/ | Listen-, Detail- und Kategorieansichten |
| Indexierte Suche | Resources/Extensions/indexed_search/ | Bootstrap-Suchergebnisse |
Best Practices
JavaScript: Modularer Code in code/, gemeinsame Muster in Utils/, Debounce bei Größenänderung/Scrollen, Event-Delegation, ARIA-Labels, Lint vor dem Commit.
SCSS: ITCSS-Ebenen beachten, CSS-Variablen für das Theming, logische Eigenschaften für RTL, maximal 3 Verschachtelungsebenen, Mobile-First min-width Abfragen.
Vue.js: Single-File-Komponenten, bereichsbezogene Stile, Prop-Validierung, Composition API für komplexe Logik.
Fehlerbehebung
| Problem | Lösung |
|---|---|
| 404-Fehler bei Schriftarten | Überprüfen ../ Segmente aus SCSS auf Fonts/ |
| Fehlende Bilder im CSS | Pfad in Assets/Images/ |
| Bundle zu groß | Nur benötigte Bootstrap-Komponenten importieren |
| Änderungen werden nicht angezeigt | Browser- und TYPO3-Cache leeren |
Wichtig: Niemals Resources/Public/ direkt. Bearbeite immer in Build/Assets/ und führen Sie npm run build.
Weiterführende Literatur
- Favicons -- Favicon-Assets und Fluid-Partial (nicht mit
output.html) - Konfiguration – Site Sets, TypoScript, TCA
- Vite | Vue.js | Bootstrap 5 | ITCSS