📦 microsoft / Web-Dev-For-Beginners

📄 README.md · 597 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597<!--
CO_OP_TRANSLATOR_METADATA:
{
  "original_hash": "b275fed2c6fc90d2b9b6661a3225faa2",
  "translation_date": "2026-01-07T00:35:58+00:00",
  "source_file": "5-browser-extension/3-background-tasks-and-performance/README.md",
  "language_code": "no"
}
-->
# Nettleserutvidelsesprosjekt Del 3: Lær om Bakgrunnsoppgaver og Ytelse

```mermaid
journey
    title Din Reise for Ytelsesoptimalisering
    section Grunnlag
      Lær nettleserverktøy: 3: Student
      Forstå profilering: 4: Student
      Identifiser flaskehalser: 4: Student
    section Utvidelsesfunksjoner
      Bygg fargesystem: 4: Student
      Lag bakgrunnsoppgaver: 5: Student
      Oppdater ikoner dynamisk: 5: Student
    section Optimalisering
      Overvåk ytelse: 5: Student
      Feilsøk problemer: 4: Student
      Poler opplevelse: 5: Student
```
Har du noen gang lurt på hva som gjør at noen nettleserutvidelser føles raske og responsive, mens andre virker trege? Hemmeligheten ligger i hva som skjer bak kulissene. Mens brukere klikker rundt i utvidelsens grensesnitt, finnes det en hel verden av bakgrunnsprosesser som stille håndterer henting av data, ikonoppdateringer og systemressurser.

Dette er vår siste leksjon i nettleserutvidelsesserien, og vi skal få karbonavtrykksporeren din til å fungere smidig. Du vil legge til dynamiske ikonoppdateringer og lære hvordan du oppdager ytelsesproblemer før de blir alvorlige. Det er som å tune en racerbilen – små optimaliseringer kan gjøre en enorm forskjell i hvordan alt fungerer.

Når vi er ferdige, vil du ha en polert utvidelse og forstå ytelsesprinsippene som skiller gode nettapper fra de flotte. La oss dykke ned i nettleseroptimaliseringens verden.

## Forhåndsforelesnings-Quiz

[Forhåndsforelesnings-quiz](https://ff-quizzes.netlify.app/web/quiz/27)

### Introduksjon

I våre tidligere leksjoner har du laget et skjema, koblet det til en API, og håndtert asynkron datahenting. Utvidelsen din tar form på en fin måte.

Nå trenger vi å legge de siste detaljene – som å få ikonet til utvidelsen til å endre farge basert på karbondata. Dette minner meg om hvordan NASA måtte optimalisere hvert system på Apollo-romfartøyet. De hadde ikke råd til noen bortkastede sykluser eller minne fordi liv var avhengig av ytelsen. Selv om vår nettleserutvidelse ikke er like kritisk, gjelder de samme prinsippene – effektiv kode gir bedre brukeropplevelser.

```mermaid
mindmap
  root((Ytelse og bakgrunnsoppgaver))
    Browser Performance
      Rendering Pipeline
      Asset Optimization
      DOM Manipulation
      JavaScript Execution
    Profiling Tools
      Developer Tools
      Performance Tab
      Timeline Analysis
      Bottleneck Detection
    Extension Architecture
      Background Scripts
      Content Scripts
      Message Passing
      Icon Management
    Optimization Strategies
      Code Splitting
      Lazy Loading
      Caching
      Resource Compression
    Visual Feedback
      Dynamic Icons
      Color Coding
      Real-time Updates
      User Experience
```
## Grunnleggende om Nettleserytelse

Når koden din kjører effektivt, kan folk faktisk *føle* forskjellen. Du vet det øyeblikket når en side laster umiddelbart eller en animasjon flyter jevnt? Det er god ytelse på jobb.

Ytelse handler ikke bare om hastighet – det handler om å lage nettopplevelser som føles naturlige i stedet for klønete og frustrerende. Tidlig i databehandlingens dager hadde Grace Hopper berømt en nanosekund (et stykke ledning som var omtrent en fot langt) på skrivebordet for å vise hvor langt lys reiser i en milliarddel av et sekund. Det var hennes måte å forklare hvorfor hvert mikrosekund teller i databehandling. La oss utforske detektivverktøyene som hjelper deg å finne ut hva som sinker ting.

> "Nettstedets ytelse handler om to ting: hvor raskt siden lastes, og hvor raskt koden på den kjører." -- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)

