React Native Nieuwe Architectuur 2026: Gids voor JSI, Fabric en TurboModules

Ontdek hoe JSI, Fabric, TurboModules en Bridgeless Mode React Native transformeren in 2026. Met prestatiebenchmarks, codevoorbeelden en een praktische migratiehandleiding.

React Native heeft sinds de lancering in 2015 een behoorlijk indrukwekkende reis afgelegd. Wat ooit begon als een experiment bij Facebook is uitgegroeid tot een van de populairste cross-platform tools voor app-ontwikkeling. Maar eerlijk gezegd, onder de motorkap zat er jarenlang een fundamenteel probleem: de beruchte bridge. In 2026 kunnen we gerust zeggen dat het tijdperk van de bridge voorbij is. Met React Native 0.76 (uitgebracht in oktober 2024) werd de Nieuwe Architectuur officieel stabiel verklaard, en sindsdien is de adoptie enorm snel gegaan — zo'n 83% van alle Expo SDK 54-projecten draait inmiddels op de Nieuwe Architectuur.

In deze gids nemen we je mee door alles wat je moet weten over de Nieuwe Architectuur. We duiken in de vier pilaren — JSI, Fabric, TurboModules en Codegen — en behandelen Bridgeless Mode, de Hermes-engine, concrete benchmarks en een praktische migratiehandleiding. Of je nu een bestaande app wilt upgraden of helemaal opnieuw begint: na dit artikel heb je een helder beeld van waar React Native naartoe gaat.

Wat was er mis met de oude architectuur?

Om te snappen waarom de Nieuwe Architectuur zo'n grote deal is, moeten we even terugkijken. De originele architectuur draaide om een concept dat bekendstaat als de bridge — een asynchroon communicatiekanaal tussen de JavaScript-thread en de native thread.

Het JSON-serialisatieknelpunt

Elke keer dat JavaScript met native code moest praten — het renderen van een view, het aanroepen van een module, het afhandelen van een touch-event — moest alle data worden geserialiseerd naar JSON, over de bridge gestuurd, en aan de andere kant weer gedeserialiseerd. Dat was traag. Stel je voor dat je bij elke functieaanroep eerst een brief moet schrijven, naar het postkantoor moet brengen, en dan moet wachten op antwoord. Dat was in feite wat de bridge deed, en het voelde ook zo.

// Oude architectuur: zo verliep communicatie via de bridge
// Stap 1: JavaScript stuurt een bericht
const bericht = JSON.stringify({
  module: 'UIManager',
  methode: 'createView',
  args: [tagId, 'RCTView', rootTag, { backgroundColor: '#ff0000' }]
});

// Stap 2: Bericht gaat via de bridge (asynchroon)
// bridge.sendMessage(bericht) → wacht... → native ontvangt

// Stap 3: Native deserialiseert het bericht
// const data = JSON.parse(bericht);
// UIManager.createView(data.args);

Alleen asynchrone communicatie

De bridge was per definitie asynchroon. JavaScript kon dus nooit even snel iets opvragen van de native kant en daar direct antwoord op krijgen. Voor simpele dingen — schermafmetingen ophalen, een klembordwaarde uitlezen, een layout-berekening doen — was dit best frustrerend. Overal moest je callbacks of promises gebruiken, zelfs voor operaties die eigenlijk triviaal zouden moeten zijn.

Geen concurrent rendering

De oude architectuur was simpelweg niet ontworpen voor React 18's concurrent rendering. Doordat alle UI-updates via de asynchrone bridge moesten, kon je geen meerdere render-prioriteiten ondersteunen. Het resultaat? Zware UI-updates blokkeerden de hele interface, wat leidde tot merkbare haperingen — vooral op minder krachtige Android-toestellen.

Opstarttijd en geheugengebruik

Bij het opstarten moesten alle native modules worden geïnitialiseerd, of je ze nu nodig had of niet. Een app met twintig native modules die er bij het eerste scherm maar drie nodig had, laadde toch alles. Niet ideaal, om het zacht uit te drukken.

