Applicaties 6 min

Wat is een monorepo en wanneer gebruik je er een?

Kort antwoord

Een monorepo is een enkele git-repository waarin de code van meerdere applicaties, services of packages samen wordt opgeslagen, in plaats van elk onderdeel in een eigen repository. Wijzigingen aan gedeelde code zijn hierdoor direct zichtbaar voor alle projecten die ervan afhankelijk zijn. Grote techbedrijven zoals Google en Meta gebruiken monorepo's op enorme schaal, maar ook kleinere teams met een paar samenhangende projecten hebben er baat bij.

Een monorepo is een enkele coderepository waarin meerdere projecten of applicaties samen leven, met gedeelde tooling en versiebeheer.

Als je meerdere applicaties bouwt die met elkaar samenhangen, bijvoorbeeld een frontend, een backend-API en een gedeelde componentenbibliotheek, ontstaat al snel de vraag: zet je dat in aparte repositories of in één geheel? Die keuze bepaalt hoe soepel je team later kan samenwerken en releasen.

Waarom teams voor een monorepo kiezen

Het grootste voordeel van een monorepo is dat gedeelde code, zoals een designsysteem, een set TypeScript-types of een authenticatielaag, in één keer wordt aangepast en direct beschikbaar is voor alle projecten die deze gebruiken. Bij aparte repositories moet je een package publiceren, versienummers ophogen en die update handmatig doortrekken naar elk project. Dat kost tijd en leidt vaak tot projecten die op verschillende, verouderde versies van dezelfde gedeelde code blijven hangen.

Een monorepo maakt ook refactoren over projectgrenzen heen makkelijker. Verander je een functiesignatuur die door drie applicaties wordt gebruikt, dan zie je in één pull request meteen alle plekken die moeten meebewegen, in plaats van dat je losse pull requests moet coördineren in drie aparte repositories.

Wat een monorepo in de praktijk bevat

Een typische monorepo-structuur bestaat uit een map apps/ met de daadwerkelijke applicaties (bijvoorbeeld een webapp en een admin-dashboard) en een map packages/ met gedeelde bouwstenen (bijvoorbeeld een UI-component-bibliotheek, een API-client of gedeelde configuratie). Elk onderdeel heeft zijn eigen package.json, maar ze delen dezelfde git-geschiedenis, dezelfde issue-tracker en vaak dezelfde CI-pipeline.

Voor een team dat bijvoorbeeld werkt aan een SaaS-applicatie met een aparte marketingwebsite, kan het slim zijn om de gedeelde componenten (huisstijl, formulieren) in één packages-map te zetten, terwijl de applicatie en de website als aparte apps in dezelfde monorepo blijven.

Toolkeuze: Turborepo, Nx en workspaces

Naarmate een monorepo groeit, wordt de bouwtijd een probleem: waarom het hele project opnieuw builden als je maar één bestand hebt aangepast? Tools zoals Turborepo en Nx lossen dit op door alleen de gewijzigde projecten en hun afhankelijkheden opnieuw te bouwen, en door buildresultaten te cachen zodat een herhaalde build in seconden klaar is in plaats van minuten.

Voor package-beheer gebruik je workspaces: een functie van npm, pnpm of Yarn waarmee je binnen één repository meerdere package.json-bestanden kunt beheren en onderling naar elkaar kunt verwijzen zonder ze eerst te publiceren naar een package-registry. Voor een klein team met twee of drie projecten is dit vaak al voldoende, zonder dat je Turborepo of Nx nodig hebt.

Monorepo versus polyrepo: de afweging

Het alternatief, een polyrepo, geeft elk project zijn eigen repository met eigen versiebeheer, eigen toegangsrechten en een eigen CI/CD-pipeline. Dat is prettig als teams volledig onafhankelijk van elkaar willen werken en releasen, of als externe partijen alleen toegang mogen krijgen tot één specifiek onderdeel.

De praktische vuistregel: kies een monorepo als projecten sterk van elkaar afhankelijk zijn en door hetzelfde team worden onderhouden. Kies een polyrepo als projecten losstaand zijn, door verschillende teams worden beheerd, of een eigen releasecyclus nodig hebben. Voor de meeste MKB-projecten met één ontwikkelteam is een monorepo eenvoudiger te onderhouden dan een verzameling losse repositories die synchroon gehouden moeten worden.

Onze tip: begin klein. Zet niet meteen alles in een complexe monorepo-setup met Turborepo en Nx als je nog maar twee projecten hebt. Start met een eenvoudige map-structuur en npm- of pnpm-workspaces, en voeg pas zwaardere tooling toe zodra de buildtijden daadwerkelijk een probleem worden.

Veelgestelde vragen

Wat is het verschil tussen een monorepo en een polyrepo?

Bij een monorepo staat alle code van meerdere projecten in één repository met gedeelde geschiedenis en tooling. Bij een polyrepo (meerdere repositories) heeft elk project of elke service zijn eigen repository, eigen versienummer en eigen deployment-pipeline. Een polyrepo geeft meer isolatie tussen teams, een monorepo maakt het makkelijker om gedeelde code consistent te houden en in één keer aan te passen over projecten heen.

Is een monorepo hetzelfde als een monoliet?

Nee, dit zijn twee verschillende begrippen die vaak door elkaar worden gehaald. Een monoliet gaat over de architectuur van een applicatie: alle functionaliteit draait als één groot, onderling verweven programma. Een monorepo gaat over waar de broncode staat: in één repository. Je kunt prima meerdere losse, onafhankelijke services (microservices) hebben die allemaal in dezelfde monorepo staan, en omgekeerd kan een monoliet ook in zijn eigen aparte repository leven.

Welke tools gebruik je voor een monorepo?

Voor JavaScript en TypeScript zijn Turborepo en Nx populaire tools die builds cachen en alleen de projecten opnieuw bouwen die daadwerkelijk zijn veranderd. Voor package-beheer binnen een monorepo gebruik je workspaces, bijvoorbeeld via npm, pnpm of Yarn. Grotere organisaties gebruiken soms zwaardere tooling zoals Bazel. Voor een klein team met twee of drie samenhangende projecten volstaan vaak al pnpm workspaces zonder extra buildtooling.

Wanneer is een monorepo geen goed idee?

Een monorepo is minder geschikt als projecten volledig losstaan van elkaar, door verschillende teams met eigen releasecycli worden beheerd, of als je strikte toegangscontrole per project nodig hebt omdat externe partijen meewerken aan één onderdeel. In die gevallen geeft een polyrepo meer duidelijke scheiding van verantwoordelijkheid en toegang, ook al kost dat meer werk om gedeelde code synchroon te houden.

Hier over sparren?

Plan een vrijblijvend gesprek. We luisteren mee, schetsen een aanpak en geven een eerlijk beeld van wat haalbaar is, zonder verkoopdruk.