Temaet om hvordan du får nettsidene dine lynraske på alle slags enheter, for alle slags brukere, i alle slags situasjoner, er selvsagt omfattende. Her er noen punkter å ha i bakhodet når du bygger enten et standard nettoprojekt eller en nettleserutvidelse.

Det første steget i å optimalisere nettstedet ditt er å forstå hva som faktisk skjer under panseret. Heldigvis har nettleseren din kraftige detektivverktøy innebygd.

```mermaid
flowchart LR
    A[HTML] --> B[Tolk]
    B --> C[DOM-tre]
    D[CSS] --> E[Tolk]
    E --> F[CSSOM]
    G[JavaScript] --> H[Utfør]
    
    C --> I[Rendererings-tre]
    F --> I
    H --> I
    
    I --> J[Oppsett]
    J --> K[Maling]
    K --> L[Sammensetning]
    L --> M[Visning]
    
    subgraph "Kritisk rendereringsvei"
        N["1. Tolk HTML"]
        O["2. Tolk CSS"]
        P["3. Utfør JS"]
        Q["4. Bygg rendererings-tre"]
        R["5. Oppsett elementer"]
        S["6. Mal piksler"]
        T["7. Sett sammen lag"]
    end
    
    style M fill:#e8f5e8
    style I fill:#fff3e0
    style H fill:#ffebee
```
For å åpne Utviklerverktøy i Edge, klikk på de tre prikkene øverst til høyre, gå deretter til Flere verktøy > Utviklerverktøy. Eller bruk hurtigtasten: `Ctrl` + `Shift` + `I` på Windows eller `Option` + `Command` + `I` på Mac. Når du er der, klikker du på Ytelsestabben – her skal du gjøre undersøkelsen din.

**Her er din detektivverktøykasse for ytelse:**
- **Åpne** Utviklerverktøy (du kommer til å bruke disse konstant som utvikler!)
- **Gå** til Ytelsestabben – tenk på det som nettappens aktivitetsmåler
- **Trykk** på Spill inn-knappen og se siden i aksjon
- **Studer** resultatene for å oppdage hva som sinker ting

La oss prøve dette. Åpne et nettsted (Microsoft.com fungerer bra for dette) og trykk på 'Spill inn'-knappen. Last deretter siden på nytt og se profilereren fange alt som skjer. Når du stopper opptaket, vil du se en detaljert oversikt over hvordan nettleseren 'skriver skript', 'renderer' og 'maler' siden. Det minner meg om hvordan oppdragskontrollen overvåker hvert system under en rakettoppskyting – du får sanntidsdata på eksakt hva som skjer og når.

![Edge profiler](../../../../translated_images/no/profiler.5a4a62479c5df01c.webp)

✅ [Microsoft-dokumentasjonen](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) har mange flere detaljer hvis du vil dykke dypere.

> Proftips: Tøm nettleserens hurtigbuffer før du tester for å se hvordan siden din oppfører seg for førstegangsbesøkende – det er vanligvis ganske annerledes enn ved gjentatte besøk!

Velg elementer på profiltidslinjen for å zoome inn på hendelser som skjer mens siden laster.

Få et øyeblikksbilde av sidens ytelse ved å velge deler av tidslinjen og se på oppsummeringspanelet:

![Edge snapshot](../../../../translated_images/no/snapshot.97750180ebcad737.webp)

Sjekk hendelsesloggen for å se om noen hendelser tok lengre tid enn 15 ms:

![Edge event log](../../../../translated_images/no/log.804026979f3707e0.webp)

✅ Bli kjent med profilereren din! Åpne utviklerverktøyene på dette nettstedet og se om det finnes noen flaskehalser. Hva er den tregest lastende ressursen? Den raskeste?