De vier pilaren van de Nieuwe Architectuur

De Nieuwe Architectuur is opgebouwd rondom vier pilaren die samen het volledige communicatie- en renderingmodel vervangen:

  1. JavaScript Interface (JSI) — Een lichtgewicht C++-laag die JavaScript directe toegang geeft tot native objecten, zonder serialisatie of bridge.
  2. Fabric — Een volledig herschreven rendering engine met een C++ Shadow Tree en ondersteuning voor concurrent rendering.
  3. TurboModules — Het nieuwe systeem voor native modules: lazy loading, typeveiligheid en directe JSI-aanroepen.
  4. Codegen — Een code-generator die TypeScript- of Flow-specs omzet naar type-veilige native interfaces.

Samen elimineren deze vier pilaren de bridge volledig en maken ze React Native fundamenteel sneller en efficiënter. Laten we ze stuk voor stuk bekijken.

JavaScript Interface (JSI) uitgelegd

JSI is het fundament van de hele Nieuwe Architectuur. Het is een dunne C++-laag die fungeert als universele interface tussen de JavaScript-engine en native code. In plaats van berichten te serialiseren en via een bridge te versturen, maakt JSI het mogelijk dat JavaScript rechtstreeks verwijzingen naar C++-objecten vasthoudt en methoden daarop aanroept.

Dat klinkt misschien abstract, dus laten we het concreet maken.

Hoe JSI de bridge vervangt

Met JSI worden native objecten blootgesteld als Host Objects in de JavaScript-runtime. JavaScript kan deze objecten benaderen alsof het gewone JavaScript-objecten zijn, maar achter de schermen worden methodeaanroepen direct doorgestuurd naar C++. Geen serialisatie, geen asynchrone wachttijd, geen bridge.

// Oude architectuur: bridge-gebaseerde native aanroep
// Asynchroon, JSON-serialisatie, traag
import { NativeModules } from 'react-native';
const { FancyMath } = NativeModules;

// Dit gaat via de bridge — altijd een Promise
const resultaat = await FancyMath.vermenigvuldig(3, 7);
console.log(resultaat); // 21 (na asynchrone wachttijd)
// Nieuwe architectuur: directe JSI-aanroep
// Synchroon, geen serialisatie, ~30x sneller
import { getFancyMath } from './NativeFancyMath';

const fancyMath = getFancyMath();

// Dit is een directe C++ aanroep via JSI — synchroon!
const resultaat = fancyMath.vermenigvuldig(3, 7);
console.log(resultaat); // 21 (onmiddellijk beschikbaar)

Het verschil is enorm. De oude bridge had gemiddeld honderden microseconden nodig per aanroep vanwege de serialisatie-overhead. JSI doet hetzelfde in een fractie van die tijd. Benchmarks laten zien dat native module-aanroepen via JSI tot 30 keer sneller zijn.

C++ Host Objects

Een Host Object is eigenlijk een C++-object dat via JSI aan JavaScript wordt blootgesteld. Het implementeert de jsi::HostObject-interface en kan properties en methoden definiëren die je vanuit JavaScript kunt aanroepen. Het mooie hiervan is dat het de deur opent naar gedeeld geheugen tussen JavaScript en native code — iets dat met de oude bridge gewoon onmogelijk was.

// Voorbeeld van een C++ Host Object (vereenvoudigd)
#include <jsi/jsi.h>

using namespace facebook::jsi;

class WiskundeModule : public HostObject {
public:
  Value get(Runtime& runtime, const PropNameID& naam) override {
    auto methodeNaam = naam.utf8(runtime);

    if (methodeNaam == "vermenigvuldig") {
      // Retourneer een functie die direct vanuit JS aangeroepen kan worden
      return Function::createFromHostFunction(
        runtime,
        PropNameID::forAscii(runtime, "vermenigvuldig"),
        2, // aantal argumenten
        [](Runtime& runtime, const Value& thisVal,
           const Value* args, size_t count) -> Value {
          double a = args[0].asNumber();
          double b = args[1].asNumber();
          return Value(a * b); // Direct resultaat, geen bridge
        }
      );
    }
    return Value::undefined();
  }
};

