Teknologi & innovasjonPublisert: 22. august 202411 min lesing

Monorepo med Turborepo forklart — komplett norsk guide

Turborepo gjør monorepo-arkitektur tilgjengelig for alle. Lær hva monorepo er, hvordan Turbo cacher builds, og hvordan du strukturerer et workspace fra grunnen.

Norsk Næring
Norsk NæringRedaksjon
Monorepo samler all kode i ett repository og gjør deling av kode og verktøy dramatisk enklere.

Monorepo samler all kode i ett repository og gjør deling av kode og verktøy dramatisk enklere.

Komplett guide til monorepo med Turborepo: hva er monorepo vs polyrepo, turbo.json, build-caching, pipelines, workspace-struktur og Nx som alternativ.

Annonse

Monorepo vs Polyrepo — hva er egentlig forskjellen?

Et polyrepo-oppsett er det de fleste starter med: ett GitHub-repository per applikasjon eller tjeneste. Webappen er i `repo/frontend`, API-et er i `repo/backend`, og det delte komponentbiblioteket er i `repo/ui-components`. Dette er enkelt å starte med, men skalerer dårlig. Vil du gjøre en endring i et delt TypeScript-interface som både frontend og backend bruker, må du koordinere pull requests på tvers av tre repositories.

Et monorepo er det stikk motsatte: all kode ligger i ett repository, organisert i "packages" (også kalt workspaces). Webappen, API-et og komponentbiblioteket er alle i samme repo, og kan referere til hverandre direkte uten å publisere npm-pakker. Google, Meta og Microsoft bruker monorepo-arkitektur for sine massive kodebaser. Turborepo gjør dette tilgjengelig og håndterbart for teamstørrelser fra 2 til 200 utviklere.

Workspace-struktur — slik ser et Turborepo-prosjekt ut

En typisk Turborepo-struktur har to toppnivå-mapper: `apps/` og `packages/`. Under `apps/` finner du de deployerbare applikasjonene — for eksempel `apps/web` (Next.js-webapp) og `apps/api` (Express/Fastify API). Under `packages/` finner du delt kode: `packages/ui` (React-komponentbibliotek), `packages/config-typescript` (delt tsconfig), `packages/config-eslint` (delt ESLint-konfigurasjon) og `packages/utils` (delte hjelpefunksjoner). Roten av monorepoet har en `package.json` som definerer workspaces og installerer Turborepo.

  • apps/web — Next.js eller Vite-webapp
  • apps/api — Node.js/Express/Fastify backend
  • apps/docs — Dokumentasjonsside (f.eks. Docusaurus)
  • packages/ui — Delt React-komponentbibliotek
  • packages/utils — Delte TypeScript-hjelpefunksjoner
  • packages/config-typescript — Delt tsconfig.json
  • packages/config-eslint — Delt ESLint-konfigurasjon

turbo.json — hjertet i Turborepo

Filen `turbo.json` i roten av monorepoet definerer pipelinen — hvilke oppgaver som finnes, hvilken rekkefølge de kjøres i, og hvilke outputs som skal caches. En grunnleggende konfigurasjon definerer tasks: `build` med `dependsOn: ["^build"]` (betyr: kjør build i alle avhengigheter først), `lint` uten avhengigheter, og `dev` med `cache: false` (utvikling caches ikke).

Nøkkelpunktet: `dependsOn: ["^build"]`-syntaksen er kraftig. Prefixet `^` betyr "i alle pakker dette pakket avhenger av". Så om `apps/web` avhenger av `packages/ui`, sikrer `^build` at `packages/ui` alltid bygges før `apps/web`. Turbo analyserer dependency-grafen automatisk og paralleliserer alt som kan kjøres parallelt.

Annonse

Caching — Turborepos killer-funksjon

Turborepo cacher output fra oppgaver basert på en hash av: all kildekode i pakken, alle avhengigheter (node_modules), miljøvariabler (konfigurerbart) og turbo.json-konfigurasjonen. Om ingen av disse har endret seg siden siste kjøring, gjenbruker Turbo den cachede outputen direkte — uten å kjøre oppgaven på nytt. Remote Caching via Vercel lar hele teamet dele cache: om én CI-instans har bygget en pakke, kan en annen utvikler eller CI-kjøring laste ned den cachede outputen istedenfor å bygge på nytt. I store monorepoer kan dette redusere byggetider fra 20 minutter til under 2 minutter.

Lokal cache-lokasjon.turbo/cache i roten av monorepoet
Remote CacheVercel Remote Cache (gratis med Vercel-konto)
Cache-treff indikator">>> FULL TURBO" i terminal-output
Gjennomsnittlig byggetids-reduksjon40–90 % ved gjentatte bygg
Egendriftet Remote CacheMulig med ducktape, turborepo-remote-cache eller Vercel

Nx — det kraftigere, mer komplekse alternativet

Nx er det andre store monorepo-verktøyet. Der Turborepo er enkelt og fokusert på å gjøre eksisterende npm-workspaces raskt, er Nx et fullverdig orkestreringsverktøy med kodegenerering, konfigurerbare preset-arkitekturer og et grafisk dependency-visualiseringsverktøy. Nx Crystal og Nx Cloud tilbyr lignende remote caching som Turborepo.

