Tree shaking is een vorm van dead code elimination die wordt toegepast tijdens het build-proces van JavaScript-applicaties. De term is afgeleid van de metafoor waarbij een boom wordt geschud om dode bladeren te verwijderen - in dit geval wordt de code-'boom' geanalyseerd om ongebruikte modules en functies te identificeren en te verwijderen.
Deze techniek maakt gebruik van de statische structuur van ES6 module syntax (import en export statements) om te bepalen welke delen van de code daadwerkelijk worden gebruikt in de applicatie. Alleen de code die expliciet wordt geïmporteerd en gebruikt, wordt opgenomen in de uiteindelijke bundle.
Hoe werkt tree shaking?
Tree shaking werkt door middel van statische code-analyse tijdens het bundelen. Moderne bundlers zoals Webpack, Rollup en Vite analyseren de import- en export-statements in je code om een afhankelijkheidsgrafiek op te bouwen. Vervolgens worden alle exports die niet worden geïmporteerd of gebruikt, gemarkeerd als 'dode code' en weggelaten uit de productie-build.
Dit proces is alleen mogelijk met ES6 modules omdat deze een statische structuur hebben - alle imports en exports zijn bekend tijdens compile-time, in tegenstelling tot CommonJS modules die dynamisch kunnen zijn.
Voordelen van tree shaking
- Kleinere bundel-grootte: Door ongebruikte code te verwijderen, wordt de totale bestandsgrootte significant verkleind
- Snellere laadtijden: Kleinere bestanden betekenen snellere downloads en betere performance
- Verbeterde gebruikerservaring: Snellere applicaties leiden tot hogere tevredenheid en betere conversies
- Lagere bandbreedte-kosten: Minder data-overdracht bespaart kosten voor zowel ontwikkelaars als gebruikers
- Betere code-kwaliteit: Stimuleert ontwikkelaars om modulaire, herbruikbare code te schrijven
Vereisten voor effectieve tree shaking
Om optimaal van tree shaking te profiteren, moeten bepaalde voorwaarden worden vervuld:
- Gebruik van ES6 module syntax (import/export) in plaats van CommonJS (require/module.exports)
- Een moderne bundler die tree shaking ondersteunt (Webpack 2+, Rollup, Vite, esbuild)
- Production mode configuratie in de bundler
- Libraries en dependencies die ook ES6 modules gebruiken
- Vermijd side effects in modules of markeer ze expliciet in package.json