Engine-onafhankelijkheid

Een fijn bijkomend voordeel: JSI maakt React Native onafhankelijk van een specifieke JavaScript-engine. Waar het framework vroeger sterk gekoppeld was aan JavaScriptCore, fungeert JSI als abstractielaag. Dit heeft de integratie van Hermes als standaard-engine mogelijk gemaakt, en opent in de toekomst de deur naar engines zoals V8.

Fabric: de nieuwe rendering engine

Fabric is de volledig herschreven rendering engine van React Native. Het vervangt het oude UIManager-systeem en introduceert een fundamenteel nieuw renderingmodel. De kern? Een onveranderlijke (immutable) Shadow Tree die volledig in C++ leeft.

De Shadow Tree in C++

In de oude architectuur werd de Shadow Tree beheerd via asynchrone bridge-communicatie. Layout-berekeningen (via Yoga, de layout-engine) vonden plaats op een aparte thread, en updates moesten heen en weer via de bridge. In Fabric bestaat de Shadow Tree volledig in C++ en is die direct toegankelijk vanuit zowel JavaScript (via JSI) als native code. Dat elimineert de overhead en maakt synchrone layout-berekeningen mogelijk.

Concurrent rendering

Dit is eerlijk gezegd een van de meest indrukwekkende aspecten van Fabric: ondersteuning voor concurrent rendering uit React 18. Hiermee kan React meerdere versies van de UI-boom tegelijk voorbereiden en prioriteiten toekennen. Een gebruikersinput krijgt hogere prioriteit dan een achtergrond-dataverversing, waardoor de interface altijd responsief aanvoelt.

Met de oude bridge was dit gewoon niet mogelijk. Alle communicatie was asynchroon en serieel, dus React kon geen meerdere render-passages tegelijk beheren. Fabric lost dit op door de Shadow Tree immutable te maken — elke update creëert een nieuwe versie van de boom, en React kan vrij schakelen tussen versies zonder race conditions.

Een Fabric-component in de praktijk

Het goede nieuws: voor de meeste ontwikkelaars verandert er aan de dagelijkse workflow verrassend weinig. React Native-componenten werken in Fabric nagenoeg hetzelfde. Het verschil zit in de onderliggende prestaties. Hier is een voorbeeld dat profiteert van concurrent rendering:

import React, { useTransition, useState, useCallback } from 'react';
import {
  View,
  Text,
  FlatList,
  TextInput,
  StyleSheet,
  ActivityIndicator,
} from 'react-native';

// Fabric maakt concurrent rendering mogelijk via useTransition
export function ProductZoeker({ producten }: { producten: Product[] }) {
  const [zoekterm, setZoekterm] = useState('');
  const [gefilterdeProducten, setGefilterdeProducten] = useState(producten);
  const [isPending, startTransition] = useTransition();

  const handleZoekInput = useCallback((tekst: string) => {
    // Directe update: invoerveld reageert onmiddellijk
    setZoekterm(tekst);

    // Uitgestelde update: filtering op lagere prioriteit
    // Dankzij Fabric blokkeert dit de UI niet
    startTransition(() => {
      const resultaten = producten.filter(
        (p) =>
          p.naam.toLowerCase().includes(tekst.toLowerCase()) ||
          p.beschrijving.toLowerCase().includes(tekst.toLowerCase())
      );
      setGefilterdeProducten(resultaten);
    });
  }, [producten]);

  return (
    <View style={styles.container}>
      <TextInput
        style={styles.zoekVeld}
        value={zoekterm}
        onChangeText={handleZoekInput}
        placeholder="Zoek producten..."
      />
      {isPending && <ActivityIndicator size="small" color="#007AFF" />}
      <FlatList
        data={gefilterdeProducten}
        keyExtractor={(item) => item.id}
        renderItem={({ item }) => (
          <View style={styles.productKaart}>
            <Text style={styles.productNaam}>{item.naam}</Text>
            <Text style={styles.productPrijs}>€{item.prijs.toFixed(2)}</Text>
          </View>
        )}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, padding: 16 },
  zoekVeld: {
    height: 44,
    borderWidth: 1,
    borderColor: '#ddd',
    borderRadius: 8,
    paddingHorizontal: 12,
    marginBottom: 12,
  },
  productKaart: {
    padding: 16,
    borderBottomWidth: 1,
    borderBottomColor: '#eee',
  },
  productNaam: { fontSize: 16, fontWeight: '600' },
  productPrijs: { fontSize: 14, color: '#666', marginTop: 4 },
});

