# Byg en bankapp del 1: HTML-skabeloner og ruter i en webapp ```mermaid journey title Din Bankapp Udviklingsrejse section SPA Grundlæggende Forstå single-page apps: 3: Student Lær skabelonbegreber: 4: Student Mestre DOM-manipulation: 4: Student section Routing Systemer Implementer klient-side routing: 4: Student Håndter browserhistorik: 5: Student Opret navigationssystemer: 5: Student section Professionelle Mønstre Byg modulær arkitektur: 5: Student Anvend bedste praksis: 5: Student Skab brugeroplevelser: 5: Student ``` Da Apollo 11's styringscomputer navigerede til månen i 1969, skulle den skifte mellem forskellige programmer uden at genstarte hele systemet. Moderne webapplikationer fungerer på samme måde – de ændrer det, du ser, uden at genindlæse alt fra bunden. Det skaber den glatte, responsive oplevelse, brugere forventer i dag. I modsætning til traditionelle hjemmesider, der genindlæser hele sider for hver interaktion, opdaterer moderne webapps kun de dele, der skal ændres. Denne tilgang, ligesom mission control, der skifter mellem forskellige skærmbilleder, mens de opretholder konstant kommunikation, skaber den flydende oplevelse, vi er blevet vant til. Her er, hvad der gør forskellen så dramatisk: | Traditionelle multi-sides apps | Moderne enkelt-sides apps | |-------------------------------|--------------------------| | **Navigation** | Genindlæsning af hele siden for hvert skærmbillede | Øjeblikkelig skift af indhold | | **Ydeevne** | Langsommere pga. fulde HTML-downloads | Hurtigere med delvise opdateringer | | **Brugeroplevelse** | Forstyrrende sideblink | Glatte, app-lignende overgange | | **Datadeling** | Vanskelig mellem sider | Let tilstandsstyring | | **Udvikling** | Flere HTML-filer at vedligeholde | En enkelt HTML med dynamiske skabeloner | **Forstå udviklingen:** - **Traditionelle apps** kræver serveranmodninger ved hver navigation - **Moderne SPAs** loader én gang og opdaterer indhold dynamisk med JavaScript - **Brugerforventninger** favoriserer nu øjeblikkelige og sømløse interaktioner - **Ydeevnefordele** inkluderer mindre båndbredde og hurtigere responstid I denne lektion bygger vi en bankapp med flere skærmbilleder, der flyder sammen problemfrit. Ligesom forskere bruger modulære instrumenter, der kan omkonfigureres til forskellige eksperimenter, bruger vi HTML-skabeloner som genanvendelige komponenter, der kan vises efter behov. Du vil arbejde med HTML-skabeloner (genanvendelige blueprints til forskellige skærme), JavaScript-ruting (systemet der skifter mellem skærmbilleder), og browserens history API (som sørger for, at tilbage-knappen fungerer som forventet). Dette er de samme grundlæggende teknikker, som bruges af frameworks som React, Vue og Angular. Til sidst vil du have en fungerende bankapp, der demonstrerer professionelle principper for enkelt-sides applikationer. ```mermaid mindmap root((Single-Page Applikationer)) Architecture Template System Client-side Routing State Management Event Handling Templates Genanvendelige Komponenter Dynamisk Indhold DOM Manipulation Indholdsskift Routing URL-styring History API Navigationslogik Browserintegration User Experience Hurtig Navigation Glidende Overgange Konsistent Tilstand Moderne Interaktioner Performance Reducerede Serverforespørgsler Hurtigere Sideovergange Effektiv Ressourcebrug Bedre Responsivitet ``` ## For-forelæsning quiz [For-forelæsning quiz](https://ff-quizzes.netlify.app/web/quiz/41) ### Hvad du får brug for Vi får brug for en lokal webserver til at teste vores bankapp – bare rolig, det er nemmere end det lyder! Hvis du ikke allerede har en opsat, så installer bare [Node.js](https://nodejs.org) og kør `npx lite-server` fra din projektmappe. Denne smarte kommando starter en lokal server og åbner din app automatisk i browseren. ### Forberedelse På din computer opret en mappe med navnet `bank` og en fil inde i den, der hedder `index.html`. Vi starter med denne HTML [skabelon](https://en.wikipedia.org/wiki/Boilerplate_code): ```html Bank App ``` **Dette tilbyder skabelonen:** - **Etablerer** HTML5 dokumentstruktur med korrekt DOCTYPE deklaration - **Konfigurerer** tegnkodning som UTF-8 for international tekstunderstøttelse - **Muliggør** responsivt design med viewport meta-tag til mobilkompatibilitet - **Sætter** en beskrivende titel, der vises i browserfanen - **Opretter** en ren body-sektion, hvor vi bygger vores applikation > 📁 **Projektstrukturoversigt** > > **Ved slutningen af denne lektion vil dit projekt indeholde:** > ``` > bank/ > ├── index.html > ├── app.js > └── style.css > ``` > > **Filansvar:** > - **index.html**: Indeholder alle skabeloner og strukturen til appen > - **app.js**: Håndterer ruting, navigation og skabelonstyring > - **Skabeloner**: Definerer UI til login, dashboard og andre skærme --- ## HTML-skabeloner Skabeloner løser et grundlæggende problem i webudvikling. Da Gutenberg opfandt det bevægelige typesystem i 1440’erne, indså han, at i stedet for at udskære hele sider kunne han lave genanvendelige bogstavblokke og arrangere dem efter behov. HTML-skabeloner fungerer på samme princip – i stedet for at skabe separate HTML-filer til hver skærm definerer du genanvendelige strukturer, som kan vises efter behov. ```mermaid flowchart TD A["📋 Skabelon Definition"] --> B["💬 Skjult i DOM"] B --> C["🔍 JavaScript Finder Skabelon"] C --> D["📋 Klon Skabelon Indhold"] D --> E["🔗 Vedhæft til Synligt DOM"] E --> F["👁️ Bruger Ser Indhold"] G["Login Skabelon"] --> A H["Dashboard Skabelon"] --> A I["Fremtidige Skabeloner"] --> A style A fill:#e3f2fd style D fill:#e8f5e8 style F fill:#fff3e0 style B fill:#f3e5f5 ``` Tænk på skabeloner som blueprints for forskellige dele af din app. Ligesom en arkitekt skaber ét blueprint og bruger det flere gange i stedet for at tegne identiske rum flere gange, laver vi skabeloner én gang og instansierer dem efter behov. Browseren holder disse skabeloner skjulte, indtil JavaScript aktiverer dem. Hvis du vil lave flere skærme til en webside, kunne en løsning være at lave en HTML-fil for hver skærm, du vil vise. Denne løsning har dog nogle ulemper: - Du skal genindlæse hele HTML'en, når du skifter skærm, hvilket kan være langsomt. - Det er svært at dele data mellem de forskellige skærme. En anden tilgang er at have kun én HTML-fil og definere flere [HTML-skabeloner](https://developer.mozilla.org/docs/Web/HTML/Element/template) ved hjælp af `