```mermaid
flowchart TD
    A[Åpne DevTools] --> B[Naviger til Ytelsesfane]
    B --> C[Klikk på opptaksknapp]
    C --> D[Utfør handlinger]
    D --> E[Stopp opptak]
    E --> F{Analyser resultater}
    
    F --> G[Sjekk tidslinje]
    F --> H[Se gjennom nettverk]
    F --> I[Undersøk skript]
    F --> J[Identifiser malehendelser]
    
    G --> K{Lange oppgaver?}
    H --> L{Store ressurser?}
    I --> M{Rendreblokkering?}
    J --> N{Kostbare malinger?}
    
    K -->|Ja| O[Optimaliser JavaScript]
    L -->|Ja| P[Komprimer ressurser]
    M -->|Ja| Q[Legg til Async/Defer]
    N -->|Ja| R[Forenkle stiler]
    
    O --> S[Test igjen]
    P --> S
    Q --> S
    R --> S
    
    style A fill:#e1f5fe
    style F fill:#fff3e0
    style S fill:#e8f5e8
```
## Hva du bør se etter når du profilerer

Å kjøre profilereren er bare begynnelsen – den virkelige ferdigheten ligger i å vite hva de fargerike grafene faktisk forteller deg. Ikke bekymre deg, du vil lære deg å lese dem. Erfarne utviklere har lært å oppdage varselsignaler før de utvikler seg til fullverdige problemer.

La oss snakke om vanlige syndere – ytelsesproblemene som ofte sniker seg inn i nettprosjekter. Som Marie Curie måtte overvåke strålingsnivåer nøye i laboratoriet sitt, må vi følge med på visse mønstre som indikerer trøbbel på vei. Å fange disse tidlig sparer deg (og brukerne dine) mye frustrasjon.

**Ressursstørrelser**: Nettsteder har blitt "tyngre" over årene, og mye av denne ekstra vekten kommer fra bilder. Det er som om vi har pakket mer og mer i våre digitale kofferter.