In dit voorbeeld zorgt useTransition ervoor dat het typen altijd responsief blijft, ook bij duizenden producten. Onder de oude architectuur zou dit tot merkbare vertraging leiden; met Fabric is de ervaring gewoon vloeiend.

TurboModules: native modules heruitgevonden

TurboModules vervangen het oude Native Modules-systeem en pakken drie kernproblemen aan: geen lazy loading, geen typeveiligheid, en trage bridge-communicatie.

Lazy loading

Vroeger werden alle native modules bij het opstarten geladen. TurboModules worden pas geïnitialiseerd wanneer je ze daadwerkelijk aanroept. Heb je een QR-code scanner die de gebruiker pas na vijf schermen bereikt? Dan wordt die module ook pas op dat moment geladen. Het effect op de opstarttijd is direct meetbaar.

Typeveiligheid via Codegen

TurboModules gebruiken Codegen om typeveilige interfaces te genereren. Je schrijft een specificatiebestand (spec file) in TypeScript of Flow, en Codegen genereert de bijbehorende native code. Zo weet je zeker dat JavaScript en native altijd synchroon lopen — fouten worden bij het bouwen gevonden, niet in productie.

Let op: Codegen-specs moeten worden geprefixed met Native. Een module genaamd FancyMath krijgt dus het bestand NativeFancyMath.ts.

// NativeFancyMath.ts — TurboModule specificatiebestand
// Bestandsnaam MOET beginnen met "Native" voor Codegen
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

// Definieer de interface van de native module
export interface Spec extends TurboModule {
  // Synchrone methode — mogelijk dankzij JSI!
  vermenigvuldig(a: number, b: number): number;

  // Asynchrone methode voor zwaardere operaties
  berekenPriemgetallen(limiet: number): Promise<number[]>;

  // Constanten die bij initialisatie beschikbaar zijn
  getConstants(): {
    maximaleWaarde: number;
    versie: string;
  };

  // Methode met een callback
  registreerVoortgangListener(
    callback: (voortgang: number) => void
  ): void;
}

// Verkrijg de module via het TurboModuleRegistry
export default TurboModuleRegistry.getEnforcing<Spec>(
  'FancyMath'
);

Wanneer je dit door Codegen haalt, genereert het automatisch:

  • Een C++-header met de abstracte klasse die je native module moet implementeren
  • Objective-C++ of Java/Kotlin boilerplate voor het registreren van de module
  • Type-definities die compilatiefouten geven bij een mismatch

De native implementatie

Benieuwd hoe dat er dan uitziet aan de native kant? Hier is een vereenvoudigde Android-implementatie in Kotlin:

// FancyMathModule.kt — Android (Kotlin) implementatie
package com.mijnapp.modules

import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.module.annotations.ReactModule

