# Bygg en bankapp del 1: HTML-maler og ruter i en nettapp ```mermaid journey title Din utviklingsreise for bankappen section SPA Grunnleggende Forstå enkeltsideapper: 3: Student Lær mal-konsepter: 4: Student Mestre DOM-manipulasjon: 4: Student section Rutingsystemer Implementer klientside-ruting: 4: Student Håndter nettleserhistorikk: 5: Student Lag navigasjonssystemer: 5: Student section Profesjonelle mønstre Bygg modulær arkitektur: 5: Student Bruk beste praksis: 5: Student Lag brukeropplevelser: 5: Student ``` Da Apollo 11s styringscomputer navigerte til månen i 1969, måtte den bytte mellom forskjellige programmer uten å starte hele systemet på nytt. Moderne nettapplikasjoner fungerer på lignende måte – de endrer det du ser uten å laste alt på nytt. Dette skaper den smidige og responsive opplevelsen brukerne forventer i dag. I motsetning til tradisjonelle nettsteder som laster inn hele sider for hver interaksjon, oppdaterer moderne nettapper bare de delene som trenger endring. Denne tilnærmingen, omtrent som hvordan kontrollsenteret bytter mellom forskjellige skjermer samtidig som det opprettholder konstant kommunikasjon, skaper den flytende opplevelsen vi har blitt vant til. Her er hva som gjør forskjellen så dramatisk: | Tradisjonelle fler-sides apper | Moderne enkelt-sides apper | |-------------------------------|---------------------------| | **Navigasjon** | Full sideinnlasting for hver skjerm | Øyeblikkelig innholdsswitch | | **Ytelse** | Langsommere på grunn av full HTML-nedlasting | Raskere med delvise oppdateringer | | **Brukeropplevelse** | Slående sideblinking | Smidige, app-lignende overganger | | **Deling av data** | Vanskelig mellom sider | Enkel tilstandshåndtering | | **Utvikling** | Flere HTML-filer å vedlikeholde | Én HTML med dynamiske maler | **Forstå evolusjonen:** - **Tradisjonelle apper** krever serverforespørsler for hver navigasjonshandling - **Moderne SPA-er** laster én gang og oppdaterer innhold dynamisk med JavaScript - **Brukerforventninger** foretrekker nå øyeblikkelige, sømløse interaksjoner - **Ytelsesfordeler** inkluderer redusert båndbredde og raskere respons I denne leksjonen skal vi bygge en bankapp med flere skjermer som flyter sømløst sammen. Akkurat som forskere bruker modulære instrumenter som kan omkonfigureres for forskjellige eksperimenter, skal vi bruke HTML-maler som gjenbrukbare komponenter som kan vises etter behov. Du vil jobbe med HTML-maler (gjenbrukbare tegninger for ulike skjermer), JavaScript-ruting (systemet som bytter mellom skjermer) og nettleserens history API (som sørger for at tilbake-knappen fungerer som forventet). Dette er de samme grunnleggende teknikkene som brukes av rammeverk som React, Vue og Angular. Mot slutten vil du ha en fungerende bankapp som demonstrerer profesjonelle prinsipper for enkelt-sides applikasjoner. ```mermaid mindmap root((Single-Page Applications)) Architecture Template System Klient-side Routing Tilstandsbehandling Hendelseshåndtering Templates Gjenbrukbare Komponenter Dynamisk Innhold DOM-Manipulasjon Innholdsbytte Routing URL-Behandling Historikk-API Navigasjonslogikk Nettleserintegrasjon User Experience Rask Navigasjon Glatte Overganger Konsistent Tilstand Moderne Interaksjoner Performance Reduserte Serverforespørsler Raskere Sideoverganger Effektiv Ressursbruk Bedre Responsivitet ``` ## Forhåndsforelesnings-quiz [Forhåndsforelesnings-quiz](https://ff-quizzes.netlify.app/web/quiz/41) ### Hva du trenger Vi trenger en lokal webserver for å teste bankappen vår – ikke bekymre deg, det er enklere enn det høres ut! Hvis du ikke allerede har en, installer bare [Node.js](https://nodejs.org) og kjør `npx lite-server` fra prosjektmappen din. Denne nyttige kommandoen starter en lokal server og åpner automatisk appen i nettleseren. ### Forberedelse På din datamaskin, opprett en mappe kalt `bank` med en fil som heter `index.html` inni. Vi starter fra denne HTML [boilerplate](https://en.wikipedia.org/wiki/Boilerplate_code): ```html Bank App ``` **Dette tilbyr denne boilerplaten:** - **Etablerer** HTML5-dokumentstruktur med korrekt DOCTYPE-deklarasjon - **Konfigurerer** tegnkoding som UTF-8 for internasjonal tekststøtte - **Aktiverer** responsivt design med viewport meta-tag for mobilkompatibilitet - **Setter** en beskrivende tittel som vises i nettleserfanen - **Oppretter** en ren body-seksjon hvor vi bygger applikasjonen > 📁 **Prosjektstruktur-forhåndsvisning** > > **Ved slutten av denne leksjonen vil prosjektet ditt inneholde:** > ``` > bank/ > ├── index.html > ├── app.js > └── style.css > ``` > > **Filansvar:** > - **index.html**: Inneholder alle maler og utgjør appens struktur > - **app.js**: Håndterer ruting, navigasjon og malhåndtering > - **Malene**: Definerer UI for innlogging, dashbord og andre skjermer --- ## HTML-maler Maler løser et grunnleggende problem i webutvikling. Da Gutenberg oppfant løst metalltrykk i 1440-årene, innså han at i stedet for å skjære ut hele sider, kunne han lage gjenbrukbare bokstavblokker og arrangere dem etter behov. HTML-maler fungerer på samme prinsipp – i stedet for å lage separate HTML-filer for hver skjerm, definerer du gjenbrukbare strukturer som vises ved behov. ```mermaid flowchart TD A["📋 Maldefinisjon"] --> B["💬 Skjult i DOM"] B --> C["🔍 JavaScript finner mal"] C --> D["📋 Klon malinnhold"] D --> E["🔗 Fest til synlig DOM"] E --> F["👁️ Bruker ser innhold"] G["Innloggingsmal"] --> A H["Dashbordmal"] --> A I["Fremtidige maler"] --> A style A fill:#e3f2fd style D fill:#e8f5e8 style F fill:#fff3e0 style B fill:#f3e5f5 ``` Tenk på maler som tegninger for ulike deler av appen din. Akkurat som en arkitekt lager én tegning og bruker den flere ganger i stedet for å tegne identiske rom på nytt, lager vi maler én gang og oppretter dem etter behov. Nettleseren holder disse malene skjult til JavaScript aktiverer dem. Hvis du vil lage flere skjermer for en nettside, kan en løsning være å lage én HTML-fil for hver skjerm du vil vise. Men denne løsningen medfører noen ulemper: - Du må laste inn hele HTML på nytt når du bytter skjerm, noe som kan være tregt. - Det er vanskelig å dele data mellom de ulike skjermene. En annen tilnærming er å ha bare én HTML-fil, og definere flere [HTML-maler](https://developer.mozilla.org/docs/Web/HTML/Element/template) ved å bruke `