React-app start niet? 7 veelvoorkomende fixes voor je development server
Als je React-app niet wil starten, voelt dat vaak alsof “alles stuk” is—maar in de praktijk gaat het meestal om een handvol terugkerende oorzaken: verkeerde Node-versie, kapotte node_modules, poortconflicten, environment-variabelen, bundler-caches, of een dependency die nét niet matcht. In deze tutorial krijg je 7 veelvoorkomende fixes met diepe uitleg, echte commando’s, en een aanpak waarmee je systematisch kunt debuggen (in plaats van willekeurig dingen te proberen).
Context: de voorbeelden zijn toepasbaar op projecten met Create React App (CRA), Vite, Next.js (dev server), en algemene React setups met Webpack/Rollup. Waar iets tool-specifiek is, staat het erbij.
Voor je begint: een snelle diagnose-checklist
Voordat je aan “fixes” begint, wil je weten wat er precies faalt. Verzamel deze info:
- Welke tool gebruik je?
- CRA:
react-scripts start - Vite:
vite/npm run dev - Next.js:
next dev
- CRA:
- Wat is de exacte foutmelding? Kopieer de volledige output.
- Welke Node/NPM/Yarn/PNPM versies?
- Op welk OS? (Windows/macOS/Linux)
- Start hij helemaal niet, of crasht hij na compile?
- “Command not found” → tooling/installs
- “Module not found” → dependencies/resolving
- “EADDRINUSE” → poort bezet
- “ERR_OSSL_EVP_UNSUPPORTED” → Node/OpenSSL mismatch
Handige commando’s:
node -v
npm -v
yarn -v
pnpm -v
git status
En check je scripts:
cat package.json
Fix 1 — Verkeerde Node.js-versie (of OpenSSL-problemen)
Symptomen
- CRA/Webpack start niet met errors als:
ERR_OSSL_EVP_UNSUPPORTEDerror:0308010C:digital envelope routines::unsupported
- Of dependencies verwachten een andere Node major:
The engine "node" is incompatible with this module
Waarom dit gebeurt
Node.js verandert door de jaren heen API’s, defaults en security-instellingen. Een bekende breuklijn is Node 17+ met OpenSSL 3, waar oudere Webpack-versies op stuklopen. Ook kunnen dependencies in je lockfile gebouwd zijn voor een andere Node-versie.
Oplossing A: gebruik een Node version manager (aanrader)
macOS/Linux: nvm
# Installatie (voorbeeld)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Herstart je shell, dan:
nvm install 18
nvm use 18
node -v
Windows: nvm-windows Installeer nvm-windows en doe:
nvm install 18.20.2
nvm use 18.20.2
node -v
Kies een versie die past bij je stack:
- Veel moderne tooling: Node 18 LTS of Node 20 LTS
- Oudere CRA-projecten: vaak Node 16/18 (afhankelijk van
react-scripts)
Oplossing B: tijdelijke workaround voor OpenSSL (niet ideaal)
Als je moet draaien op Node 17+ met oude Webpack:
macOS/Linux
export NODE_OPTIONS=--openssl-legacy-provider
npm start
Windows PowerShell
setx NODE_OPTIONS "--openssl-legacy-provider"
npm start
Let op: dit is een workaround. Beter is upgraden naar een bundler/tooling die OpenSSL 3 ondersteunt (bijv. nieuwere Webpack of overstappen naar Vite).
Extra: zet je Node-versie vast in het project
Voeg in package.json:
{
"engines": {
"node": ">=18 <21"
}
}
En (optioneel) een .nvmrc:
echo "18" > .nvmrc
Fix 2 — Kapotte install of “dependency hell” (node_modules + lockfile reset)
Symptomen
Module not found: Can't resolve ...Cannot find module ...- Vage runtime errors na een dependency update
- Dev server start, maar compile faalt op imports die er “wel zijn”
Waarom dit gebeurt
node_modules is een grote boom van packages. Als je:
- Node-versie wisselt,
- lockfile merge-conflicts hebt gehad,
- half-updates deed,
- of tussen npm/yarn/pnpm wisselt,
…dan kan je dependency tree inconsistent worden. Je bundler resolve’t dan modules anders dan verwacht.
Oplossing: clean install (de “nucleaire” maar vaak juiste stap)
-
Stop de dev server.
-
Verwijder
node_modulesen lockfile(s):
macOS/Linux
rm -rf node_modules
rm -f package-lock.json yarn.lock pnpm-lock.yaml
Windows PowerShell
Remove-Item -Recurse -Force node_modules
Remove-Item -Force package-lock.json, yarn.lock, pnpm-lock.yaml
- Kies één package manager en installeer opnieuw:
npm
npm install
npm start
Yarn
yarn install
yarn start
pnpm
pnpm install
pnpm dev
Tip: gebruik npm ci in plaats van npm install (als je een lockfile hebt)
npm ci installeert exact wat in package-lock.json staat en faalt bij mismatch—ideaal voor reproducible builds:
npm ci
npm start
Diepere check: dubbele React-versies
Een klassieker: je hebt twee React versies in de dependency tree, wat kan leiden tot hooks-errors.
Check met npm:
npm ls react react-dom
Of met yarn:
yarn why react
yarn why react-dom
Als je meerdere versies ziet, los je dat vaak op door:
- dependencies te alignen (zelfde major/minor),
- of
resolutions(Yarn) / overrides (npm) te gebruiken.
Fix 3 — Poort bezet (EADDRINUSE) of dev server bindt aan verkeerde host
Symptomen
Error: listen EADDRINUSE: address already in use :::3000- Dev server blijft hangen op “Starting the development server…”
- Je ziet niets in de browser, of je krijgt timeouts
Waarom dit gebeurt
Poort 3000/5173/8080 kan al bezet zijn door:
- een andere dev server,
- Docker container,
- VPN/proxy tool,
- of een “spookproces” dat niet goed is afgesloten.
Oplossing A: vind en kill het proces
macOS/Linux (poort 3000)
lsof -i :3000
# voorbeeld output toont PID
kill -9 <PID>
Linux alternatief
ss -lptn 'sport = :3000'
Windows PowerShell
netstat -ano | findstr :3000
taskkill /PID <PID> /F
Oplossing B: start op een andere poort
CRA
PORT=3001 npm start
Windows PowerShell (CRA):
$env:PORT=3001; npm start
Vite
npm run dev -- --port 5174
Next.js
npm run dev -- -p 3001
Oplossing C: host binding issues (0.0.0.0 vs localhost)
Soms draait je server wel, maar is hij niet bereikbaar door een verkeerde host of IPv6/IPv4 mismatch.
CRA
HOST=127.0.0.1 npm start
Vite (vite.config.js)
export default {
server: {
host: "127.0.0.1"
}
}
Fix 4 — Environment variabelen en .env problemen (CRA/Vite/Next verschillen)
Symptomen
- App start niet na “env changes”
process is not defined(Vite)process.env.REACT_APP_...isundefined- Build/dev server crasht door ontbrekende keys
Waarom dit gebeurt
Elke tool heeft eigen regels:
- CRA: alleen variabelen met prefix
REACT_APP_worden in de client gebundeld.
Voorbeeld:REACT_APP_API_URL=https://... - Vite: gebruikt
import.meta.enven prefixVITE_.
Voorbeeld:VITE_API_URL=https://... - Next.js: client-side variabelen moeten
NEXT_PUBLIC_prefix hebben.
Ook belangrijk: .env wordt bij start ingelezen. Wijzig je .env? Dan moet je de server herstarten.
Oplossing A: check je prefixes en code
CRA
REACT_APP_API_URL=https://api.example.com
Gebruik:
const url = process.env.REACT_APP_API_URL;
Vite
VITE_API_URL=https://api.example.com
Gebruik:
const url = import.meta.env.VITE_API_URL;
Next.js
NEXT_PUBLIC_API_URL=https://api.example.com
Gebruik:
const url = process.env.NEXT_PUBLIC_API_URL;
Oplossing B: controleer welke .env geladen wordt
Veel setups ondersteunen .env, .env.local, .env.development, etc. Conflicten ontstaan als je dezelfde key in meerdere bestanden hebt.
Zoek alle definities:
# macOS/Linux
grep -R "API_URL" -n .env*
# Windows PowerShell
Select-String -Path .env* -Pattern "API_URL"
Oplossing C: voorkom dat je per ongeluk secrets in de client stopt
Alles wat je in client-side env stopt, kan in de browser bekeken worden. Zet secrets server-side (bij Next.js API routes of backend).
Fix 5 — TypeScript/Babel/ESM vs CJS mismatch (import/export errors)
Symptomen
SyntaxError: Cannot use import statement outside a moduleERR_REQUIRE_ESMUnexpected token 'export'- Babel compile errors na dependency update
Waarom dit gebeurt
De JavaScript module-wereld is verdeeld:
- CJS (
require,module.exports) - ESM (
import,export)
Sommige packages zijn ESM-only geworden. Als jouw tooling (of Node runtime) verwacht dat het CJS is, crasht het. Ook kan je type: "module" in package.json invloed hebben op hoe Node je config files interpreteert (bijv. webpack.config.js, vite.config.js, postcss.config.js).
Oplossing A: check "type": "module" in package.json
Als je dit hebt:
{
"type": "module"
}
Dan moeten Node-run configbestanden vaak ook ESM zijn, of je moet ze hernoemen naar .cjs (CommonJS).
Voorbeeld: postcss.config.cjs:
module.exports = {
plugins: {
autoprefixer: {}
}
};
Oplossing B: pas import aan of pin dependency
Als een dependency ESM-only is en jouw tool kan dat niet, kun je:
- upgraden naar een toolversie die ESM snapt,
- of de dependency pinnen naar een CJS-compatibele versie.
Voorbeeld pinnen met npm:
npm install some-lib@1.9.0
Oplossing C: TypeScript config check
Soms faalt de dev server door tsconfig.json module settings.
Controleer:
{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "react-jsx"
}
}
Let op:
moduleResolution: "Bundler"werkt goed met Vite/modern tooling, maar niet altijd met oudere setups. Voor CRA/oudere tooling is"Node"soms stabieler.
Fix 6 — Caches en build artifacts (Vite/Next/Webpack) die je moet legen
Symptomen
- Na een update blijft de dev server “oude” code tonen
- Rare errors die verdwijnen na “alles verwijderen”
- HMR (hot reload) werkt niet meer
- Next.js: pagina’s crashen na config change
Waarom dit gebeurt
Bundlers en frameworks cachen agressief voor snelheid:
- Vite:
node_modules/.vite - Next.js:
.next - Webpack loaders: soms
node_modules/.cache - CRA:
node_modules/.cache(bij sommige versies)
Als cache-inhoud niet meer matcht met je code/dependencies, krijg je spookbugs.
Oplossing: verwijder caches en start opnieuw
Algemeen (macOS/Linux)
rm -rf node_modules/.cache
rm -rf node_modules/.vite
rm -rf .next
rm -rf dist
rm -rf build
npm start
Vite specifiek
rm -rf node_modules/.vite
npm run dev
Next.js specifiek
rm -rf .next
npm run dev
Windows PowerShell
Remove-Item -Recurse -Force node_modules\.cache -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .next -ErrorAction SilentlyContinue
npm run dev
Extra: forceer een “schone” bundler run
Sommige tools hebben flags:
Vite
npm run dev -- --force
Fix 7 — Tooling scripts, PATH en “command not found” (react-scripts/vite/next ontbreekt)
Symptomen
react-scripts: command not foundvite: command not foundnext: command not foundnpm ERR! missing script: startofdev
Waarom dit gebeurt
Meestal een van deze:
- dependencies zijn niet geïnstalleerd (
node_modulesontbreekt), - je gebruikt het verkeerde script (
npm startterwijl je projectdevgebruikt), - je voert commando’s uit in de verkeerde map,
- of je probeert een globale binary te gebruiken die niet geïnstalleerd is.
Oplossing A: check scripts in package.json
Open package.json en kijk naar:
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}
Dan moet je starten met:
npm run dev
CRA ziet er vaak zo uit:
{
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build"
}
}
Dan:
npm start
Oplossing B: installeer dependencies
npm install
En start opnieuw.
Oplossing C: zorg dat je in de juiste directory zit
Check:
pwd
ls
Je moet in de map staan waar package.json staat.
Oplossing D: gebruik npx voor lokale binaries (handig bij diagnose)
Als vite niet gevonden wordt, maar wel in node_modules staat:
npx vite --version
npx vite
Voor Next:
npx next dev
Als npx het ook niet vindt, is de dependency waarschijnlijk niet geïnstalleerd of staat niet in dependencies/devDependencies.
Systematische debug-aanpak (als de 7 fixes niet meteen werken)
Als je nog steeds vastzit, ga dan methodisch te werk:
1) Reproduceer met maximale logging
Veel tools geven extra output met environment flags.
Node warnings
node --trace-warnings node_modules/.bin/react-scripts start
npm verbose
npm run dev --loglevel verbose
2) Controleer de exacte error en zoek op de kernzin
Niet zoeken op je hele terminal-output, maar op de “kern”:
ERR_OSSL_EVP_UNSUPPORTEDEADDRINUSECannot find moduleERR_REQUIRE_ESM
3) Minimaliseer: start met een kale install
- Verwijder caches
- Clean install
- Start opnieuw
4) Check of het project überhaupt compileert
Run build:
CRA
npm run build
Vite
npm run build
Next
npm run build
Als build faalt, is het niet alleen “dev server”; dan is het een echte compile/config/dependency issue.
Veelvoorkomende concrete foutmeldingen en wat ze betekenen
EADDRINUSE
Poort bezet → Fix 3.
ERR_OSSL_EVP_UNSUPPORTED
Node/OpenSSL mismatch → Fix 1.
Module not found: Can't resolve 'xyz'
Dependency ontbreekt of verkeerde import path → Fix 2 (clean install) en check import.
react-scripts: command not found
Dependencies niet geïnstalleerd of verkeerde map → Fix 7.
process is not defined (bij Vite)
Je gebruikt process.env in Vite; moet import.meta.env zijn → Fix 4.
Preventie: maak je dev-setup robuust
- Leg Node-versie vast met
.nvmrcenengines. - Gebruik één package manager per repo.
- Commit je lockfile (
package-lock.jsonofyarn.lockofpnpm-lock.yaml). - Documenteer startcommando’s in
README.md. - Houd tooling up-to-date (zeker bundlers), maar upgrade gecontroleerd.
Voorbeeld README snippet:
## Development
Vereist: Node 18
```bash
npm install
npm run dev
---
## Snelle “alles-in-één” reset (als laatste redmiddel)
Als je zeker weet dat je geen lokale wijzigingen kwijt raakt (of je hebt ze gecommit), kun je dit doen:
**macOS/Linux**
```bash
git clean -xfd
npm install
npm start
Windows PowerShell
git clean -xfd
npm install
npm start
git clean -xfdverwijdert ook untracked files (zoals.env.localals die niet gecommit is). Wees voorzichtig: maak eventueel eerst een backup van env-bestanden.
Afronding: welke fix moet je eerst proberen?
Praktische volgorde (meest winst → minst invasief):
- Lees de foutmelding en match op categorie (poort, Node, module).
- Fix 3 (poort) als je
EADDRINUSEziet. - Fix 1 (Node-versie) bij OpenSSL/engine errors.
- Fix 7 (scripts/command not found) als binaries ontbreken.
- Fix 2 (clean install) bij module-resolve issues.
- Fix 6 (caches legen) bij spookbugs/rare HMR issues.
- Fix 4/5 (env + ESM/CJS/TS) bij configuratie- en runtime-mismatches.
Als je wil, plak hier de exacte terminal-output (laat secrets weg) + je package.json scripts, dan kan ik gericht zeggen welke van de 7 fixes jouw situatie het meest waarschijnlijk oplost.