// Overerft van de door Codegen gegenereerde abstracte klasse
@ReactModule(name = FancyMathModule.NAME)
class FancyMathModule(
  reactContext: ReactApplicationContext
) : NativeFancyMathSpec(reactContext) {

  companion object {
    const val NAME = "FancyMath"
  }

  override fun getName(): String = NAME

  // Synchrone methode — direct via JSI, geen bridge
  override fun vermenigvuldig(a: Double, b: Double): Double {
    return a * b
  }

  // Asynchrone methode met Promise
  override fun berekenPriemgetallen(limiet: Double, promise: Promise) {
    Thread {
      val priemgetallen = mutableListOf<Int>()
      for (getal in 2..limiet.toInt()) {
        if (isPriem(getal)) priemgetallen.add(getal)
      }
      promise.resolve(priemgetallen.toWritableArray())
    }.start()
  }

  override fun getTypedExportedConstants(): Map<String, Any> {
    return mapOf(
      "maximaleWaarde" to Double.MAX_VALUE,
      "versie" to "2.1.0"
    )
  }

  private fun isPriem(n: Int): Boolean {
    if (n < 2) return false
    for (i in 2..Math.sqrt(n.toDouble()).toInt()) {
      if (n % i == 0) return false
    }
    return true
  }
}

Directe JSI-aanroepen

Het grootste verschil met het oude systeem? TurboModules communiceren via JSI in plaats van de bridge. Dat maakt synchrone aanroepen mogelijk — iets dat vroeger simpelweg niet kon. De methode vermenigvuldig hierboven retourneert direct een waarde. Geen Promise, geen callback, geen wachttijd. Voor veel scenario's vereenvoudigt dit de code aanzienlijk.

Bridgeless Mode

Bridgeless Mode is de logische eindbestemming van de Nieuwe Architectuur: de bridge wordt niet alleen overbodig gemaakt, maar volledig verwijderd uit de runtime.

Wat houdt Bridgeless Mode precies in?

Er is simpelweg geen RCTBridge-instantie meer. Alle communicatie loopt via JSI. De voordelen zijn behoorlijk concreet:

  • Lager geheugengebruik: De bridge-infrastructuur kostte geheugen. Zonder die overhead zie je een reductie van 20% tot 30%.
  • Snellere opstart: Het initialiseren van de bridge was een van de duurste operaties bij het opstarten. In combinatie met lazy loading van TurboModules kan de opstarttijd tot 40% verbeteren.
  • Simpeler model: Minder code, minder foutbronnen, minder complexiteit om over na te denken.

Standaard sinds React Native 0.74

Bridgeless Mode is de standaard sinds React Native 0.74. Nieuwe projecten draaien er automatisch op. Voor bestaande projecten die migreren: weet dat de oude bridge-API's geleidelijk worden uitgefaseerd. Bibliotheken die nog afhankelijk zijn van RCTBridge moeten worden bijgewerkt of vervangen.

De interop-laag

Om de overgang te versoepelen is er een interop-laag die oude bridge-modules laat functioneren binnen de Nieuwe Architectuur. Dit is nadrukkelijk een tijdelijke oplossing — de laag simuleert de bridge-interface bovenop JSI, dus oudere modules blijven werken, maar dan wel zonder de volledige prestatiewinst van een echte TurboModule.

Hermes en de Nieuwe Architectuur

Hermes is de JavaScript-engine die speciaal voor React Native is gebouwd. Waar V8 en JavaScriptCore zijn geoptimaliseerd voor browsers, is Hermes vanaf de grond af ontworpen voor mobiel — waar geheugen, opstarttijd en batterijverbruik echt tellen.

Hermes V1 in React Native 0.82

Met React Native 0.82 kwam Hermes V1, een flinke update. De belangrijkste verbeteringen:

  • Time to Interactive (TTI): Zo'n 2,5% beter op iOS en circa 7,6% op Android. Dat klinkt bescheiden, maar op apparaten waar elke milliseconde telt, is het welkom bovenop de winsten van de Nieuwe Architectuur zelf.
  • Betere garbage collection: Hermes V1 heeft een verfijnde garbage collector die pauzes minimaliseert. Dat draagt bij aan een consistentere framerate.
  • Diepere JSI-integratie: De engine werkt nauwer samen met JSI, waardoor de overhead van native aanroepen nog verder daalt.

