Snøkam logo Tilbake

Nysnø: Lunsjpratens dilemma - React versus Angular

Den evinnelige diskusjonen mellom React og Angular fortsetter å engasjere utviklere verden over. Med nylig release av Angular 18 og en offisiell release av React 19 rett rundt hjørnet har diskusjonen blomstret opp på nytt. Men hvorfor er dette valget så viktig, og hva er de langsiktige konsekvensene av å velge den ene teknologien fremfor den andre?

Bibliotek versus rammeverk

Angular er et rammeverk utviklet av Google. På godt og vondt gir det en standardisert måte å bygge webapplikasjoner på. Det inkluderer verktøy og konvensjoner for alt fra routing til databinding og kommer med en out-of-the-box CLI som hjelper deg med komponent-struktur, services, bygg, oppdateringer og deploy. Denne pakken gjør Angular til et utmerket valg for bedriftsapplikasjoner, hvor en state-of-the-art setup er kritisk fra første deploy.

React er derimot et bibliotek, utviklet av Facebook. Det fokuserer på byggingen av brukergrensesnitt. React gir utvikleren mulighet til å velge mellom stabile eller cutting edge, ekstremt raske eller ekstremt brukervennlige verktøy hele veien. Det tillater også utvikleren å utforske reisen, verktøyene og nytten selv før man gaper over alt på en gang.

Historie og Popularitet

Angular ble først lansert i 2010 som AngularJS og fikk en fullstendig omskrivning i 2016 med Angular 2. React ble lansert i 2013 og har siden vært et populært valg blant utviklere. Store selskaper som Google, Microsoft, og Netflix bruker Angular, mens React brukes av Facebook, Instagram, og Airbnb.

Læringskurven

Angulars omfattende natur gir en bratt læringskurve, spesielt for større prosjekter. Man må lære seg arkitekturprinsipper, teknisk verktøy som RxJS, og andre konsepter for å få full nytte av rammeverket. Heldigvis tilbyr Angular en offisiell, svært god, læringsguide som tar utviklere gjennom alle nødvendig læringssteg.

React er langt enklere å komme i gang med, og man har anledning til å hoppe rett i en «Hello World»-app med en gang. Avanserte verktøy og konsepter kan man i utgangspunktet lære seg etter hvert som man ser nytten av dem. Da er det også fint å vite at React sitt community er enormt og man har en brukermasse i ryggen som garantert har et løsningsforslag på akkurat ditt problem, uansett hvor obskurt problemet måtte oppleves.

Implementasjonsforskjeller

Komponentdefinisjon
React-komponenter kan defineres som funksjonelle eller klassekomponenter. Funksjonelle komponenter bruker hooks for tilstand og livssyklus.

// Funksjonell komponent
import React, { useState } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}
export default MyComponent;

Angular-komponenter er klassebaserte og bruker TypeScript. Komponenter defineres med dekoratorer.

// Angular-komponent
import { Component } from '@angular/core';
@Component({
selector: 'app-my-component',
template: `
<div>
<p>You clicked {{ count }} times</p>
<button (click)="increment()">Click me</button>
</div>
`
})
export class MyComponent {
count = 0;
increment() {
this.count++;
}
}

Tilstandshåndtering
React bruker hooks somuseState og useReducer for tilstandshåndtering.

import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>{count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}

Angular bruker tjenestebaserte tilnærminger for tilstandshåndteringer, ofte med RxJS for reaktive dataflyter.

import { Component } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Component({
selector: 'app-counter',
template: `
<div>
<p>{{ count$ | async }}</p>
<button (click)="increment()">Increment</button>
</div>
`
})
export class CounterComponent {
private countSubject = new BehaviorSubject<number>(0);
count$ = this.countSubject.asObservable();
increment() {
this.countSubject.next(this.countSubject.value + 1);
}
}

Routing
React-router er et populært bibliotek for ruting i React-applikasjoner.

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './Home';
import About from './About';
function App() {
return (
<Router>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
</Switch>
</Router>
);
}
export default App;

Angular har en innebygd rutingmodul importert fra@angular/router

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'about', component: AboutComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }

Data-binding
React bruker enveis data-binding, der data alltid flyter nedover fra forelder til barn via props.

function ParentComponent() {
const [data, setData] = useState('Hello');
return <ChildComponent data={data} />;
}
function ChildComponent({ data }) {
return <p>{data}</p>;
}

Angular tillater derimot også toveis data-binding med banana-in-box-syntaks [(ngModel)].

import { Component } from '@angular/core';
@Component({
selector: 'app-parent',
template: `
<input [(ngModel)]="data" />
<app-child [data]="data"></app-child>
`
})
export class ParentComponent {
data = 'Hello';
}
@Component({
selector: 'app-child',
template: `<p>{{ data }}</p>`
})
export class ChildComponent {
@Input() data: string;
}

Performance

React og Angular har begge sterke ytelsesoptimaliseringer, men tilnærmingene deres varierer. Reacts bruk av virtual DOM gir raskere oppdateringer ved å minimere antall direkte manipulasjoner i den faktiske DOM-en. Angulars ahead-of-time (AOT) kompileringsprosess konverterer koden til effektiv JavaScript før den kjøres i nettleseren, noe som reduserer belastningen ved runtime. Selv om ulike ytelsesmålinger kan vise forskjeller mellom de to, er disse forskjellene i praksis ofte vanskelig å se med det blotte øye.

Community og Økosystem

React har et enormt community og en rik samling av tredjepartsbiblioteker som gjør det enkelt å finne verktøy og løsninger på problemer. Angular har også et sterkt community og et godt støttet økosystem, men det kan være mer strukturert på grunn av sin natur som et fullverdig rammeverk.

Eksempelprosjekter

React er ofte brukt i prosjekter som krever rask utvikling og enkel integrering med andre biblioteker, som for eksempel dynamiske brukergrensesnitt for sosiale medier. Angular er godt egnet for store bedriftsapplikasjoner hvor en helhetlig struktur og sterke retningslinjer er nødvendige, som CRM-systemer og enterprise dashboards.

Konklusjon

For mange webutviklere tilhører man en av to leire: React eller Angular. Debatten om hvilket som er best pågår året rundt. Jeg har jobbet mye med begge, og alt peker på at de fungerer utmerket til små og store frontend-prosjekter. Jeg syns folk jeg har diskutert med alt for ofte har falt i fellen av å være for kategorisk når svarer om hva man syns fungerer best. Fra begge leire hører jeg krisemaksimering om den andres struktur og løsning. Sannheten er langt mer nyansert. Dessverre og heldigvis er det to konkurrenter på topp, som tvinger hverandre til å bli bedre for å opprettholde sin status.