✅ Sjekk ut [Internet Archive](https://httparchive.org/reports/page-weight) for å se hvordan sidestørrelser har vokst over tid – det er ganske avslørende.

**Slik holder du ressursene dine optimalisert:**
- **Komprimer** bildene! Moderne formater som WebP kan redusere filstørrelser dramatisk
- **Server** riktig bildestørrelse for hver enhet – ingen grunn til å sende enorme desktop-bilder til telefoner
- **Minifiser** CSS og JavaScript – hvert byte teller
- **Bruk** lazy loading slik at bilder bare lastes når brukeren faktisk blar til dem

**DOM-gjennomganger**: Nettleseren må bygge sin Document Object Model basert på koden du skriver, så for god sidens ytelse lønner det seg å holde taggene minimale og bare bruke og style det siden trenger. I denne sammenheng kan overflødig CSS knyttet til en side optimaliseres; stiler som kun skal brukes på én side, trenger for eksempel ikke å inkluderes i hovedstilarket.

**Nøkkelstrategier for DOM-optimalisering:**
- **Minimerer** antall HTML-elementer og nestingsnivåer
- **Fjerner** ubrukt CSS og samler stilark effektivt
- **Organiserer** CSS slik at bare nødvendig lastes for hver side
- **Strukturerer** HTML semantisk for bedre nettlesertolkning

**JavaScript**: Alle JavaScript-utviklere bør se opp for 'render-blocking'-skript som må lastes før resten av DOM kan gjennomgås og gjengis i nettleseren. Vurder å bruke `defer` med inline-skriptene dine (som i Terrarium-modulen).

**Moderne JavaScript-optimaliseringsteknikker:**
- **Bruker** `defer`-attributtet for å laste skripter etter DOM-parsing
- **Implementerer** kodedeling for å laste kun nødvendig JavaScript
- **Benytter** lazy loading for ikke-kritisk funksjonalitet
- **Minimerer** bruken av tunge biblioteker og rammeverk når det er mulig

✅ Prøv noen nettsteder på en [Test for nettstedshastighet](https://www.webpagetest.org/) for å lære mer om vanlige sjekker som gjøres for å fastslå nettstedsytelse.

### 🔄 **Pedagogisk Sjekk-inn**  
**Ytelsesforståelse**: Før du bygger funksjoner i utvidelsen, sørg for at du kan:  
- ✅ Forklare den kritiske rendering-stien fra HTML til piksler  
- ✅ Identifisere vanlige ytelsesflaskehalser i nettapplikasjoner  
- ✅ Bruke nettleserens utviklerverktøy for å profilere sidens ytelse  
- ✅ Forstå hvordan ressursstørrelse og DOM-kompleksitet påvirker hastighet

**Rask Selvtest**: Hva skjer når du har render-blocking JavaScript?  
*Svar: Nettleseren må laste ned og kjøre skriptet før den kan fortsette å analysere HTML og gjengi siden*

**Reell verdens ytelseseffekt**:  
- **100 ms forsinkelse**: Brukere merker tregheten  
- **1 sekunds forsinkelse**: Brukere begynner å miste fokus  
- **3+ sekunder**: 40 % av brukerne forlater siden  
- **Mobilt nettverk**: Ytelse er enda viktigere

Nå som du har en idé om hvordan nettleseren renderer ressursene du sender til den, la oss se på de siste tingene du må gjøre for å fullføre utvidelsen din:

### Lag en funksjon for å beregne farge

Nå skal vi lage en funksjon som gjør numeriske data om til meningsfulle farger. Tenk på det som et trafikksignalsystem – grønt for ren energi, rødt for høy karbonintensitet.

Denne funksjonen tar CO2-data fra APIen vår og bestemmer hvilken farge som best representerer miljøpåvirkningen. Det er likt hvordan vitenskapsfolk bruker fargekoding i varmekart for å visualisere komplekse datapattern – fra havtemperaturer til stjernedannelse. La oss legge dette til i `/src/index.js`, rett etter de `const`-variablene vi definerte tidligere:

```mermaid
flowchart LR
    A[CO2 Verdi] --> B[Finn Nærmeste Skala Punkt]
    B --> C[Hent Skala Indeks]
    C --> D[Kartlegg til Farge]
    D --> E[Send til Bakgrunn]
    
    subgraph "Fargeskala"
        F["0-150: Grønn (Ren)"]
        G["150-600: Gul (Moderat)"]
        H["600-750: Oransje (Høy)"]
        I["750+: Brun (Veldig Høy)"]
    end
    
    subgraph "Meldingsformidling"
        J[Innholdsskript]
        K[chrome.runtime.sendMessage]
        L[Bakgrunnsskript]
        M[Oppdater Ikon]
    end
    
    style A fill:#e1f5fe
    style D fill:#e8f5e8
    style E fill:#fff3e0
```
```javascript
function calculateColor(value) {
	// Definer CO2-intensitetsskala (gram per kWh)
	const co2Scale = [0, 150, 600, 750, 800];
	// Tilsvarende farger fra grønn (ren) til mørk brun (høyt karbon)
	const colors = ['#2AA364', '#F5EB4D', '#9E4229', '#381D02', '#381D02'];

	// Finn nærmeste skala-verdi til vår input
	const closestNum = co2Scale.sort((a, b) => {
		return Math.abs(a - value) - Math.abs(b - value);
	})[0];
	
	console.log(`${value} is closest to ${closestNum}`);
	
	// Finn indeksen for fargekartlegging
	const num = (element) => element > closestNum;
	const scaleIndex = co2Scale.findIndex(num);

	const closestColor = colors[scaleIndex];
	console.log(scaleIndex, closestColor);

	// Send fargeoppdateringsmelding til bakgrunnsskript
	chrome.runtime.sendMessage({ action: 'updateIcon', value: { color: closestColor } });
}
```

**La oss bryte ned denne smarte lille funksjonen:**  
- **Setter opp** to arrayer - en for CO2-nivåer, en annen for farger (grønn = ren, brun = skitten!)  
- **Finner** nærmeste match til vår faktiske CO2-verdi ved hjelp av smart array-sortering  
- **Henter** den matchende fargen ved å bruke findIndex()-metoden  
- **Sender** en melding til Chromes bakgrunnsskript med den valgte fargen  
- **Bruker** template literals (de backtick-tegnene) for ryddigere strengformatering  
- **Holder** alt organisert med const-deklarasjoner

`chrome.runtime` [API](https://developer.chrome.com/extensions/runtime) er som nervessystemet til utvidelsen din – det håndterer all kommunikasjon og oppgaver bak kulissene:

> "Bruk chrome.runtime API for å hente bakgrunnssiden, returnere detaljer om manifest, og lytte til og svare på hendelser i appens eller utvidelsens livssyklus. Du kan også bruke dette API til å konvertere relative URL-stier til fullstendige URLer."

**Hvorfor Chrome Runtime API er så nyttig:**  
- **Lar** forskjellige deler av utvidelsen snakke med hverandre  
- **Håndterer** bakgrunnsarbeid uten å fryse brukergrensesnittet  
- **Administrerer** livssyklus-hendelser i utvidelsen  
- **Gjør** meldingsoverføring mellom skript superenkelt

✅ Hvis du utvikler denne nettleserutvidelsen for Edge, kan det overraske deg at du bruker en chrome API. De nyere Edge-nettleserversjonene kjører på Chromium-nettlesermotoren, så du kan benytte disse verktøyene.

```mermaid
architecture-beta
    group browser(logos:chrome)[Nettleser]
    
    service popup(logos:html5)[Popup UI] in browser
    service content(logos:javascript)[Innholdsskript] in browser
    service background(database)[Bakgrunnsskript] in browser
    service api(logos:api)[Ekstern API] in browser
    
    popup:R -- L:content
    content:R -- L:background
    background:T -- B:api
    content:T -- B:api
    
    junction junctionCenter in browser
    popup:R -- L:junctionCenter
    junctionCenter:R -- L:background
```
> **Proftips**: Hvis du vil profilere en nettleserutvidelse, start utviklerverktøyene fra selve utvidelsen, siden det er en egen egen nettleserinstans. Dette gir deg tilgang til ytelsesmetrikker spesifikke for utvidelsen.

### Sett en standard ikonfarge

Før vi begynner å hente ekte data, la oss gi utvidelsen et utgangspunkt. Ingen liker å se på et tomt eller ødelagt ikon. Vi starter med en grønn farge slik at brukerne vet utvidelsen virker fra det øyeblikket de installerer den.

I `init()`-funksjonen din setter vi opp det grønne standardikonet:

```javascript
chrome.runtime.sendMessage({
	action: 'updateIcon',
	value: {
		color: 'green',
	},
});
```

**Dette oppsettet oppnår:**  
- **Setter** en nøytral grønn farge som standardtilstand  
- **Gir** umiddelbar visuell tilbakemelding når utvidelsen lastes  
- **Etablerer** kommunikasjonsmønsteret med bakgrunnsskriptet  
- **Sikrer** at brukerne ser en fungerende utvidelse før data hentes

### Kall funksjonen, utfør kall

Nå skal vi koble alt sammen slik at når ferske CO2-data kommer inn, oppdateres ikonet automatisk med riktig farge. Det er som å koble den siste kretsen i en elektronisk enhet – plutselig fungerer alle delene som ett system.

Legg til denne linjen rett etter du har hentet CO2-dataene fra APIen:

```javascript
// Etter å ha hentet CO2-data fra API-en
// la CO2 = data.data[0].intensity.actual;
calculateColor(CO2);
```

**Denne integrasjonen oppnår:**  
- **Kobler** API-datatilførselen med det visuelle indikatorystemet  
- **Trigger** ikonoppdateringer automatisk når nye data kommer  
- **Sikrer** sanntids visuell tilbakemelding basert på nåværende karbonintensitet  
- **Opprettholder** separasjonen mellom datainnhenting og visningslogikk

Og til slutt, i `/dist/background.js`, legg til lytteren for disse bakgrunnsaksjonskallene:

```javascript
// Lytt etter meldinger fra innholdsskriptet
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
	if (msg.action === 'updateIcon') {
		chrome.action.setIcon({ imageData: drawIcon(msg.value) });
	}
});

// Tegn dynamisk ikon ved bruk av Canvas API
// Lånt fra energy lollipop-utvidelsen - fint trekk!
function drawIcon(value) {
	// Lag et offscreen-canvas for bedre ytelse
	const canvas = new OffscreenCanvas(200, 200);
	const context = canvas.getContext('2d');

	// Tegn en farget sirkel som representerer karbonintensitet
	context.beginPath();
	context.fillStyle = value.color;
	context.arc(100, 100, 50, 0, 2 * Math.PI);
	context.fill();

	// Returner billeddataene for nettleserikonet
	return context.getImageData(50, 50, 100, 100);
}
```

**Dette bakgrunnsskriptet gjør følgende:**  
- **Lytter** etter meldinger fra hovedskriptet ditt (som en resepsjonist som tar imot anrop)  
- **Behandler** disse 'updateIcon'-forespørslene for å endre ikon i verktøylinjen  
- **Lager** nye ikoner på sparket ved hjelp av Canvas API  
- **Tegner** en enkel farget sirkel som viser gjeldende karbonintensitet  
- **Oppdaterer** nettleserens verktøylinje med det nye ikonet  
- **Bruker** OffscreenCanvas for jevn ytelse (unngår UI-blokkering)

✅ Du vil lære mer om Canvas API i [Space Game-leksjonene](../../6-space-game/2-drawing-to-canvas/README.md).

```mermaid
sequenceDiagram
    participant CS as Innholdsskript
    participant BG as Bakgrunnsskript
    participant Canvas as OffscreenCanvas
    participant Browser as Nettleserikon
    
    CS->>BG: sendMessage({action: 'updateIcon', color})
    BG->>Canvas: new OffscreenCanvas(200, 200)
    Canvas->>Canvas: getContext('2d')
    Canvas->>Canvas: beginPath() + fillStyle + arc()
    Canvas->>Canvas: fill() + getImageData()
    Canvas->>BG: Returner bilde-data
    BG->>Browser: chrome.action.setIcon(imageData)
    Browser->>Browser: Oppdater verktøylinjeikon
```
### 🔄 **Pedagogisk Sjekk-inn**  
**Full Forståelse av Utvidelsen**: Verifiser at du mestrer hele systemet:  
- ✅ Hvordan fungerer meldingsoverføring mellom forskjellige utvidelsesskript?  
- ✅ Hvorfor bruker vi OffscreenCanvas i stedet for vanlig Canvas for ytelse?
- ✅ Hvilken rolle spiller Chrome Runtime API i utvidelsesarkitekturen?
- ✅ Hvordan kartlegger fargeberegningsalgoritmen data til visuell tilbakemelding?

**Ytelsesbetraktninger**: Utvidelsen din demonstrerer nå:
- **Effektiv meldingshåndtering**: Ryddig kommunikasjon mellom skriptkontekster
- **Optimalisert gjengivelse**: OffscreenCanvas forhindrer blokkering av brukergrensesnittet
- **Sanntidsoppdateringer**: Dynamiske ikonendringer basert på live data
- **Minnehåndtering**: Korrekt opprydding og ressursbehandling

**Tid for å teste utvidelsen din:**
- **Bygg** alt med `npm run build`
- **Last inn utvidelsen på nytt i nettleseren** (ikke glem dette trinnet)
- **Åpne** utvidelsen din og se at ikonet endrer farger
- **Sjekk** hvordan den reagerer på ekte karbondata fra hele verden

Nå vil du på et øyeblikk vite om det er et godt tidspunkt å kjøre den vaskemaskinen eller om du bør vente på renere energi. Du har nettopp bygget noe virkelig nyttig og lært om nettleserens ytelse underveis.

## GitHub Copilot Agent Challenge 🚀

Bruk Agent-modus til å fullføre følgende utfordring:

**Beskrivelse:** Forbedre nettleserutvidelsens ytelsesovervåkingsmuligheter ved å legge til en funksjon som sporer og viser lastetider for forskjellige komponenter i utvidelsen.

**Oppgave:** Lag et ytelsesovervåkingssystem for nettleserutvidelsen som måler og logger tiden det tar å hente CO2-data fra API-et, beregne farger og oppdatere ikonet. Legg til en funksjon kalt `performanceTracker` som bruker Performance API for å måle disse operasjonene og viser resultatene i nettleserkonsollen med tidsstempler og varighetsmålinger.

Lær mer om [agent-mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) her.

## 🚀 Utfordring

Her er en spennende detektivoppgave: Velg noen få åpne kilder-nettsteder som har eksistert i mange år (tenk Wikipedia, GitHub eller Stack Overflow) og gransk deres commit-historikk. Kan du se hvor de gjorde ytelsesforbedringer? Hvilke problemer dukket stadig opp?

**Din undersøkelsesmetode:**
- **Søk** commit-meldinger etter ord som "optimize", "performance" eller "faster"
- **Se** etter mønstre - reparerer de de samme problemtypene?
- **Identifiser** de vanlige syndebukkene som bremser ned nettsteder
- **Del** hva du oppdager - andre utviklere lærer av ekte eksempler

## Post-forelesningsquiz

[Post-forelesningsquiz](https://ff-quizzes.netlify.app/web/quiz/28)

## Oppsummering & Selvstudium

Vurder å melde deg på et [ytelsesnyhetsbrev](https://perf.email/)

Undersøk noen av måtene nettlesere måler webytelse på ved å se gjennom ytelsesfanene i deres nettverktøy. Finnes det store forskjeller?

### ⚡ **Hva du kan gjøre de neste 5 minuttene**
- [ ] Åpne nettleserens Oppgavebehandling (Shift+Esc i Chrome) for å se ressursbruk for utvidelser
- [ ] Bruk DevTools Ytelses-fanen for å ta opp og analysere nettsideytelse
- [ ] Sjekk nettleserens Utvidelsesside for å se hvilke utvidelser som påvirker oppstartstid
- [ ] Prøv å deaktivere utvidelser midlertidig for å se ytelsesforskjeller

### 🎯 **Hva du kan oppnå denne timen**
- [ ] Fullfør post-lesson-quiz og forstå ytelseskonsepter
- [ ] Implementer et bakgrunnsskript for nettleserutvidelsen din
- [ ] Lær å bruke browser.alarms for effektive bakgrunnsoppgaver
- [ ] Øv på meldingsutveksling mellom innholdsskript og bakgrunnsskript
- [ ] Mål og optimaliser utvidelsens ressursbruk

### 📅 **Din ukelange ytelsesreise**
- [ ] Utvikle en høyytelses nettleserutvidelse med bakgrunnsfunksjonalitet
- [ ] Mestre service workers og moderne utvidelsesarkitektur
- [ ] Implementer effektive datasynkronisering- og bufferstrategier
- [ ] Lær avanserte feilsøkingsteknikker for ytelse i utvidelser
- [ ] Optimaliser utvidelsen for både funksjonalitet og ressurseffektivitet
- [ ] Lag omfattende tester for ytelsesscenarier i utvidelsen

### 🌟 **Din månedslange optimaliseringsmestring**
- [ ] Bygg bedriftsnivå nettleserutvidelser med optimal ytelse
- [ ] Lær om Web Workers, Service Workers og moderne webytelse
- [ ] Bidra til åpen kilde-prosjekter fokusert på ytelsesoptimalisering
- [ ] Mestre nettleserens interne mekanismer og avansert feilsøking
- [ ] Lag verktøy for ytelsesovervåkning og beste praksis-guider
- [ ] Bli en ytelseseekspert som hjelper med å optimalisere webapplikasjoner

## 🎯 Din tidslinje for studier av nettleserutvidelser

```mermaid
timeline
    title Fullstendig Utvidelsesutviklingsprogresjon
    
    section Grunnleggende ytelse (20 minutter)
        Nettleserprofilering: DevTools mestring
                         : Tidslinjeanalyse
                         : Flaskehalsidentifisering
                         : Kritisk gjengivelsesbane
        
    section Bakgrunnsoppgaver (25 minutter)
        Utvidelsesarkitektur: Meldingsoverføring
                              : Bakgrunnsskript
                              : Runtime API-bruk
                              : Kommunikasjon på tvers av kontekster
        
    section Visuell tilbakemelding (30 minutter)
        Dynamisk UI: Fargekalkulasjonsalgoritmer
                  : Canvas API-integrasjon
                  : Ikongenerering
                  : Oppdateringer i sanntid
        
    section Ytelsesoptimalisering (35 minutter)
        Effektiv kode: Asynkrone operasjoner
                      : Minnehåndtering
                      : Ressursopprydding
                      : Ytelsesovervåkning
        
    section Produksjonsklar (45 minutter)
        Polering og Testing: Tverrleserkompatibilitet
                        : Feilhåndtering
                        : Brukeropplevelse
                        : Ytelsesvalidering
        
    section Avanserte funksjoner (1 uke)
        Utvidelsesøkosystem: Chrome Nettbutikk
                           : Brukertilbakemelding
                           : Analyseintegrasjon
                           : Oppdateringshåndtering
        
    section Profesjonell utvikling (2 uker)
        Bedriftsutvidelser: Team-samarbeid
                             : Kodegjennomganger
                             : CI/CD-pipelines
                             : Sikkerhetsrevisjoner
        
    section Ekspertmestring (1 måned)
        Plattformekspertise: Avanserte Chrome-APIer
                          : Ytelsesoptimalisering
                          : Arkitekturmønstre
                          : Bidrag til åpen kildekode
```
### 🛠️ Ditt komplette verktøykasse for utvidelsesutvikling

Etter å ha fullført denne trilogien har du mestret:
- **Nettleserarkitektur**: Dyp forståelse av hvordan utvidelser integreres med nettlesersystemer
- **Ytelsesprofilering**: Evne til å identifisere og fikse flaskehalser med utviklerverktøy
- **Asynkron programmering**: Moderne JavaScript-mønstre for responsiv, ikke-blokkerende drift
- **API-integrasjon**: Henting av eksterne data med autentisering og feilbehandling
- **Visuell design**: Dynamiske UI-oppdateringer og grafikkgenerering basert på Canvas
- **Meldingsoverføring**: Kommunikasjon mellom skript i utvidelsesarkitekturer
- **Brukeropplevelse**: Lastetilstander, feilhåndtering og intuitive interaksjoner
- **Produksjonsferdigheter**: Testing, feilsøking og optimalisering for ekte distribusjon

**Reelle brukstilfeller:** Ferdighetene dine innen utvidelsesutvikling gjelder direkte for:
- **Progressive Web Apps**: Liknende arkitektur og ytelsesmønstre
- **Electron desktop-apper**: Tverrplattform-applikasjoner med webteknologier
- **Mobile hybrid-apper**: Cordova/PhoneGap-utvikling som bruker web-API-er
- **Bedriftswebapplikasjoner**: Komplekse dashbord og produktivitetsverktøy
- **Chrome DevTools-utvidelser**: Avanserte utviklerverktøy og feilsøking
- **Web API-integrasjon**: Enhver app som kommuniserer med eksterne tjenester

**Profesjonell effekt:** Du kan nå:
- **Bygge** produksjonsklare nettleserutvidelser fra idé til lansering
- **Optimalisere** webapplikasjoners ytelse med bransjestandard profileringsverktøy
- **Arkitektere** skalerbare systemer med riktig bekymringsseparasjon
- **Feilsøke** komplekse asynkrone operasjoner og kommunikasjon på tvers av kontekster
- **Bidra** til åpen kilde-utvidelsesprosjekter og nettleserstandarder

**Muligheter på neste nivå:**
- **Chrome Web Store-utvikler**: Publiser utvidelser til millioner av brukere
- **Web Performance Engineer**: Spesialiser deg på optimalisering og brukeropplevelse
- **Nettleserplattformutvikler**: Bidra til utvikling av nettlesermotorer
- **Utviklerverktøy-skaper**: Lag verktøy som hjelper andre utviklere
- **Utviklerrelasjoner**: Del kunnskap via undervisning og innholdsproduksjon

🌟 **Utmerkelse oppnådd**: Du har bygd en komplett, funksjonell nettleserutvidelse som demonstrerer profesjonell utviklingspraksis og moderne webstandarder!

## Oppgave

[Analyser et nettsted for ytelse](assignment.md)

---

<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Ansvarsfraskrivelse**:
Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vennligst merk at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på det opprinnelige språket skal anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi påtar oss ikke ansvar for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->