De visie van Static Hermes

Een van de meest spannende ontwikkelingen is Static Hermes — een experimentele uitbreiding die TypeScript-types gebruikt om geoptimaliseerde bytecode te genereren. In plaats van types te negeren bij compilatie (zoals standaard JS-engines doen), kan Static Hermes type-informatie benutten voor efficiëntere machine-instructies. Het is in 2026 nog in ontwikkeling, maar vroege benchmarks zijn veelbelovend.

// Met Static Hermes kan de compiler optimaliseren op basis van types
// Deze functie kan direct naar efficiënte machine-instructies worden gecompileerd

function berekenAfstand(
  x1: number, y1: number,
  x2: number, y2: number
): number {
  // Static Hermes weet dat alle waarden numbers zijn
  // en kan directe floating-point instructies genereren
  const dx: number = x2 - x1;
  const dy: number = y2 - y1;
  return Math.sqrt(dx * dx + dy * dy);
}

// Zonder Static Hermes: dynamische type-checks bij elke operatie
// Met Static Hermes: directe numerieke berekening, vergelijkbaar met C++

Bytecode-voorcompilatie

Hermes compileert JavaScript naar bytecode tijdens de bouwfase, niet op het apparaat. De app voert bij het opstarten dus direct geoptimaliseerde bytecode uit in plaats van eerst JavaScript te moeten parsen en compileren. Gecombineerd met lazy loading en het wegvallen van de bridge levert dit de indrukwekkende opstartverbeteringen op die we hieronder bespreken.

Prestatiebenchmarks

Theorie is leuk, maar uiteindelijk gaat het om de cijfers. En die zijn behoorlijk overtuigend.

Opstarttijd

Op een mid-range Android-toestel (vergelijkbaar met een Samsung Galaxy A54) zijn de volgende metingen gedaan voor een representatieve productie-app:

  • Cold start (oud): gemiddeld 3200 ms
  • Cold start (nieuw): gemiddeld 1800 ms
  • Verbetering: 43% sneller — 1,4 seconde verschil dat gebruikers direct merken

Op high-end apparaten is het absolute verschil kleiner, maar procentueel nog steeds flink. Op iOS liggen de verbeteringen typisch tussen 25% en 35%.

Geheugengebruik

Door het wegvallen van de bridge en lazy loading van TurboModules daalt het geheugengebruik met 20% tot 30%. Dat is vooral merkbaar op toestellen met beperkt werkgeheugen, waar het verschil kan bepalen of je app in het geheugen blijft of door het OS wordt afgesloten.

Native module-aanroepen

Hier zit de meest dramatische verbetering. Door de overstap van JSON-serialisatie naar directe JSI-aanroepen zijn native module-calls tot 30 keer sneller. Voor apps die veel met native code communiceren — denk aan AR, beeldverwerking of real-time sensorsignalen — is dit een gamechanger.

Framerate-consistentie

Met Fabric en concurrent rendering haalt React Native nu consistent 60 fps, ook tijdens zware operaties zoals het scrollen door lange lijsten terwijl data op de achtergrond wordt geladen. Op 120Hz-schermen (recente iPhones, Galaxy S-modellen) wordt ook 120fps ondersteund voor geschikte animaties.

Overzichtstabel

// Prestatie-overzicht: Oude vs. Nieuwe Architectuur
//
// Metriek                    | Oud       | Nieuw     | Verbetering
// ------------------------------------------------------------------
// Cold start (mid-range)     | 3200 ms   | 1800 ms   | 43% sneller
// Geheugengebruik            | Baseline  | -20-30%   | Significant
// Native module aanroepen    | ~300 μs   | ~10 μs    | ~30x sneller
// Framerate (zware UI)       | 45-55 fps | 58-60 fps | Consistent 60fps
// TTI verbetering (Android)  | Baseline  | -7.6%     | Hermes V1
// TTI verbetering (iOS)      | Baseline  | -2.5%     | Hermes V1
// Opstarttijd (algemeen)     | Baseline  | -40%      | Tot 40% sneller