Nx er et bedre valg om du vil ha scaffolding-verktøy (generere nye apps og biblioteker fra maler), sterk integrering med Angular, eller en sentralt administrert monorepo-arkitektur. Turborepo er bedre om du har et eksisterende prosjekt du vil konvertere til monorepo med minimal konfigurasjon, eller om du foretrekker et verktøy som "forsvinner" og lar deg bruke vanlige npm-scripts.

Kom i gang — sett opp Turborepo på 10 minutter

Raskeste vei til et fungerende Turborepo-oppsett: `npx create-turbo@latest`. Dette setter opp en komplett monorepo med Next.js-webapp, Vite-komponentbibliotek og delte konfigurasjoner. Alternativt, om du vil legge til Turbo i et eksisterende prosjekt: installer med `npm install -D turbo`, legg til `turbo.json`, og konfigurer workspaces i rot-`package.json` med `"workspaces": ["apps/*", "packages/*"]`.

For norske utviklingsteam som vurderer monorepo: start i det små. Ta to eksisterende repos som deler kode (for eksempel en frontend og et delt komponentbibliotek) og legg dem i et Turborepo-monorepo. Evaluer erfaringen over 4–6 uker. De aller fleste team som gjør dette eksperimentet rapporterer at de aldri vil tilbake til polyrepo for prosjekter med delt kode.

Annonse

Ofte stilte spørsmål

Hva handler «Monorepo med Turborepo forklart — komplett norsk guide» om?

Komplett guide til monorepo med Turborepo: hva er monorepo vs polyrepo, turbo.json, build-caching, pipelines, workspace-struktur og Nx som alternativ.

Monorepo vs Polyrepo — hva er egentlig forskjellen?

Et polyrepo-oppsett er det de fleste starter med: ett GitHub-repository per applikasjon eller tjeneste. Webappen er i `repo/frontend`, API-et er i `repo/backend`, og det delte komponentbiblioteket er i `repo/ui-components`. Dette er enkelt å starte med, men skalerer dårlig. Vil du gjøre en endring i et delt TypeScript-interface som både frontend og backend bruker, må du koordinere pull requests på tvers av tre repositories.

Hva bør du vite om workspace-struktur — slik ser et Turborepo-prosjekt ut?

En typisk Turborepo-struktur har to toppnivå-mapper: `apps/` og `packages/`. Under `apps/` finner du de deployerbare applikasjonene — for eksempel `apps/web` (Next.js-webapp) og `apps/api` (Express/Fastify API). Under `packages/` finner du delt kode: `packages/ui` (React-komponentbibliotek), `packages/config-typescript` (delt tsconfig), `packages/config-eslint` (delt ESLint-konfigurasjon) og `packages/utils` (delte hjelpefunksjoner). Roten av monorepoet har en `package.json` som definerer workspaces og installerer Turborepo.

Hva bør du vite om turbo.json — hjertet i Turborepo?

Filen `turbo.json` i roten av monorepoet definerer pipelinen — hvilke oppgaver som finnes, hvilken rekkefølge de kjøres i, og hvilke outputs som skal caches. En grunnleggende konfigurasjon definerer tasks: `build` med `dependsOn: ["^build"]` (betyr: kjør build i alle avhengigheter først), `lint` uten avhengigheter, og `dev` med `cache: false` (utvikling caches ikke).

Hva bør du vite om caching — Turborepos killer-funksjon?

Turborepo cacher output fra oppgaver basert på en hash av: all kildekode i pakken, alle avhengigheter (node_modules), miljøvariabler (konfigurerbart) og turbo.json-konfigurasjonen. Om ingen av disse har endret seg siden siste kjøring, gjenbruker Turbo den cachede outputen direkte — uten å kjøre oppgaven på nytt. Remote Caching via Vercel lar hele teamet dele cache: om én CI-instans har bygget en pakke, kan en annen utvikler eller CI-kjøring laste ned den cachede outputen istedenfor å bygge på nytt. I store monorepoer kan dette redusere byggetider fra 20 minutter til under 2 minutter.

Hva bør du vite om nx — det kraftigere, mer komplekse alternativet?

Nx er det andre store monorepo-verktøyet. Der Turborepo er enkelt og fokusert på å gjøre eksisterende npm-workspaces raskt, er Nx et fullverdig orkestreringsverktøy med kodegenerering, konfigurerbare preset-arkitekturer og et grafisk dependency-visualiseringsverktøy. Nx Crystal og Nx Cloud tilbyr lignende remote caching som Turborepo.

Norsk Næring
Skrevet avNorsk NæringRedaksjon

Norsk Næring er en del av redaksjonen i Norsk Næring og dekker teknologi & innovasjon. Redaksjonen kvalitetssikrer alt innhold mot oppdaterte og pålitelige kilder.

Redaksjonell merknad: Dette innholdet er utarbeidet av Norsk Næring med hjelp av kunstig intelligens og kvalitetssikret av redaksjonen. Informasjonen er ment som generell veiledning og erstatter ikke profesjonell rådgivning. Feil eller unøyaktigheter? Kontakt oss på help@norsknæring.no.