Migratie naar de Nieuwe Architectuur

De migratie is in 2026 een stuk eenvoudiger dan een paar jaar geleden. Voor Expo-gebruikers is het vaak letterlijk één instelling. Voor bare React Native-projecten is er wat meer werk, maar alles is goed gedocumenteerd.

Migratie voor Expo-projecten

Gebruik je Expo? Dan heb je geluk. Het inschakelen van de Nieuwe Architectuur is bijzonder eenvoudig. Alle expo-*-pakketten ondersteunen het sinds SDK 53, en bij SDK 54 draait 83% van de projecten er al op.

// app.json — Nieuwe Architectuur inschakelen in Expo
{
  "expo": {
    "name": "MijnApp",
    "slug": "mijn-app",
    "version": "1.0.0",
    "sdkVersion": "54.0.0",
    "newArchEnabled": true,
    "ios": {
      "bundleIdentifier": "nl.mijnapp.app"
    },
    "android": {
      "package": "nl.mijnapp.app"
    }
  }
}

Na het aanpassen van app.json doe je een nieuwe prebuild:

# Verwijder bestaande native mappen en genereer opnieuw
npx expo prebuild --clean

# Start de app op iOS
npx expo run:ios

# Of start de app op Android
npx expo run:android

Migratie voor bare React Native-projecten

Zonder Expo zijn er een paar extra stappen nodig. Eerst schakel je de Nieuwe Architectuur in via de projectconfiguratie:

// react-native.config.js — Nieuwe Architectuur inschakelen
module.exports = {
  project: {
    ios: {},
    android: {},
  },
  // Activeer de Nieuwe Architectuur
  newArchEnabled: true,
};

Daarna werk je de native afhankelijkheden bij:

# iOS: Installeer pods met de Nieuwe Architectuur-vlag
cd ios
RCT_NEW_ARCH_ENABLED=1 bundle exec pod install
cd ..

# Android: Activeer via gradle.properties
# Zorg dat deze regel aanwezig is:
# newArchEnabled=true

# Verifieer de instelling
grep "newArchEnabled" android/gradle.properties

Controleren of de Nieuwe Architectuur actief is

Na het inschakelen wil je natuurlijk verifiëren dat alles werkt. Hier is een handig hulpmiddel:

// utils/architectuurCheck.ts
import { Platform } from 'react-native';

// Controleer of de Nieuwe Architectuur actief is
export function isNieuweArchitectuurActief(): boolean {
  const isFabricActief =
    !!(global as any)?._IS_FABRIC;
  const isTurboModulesActief =
    !!(global as any)?.__turboModuleProxy;

  return isFabricActief || isTurboModulesActief;
}

// Gebruik in een debug-scherm
export function toonArchitectuurInfo(): string {
  const nieuwArch = isNieuweArchitectuurActief();
  const engine = (global as any).HermesInternal
    ? 'Hermes'
    : 'JavaScriptCore';

  return `Platform: ${Platform.OS}
Nieuwe Architectuur: ${nieuwArch ? 'Actief' : 'Inactief'}
JS Engine: ${engine}
React Native: ${Platform.constants?.reactNativeVersion
    ? `${Platform.constants.reactNativeVersion.major}.${Platform.constants.reactNativeVersion.minor}`
    : 'Onbekend'}`;
}

Veelvoorkomende problemen en oplossingen

De migratie verloopt niet altijd vlekkeloos — dat is nu eenmaal de realiteit. Hier zijn de problemen waar ontwikkelaars het vaakst tegenaan lopen, en hoe je ze oplost.

1. Incompatibele bibliotheken

Het meest voorkomende probleem: een library ondersteunt de Nieuwe Architectuur nog niet. Dit uit zich in bouwfouten of runtime crashes.

Oplossing: Check de compatibiliteit via de React Native Directory. De meeste populaire bibliotheken ondersteunen het inmiddels, en de interop-laag vangt veel op. Scan je project met:

# Controleer compatibiliteit van je afhankelijkheden
npx react-native-new-arch-check

# Of voor Expo-projecten
npx expo-doctor

2. Pod install mislukt op iOS

pod install kan mislukken door verouderde caches of conflicterende versies.

Oplossing: Een schone installatie werkt bijna altijd:

# Verwijder caches en herinstalleer
cd ios
rm -rf Pods Podfile.lock build
rm -rf ~/Library/Developer/Xcode/DerivedData
RCT_NEW_ARCH_ENABLED=1 bundle exec pod install --repo-update
cd ..

3. NativeModule niet gevonden

De foutmelding TurboModuleRegistry: Could not find module 'NaamModule' wijst meestal op een verkeerd benoemd Codegen-spec.

Oplossing: Zorg dat je spec begint met Native (bijvoorbeeld NativeNaamModule.ts) en dat de modulenaam exact overeenkomt met de native registratie.

4. Prestatieregressie na migratie

Soms lijkt de app na migratie juist trager. Dit komt vrijwel altijd doordat oude modules via de interop-laag draaien, wat extra overhead toevoegt.

Oplossing: Gebruik de React Native DevTools Profiler om te achterhalen welke modules via de interop-laag lopen, en migreer die naar echte TurboModules. Begin met de meest aangeroepen modules.

5. Android-bouwfouten met CMake

De Nieuwe Architectuur gebruikt CMake voor C++-code op Android. Dat kan problemen geven als je NDK-versie niet compatibel is.

Oplossing: Gebruik minimaal NDK versie 26. Voeg eventueel toe aan android/local.properties:

# android/local.properties
# Specificeer het pad naar een compatibele NDK-versie
ndk.dir=/Users/jouwnaam/Library/Android/sdk/ndk/26.1.10909125

6. TypeScript-fouten in Codegen-specs

Codegen is vrij strikt in welke TypeScript-constructies het accepteert.

Oplossing: Beperk je tot de ondersteunde typen: string, number, boolean, Object, arrays en specifieke interfaces. Generieke types, union types (behalve met null) en complexe utility types worden niet ondersteund. Raadpleeg de officiële docs voor de volledige lijst.

Conclusie

De Nieuwe Architectuur van React Native is meer dan een update — het is een fundamentele herarchitectuur die elk onderdeel van het framework verbetert. JSI vervangt de bridge en maakt native aanroepen tot 30 keer sneller. Fabric brengt concurrent rendering naar mobiel met een consistente 60fps-ervaring. TurboModules combineren lazy loading met typeveiligheid. En Bridgeless Mode brengt alles samen met opstartverbeteringen tot 40% en geheugenreductie van 20-30%.

In 2026 is de Nieuwe Architectuur de standaard. Punt. Met 83% adoptie onder Expo SDK 54-projecten en volledige ondersteuning in alle expo-*-pakketten is het ecosysteem duidelijk verschoven. De interop-laag vangt restgevallen op, maar actief migreren is verstandig.

Heb je nog niet gemigreerd? Dan is nu het moment. De tooling is volwassen, de documentatie is er, en de prestatiewinsten zijn te groot om te negeren. Of je nu een bestaande app onderhoudt of nieuw begint — de Nieuwe Architectuur is de basis die je nodig hebt.

En de toekomst ziet er alleen maar beter uit. Met Static Hermes aan de horizon, voortdurende verbeteringen in Hermes V1, en de groeiende integratie met React Server Components, blijft React Native zich in hoog tempo ontwikkelen. De Nieuwe Architectuur is niet het eindpunt — het is het startpunt voor de volgende generatie mobiele ontwikkeling.

Over de Auteur Editorial Team

Our team of expert writers and editors.