install vite on existing react project

install vite on existing react project

Stell dir vor, du hast ein gewachsenes React-Projekt. Es ist über drei Jahre alt, nutzt Webpack 4 und die Build-Zeiten treiben das Team in den Wahnsinn. Jedes Mal, wenn ein Entwickler den Dev-Server startet, kann er sich erstmal einen Kaffee holen. Du entscheidest dich für Install Vite On Existing React Project, weil du gelesen hast, dass alles schneller wird. Du installierst die Pakete, löschst die Webpack-Konfiguration und plötzlich knallt es an allen Ecken. Die Index-Datei wird nicht gefunden, Umgebungsvariablen sind leer und deine SVGs laden nicht mehr. Ich habe Entwickler gesehen, die drei Tage lang versucht haben, diese Fehler manuell zu flicken, nur um am Ende frustriert zum langsamen Webpack zurückzukehren. Das hat das Unternehmen Tausende von Euro an Arbeitszeit gekostet, ohne dass am Ende ein messbares Ergebnis stand.

Der fatale Irrglaube an die Identität von Index.html

Einer der häufigsten Fehler bei der Migration ist die Annahme, dass die Datei public/index.html einfach so bleiben kann, wie sie ist. Bei Webpack war diese Datei ein Template, das vom Plugin verarbeitet wurde. Vite sieht das anders. Vite betrachtet die index.html als den tatsächlichen Einstiegspunkt deiner Applikation. Sie gehört nicht in den public-Ordner, sondern direkt in das Wurzelverzeichnis deines Projekts.

Ich habe Projekte gesehen, in denen Teams stundenlang versucht haben, die Pfade in der Vite-Konfiguration so zu biegen, dass sie auf den alten Ordner zeigen. Das ist reine Zeitverschwendung. Du musst die Datei verschieben. Aber das ist noch nicht alles. In der alten Welt hast du wahrscheinlich Variablen wie %PUBLIC_URL% in deinem HTML verwendet. Vite versteht das nicht. Du musst diese Platzhalter entfernen und stattdessen ein direktes Script-Tag einfügen, das auf deine src/index.jsx oder src/main.jsx zeigt.

Wenn du diesen Schritt ignorierst, wird dein Browser einfach eine leere Seite anzeigen oder einen 404-Fehler werfen. Der Lerneffekt hier ist simpel: Vite ist kein Wrapper für Webpack, sondern ein komplett anderes Paradigma. Wer versucht, die alte Ordnerstruktur mit Gewalt beizubehalten, baut sich technische Schulden auf, bevor die erste Zeile Code überhaupt kompiliert wurde.

Die unterschätzte Hürde bei Install Vite On Existing React Project

Es klingt so einfach, ein paar Abhängigkeiten auszutauschen. Aber die Realität bei Install Vite On Existing React Project sieht oft so aus, dass die Dateiendungen dir das Genick brechen. Webpack war es egal, ob eine Datei .js oder .jsx hieß, solange der Loader richtig konfiguriert war. Vite ist hier gnadenlos. Wenn in einer Datei JSX-Code steht, muss sie zwingend die Endung .jsx (oder .tsx) haben.

Warum das Umbenennen kein reiner Fleißjob ist

In einem großen Projekt hast du vielleicht 500 Dateien. Wenn du versuchst, diese manuell umzubenennen, unterlaufen dir Fehler. Du übersiehst eine Datei, und plötzlich bricht der Build im CI/CD-Prozess ab, obwohl lokal alles gut aussah. Ich nutze dafür Skripte oder Tools wie renamer, aber selbst dann musst du aufpassen. Der eigentliche Grund, warum Vite hier so strikt ist, liegt in der Verwendung von Esbuild. Esbuild ist verdammt schnell, weil es keine Typen prüft und strikte Regeln für die Syntax-Erkennung hat. Ohne die richtige Endung weiß Esbuild nicht, wie es die Datei verarbeiten soll.

Ein weiteres Problem in diesem Zusammenhang sind Importe ohne Dateiendung. Während Webpack oft so konfiguriert war, dass es alles "erraten" hat, verlangt Vite Klarheit. Vor allem, wenn du Bibliotheken nutzt, die nicht ganz sauber exportiert werden, stehst du vor einem Scherbenhaufen. Es ist ein klassischer Fall von: "Lokal läuft es, aber im Production-Build fliegt uns alles um die Ohren." Wer hier spart, zahlt später doppelt durch langwierige Fehlersuche in den Deployment-Logs.

Umgebungsvariablen sind nicht gleich Umgebungsvariablen

Ein riesiges Ärgernis ist die Umstellung von process.env auf import.meta.env. In einem gewachsenen React-Projekt finden sich hunderte Stellen, an denen auf Konfigurationen zugegriffen wird. Viele Teams denken, sie könnten einfach einen Polyfill schreiben oder process.env global definieren. Das klappt vielleicht kurzfristig für den Dev-Server, führt aber zu massiven Problemen beim Bundling für die Produktion.

Vite verwendet das Präfix VITE_ für alle Variablen, die im Client verfügbar sein sollen. Wenn deine alten Variablen REACT_APP_ hießen, werden sie von Vite ignoriert. Du hast nun zwei Möglichkeiten: Entweder du benennst alle Variablen in deiner .env-Datei und im gesamten Quellcode um, oder du nutzt ein Plugin, das die alten Namen mappt. Ich rate dringend davon ab, Plugins zu nutzen, die das alte Verhalten simulieren. Es verschleiert nur, dass du eine moderne Architektur nutzt, und führt dazu, dass neue Teammitglieder verwirrt sind, warum Dinge nicht dem Standard entsprechen.

Der Vorher-Nachher-Vergleich in der Praxis

Schauen wir uns ein reales Szenario an. Vor der Umstellung hatte ein mittelständisches E-Commerce-Unternehmen eine Ladezeit des Dev-Servers von etwa 90 Sekunden. Nach jeder Code-Änderung dauerte das Hot Module Replacement (HMR) etwa 5 bis 10 Sekunden. Der Build-Prozess in der Pipeline fraß 12 Minuten. Das Team versuchte, die Migration "nebenbei" zu machen und behielt die alten process.env-Strukturen bei. Das Ergebnis war ein instabiles System, bei dem die API-Endpunkte in der Staging-Umgebung nicht geladen wurden, weil die Umgebungsvariablen fehlten.

Nachdem sie den Prozess sauber durchgezogen hatten — also alle Variablen auf VITE_ umgestellt, die index.html ins Root-Verzeichnis verschoben und die Dateiendungen korrigiert hatten — änderte sich die Welt. Der Dev-Server startete in unter 2 Sekunden. HMR passierte fast augenblicklich, also in weniger als 200 Millisekunden. Die Build-Zeit in der CI/CD-Pipeline sank auf 3 Minuten. Das Team sparte pro Entwickler etwa 30 bis 45 Minuten Wartezeit pro Tag. Bei einem Team von zehn Entwicklern sind das fast 40 Stunden pro Woche — eine ganze Arbeitskraft, die nur durch das Warten auf den Computer verloren ging.

Absolute Pfade und das Alias-Chaos

In alten Create React App (CRA) Projekten oder benutzerdefinierten Webpack-Konfigurationen wurden absolute Pfade oft über die jsconfig.json oder tsconfig.json geregelt, manchmal auch über spezielle Webpack-Aliase wie @components. Vite übernimmt das nicht automatisch auf die gleiche Weise. Wenn du versuchst, dein Projekt zu starten, wirst du mit Fehlermeldungen überschüttet, dass @/components/Button nicht gefunden werden kann.

Die Lösung ist die Konfiguration von resolve.alias in deiner vite.config.js. Aber hier begehen viele den Fehler, die Pfade nicht mit dem path-Modul von Node.js abzusichern. Sie schreiben relative Pfade in die Aliase, was dazu führt, dass Importe aus tief verschachtelten Ordnern fehlschlagen. Du musst sicherstellen, dass die Aliase absolut aufgelöst werden. In meiner Erfahrung ist das einer der Punkte, an denen die meisten Entwickler anfangen zu fluchen, weil die Fehlermeldungen von Vite manchmal etwas kryptisch sein können, wenn es um verschachtelte Dependency-Bäume geht.

Ein weiterer Fallstrick sind CSS-Importe. Wenn du Sass oder Less verwendest, musst du die entsprechenden Präprozessoren separat installieren. Vite bringt sie nicht standardmäßig mit, erkennt sie aber automatisch, wenn die Pakete vorhanden sind. Viele vergessen das und wundern sich, warum ihr Styling plötzlich komplett fehlt oder der Compiler Fehlermeldungen wirft, die scheinbar nichts mit dem Code zu tun haben.

Der richtige Umgang mit CommonJS-Abhängigkeiten

Vite setzt voll auf ES-Module (ESM). Das ist der Grund für die Geschwindigkeit. Aber die Realität in der JavaScript-Welt ist, dass viele ältere Bibliotheken immer noch im CommonJS-Format (CJS) vorliegen. Wenn du eine solche Bibliothek in deinem React-Projekt hast, wird Vite versuchen, sie "on the fly" zu konvertieren. Meistens klappt das gut, aber eben nicht immer.

Besonders bei großen Abhängigkeiten wie lodash oder alten UI-Kits kann es passieren, dass der Optimizer von Vite hängen bleibt. Ich habe erlebt, dass Entwickler dachten, Vite sei kaputt, dabei war es nur eine einzige inkompatible Library. Hier musst du manuell in die optimizeDeps-Konfiguration eingreifen. Wer das nicht weiß, sucht den Fehler tagelang im eigenen Code, obwohl das Problem in einer externen node_modules-Datei liegt. Es ist frustrierend, aber es gibt keine Abkürzung. Du musst deine Abhängigkeiten kennen.

Install Vite On Existing React Project und das Problem mit den Tests

Du hast dein Projekt endlich zum Laufen gebracht, der Dev-Server flitzt, die Welt sieht rosig aus. Dann lässt du deine Tests laufen. Wenn du Jest verwendest, wirst du feststellen, dass deine Tests plötzlich alle fehlschlagen oder die Umgebungsvariablen nicht finden. Jest läuft in Node.js und versteht die Vite-spezifischen Dinge wie import.meta.env nicht ohne weiteres.

Viele versuchen dann, Jest mühsam mit Babel-Transforms so umzubauen, dass es die Vite-Syntax versteht. Das ist ein aussichtsloser Kampf gegen Windmühlen. Wenn du den Schritt zu Vite gehst, solltest du ernsthaft darüber nachdenken, auch auf Vitest umzusteigen. Vitest nutzt die gleiche Konfiguration wie dein Vite-Server. Das bedeutet, wenn dein Code im Browser läuft, läuft er auch in deinen Tests.

Die Umstellung von Jest zu Vitest dauert bei einem mittelgroßen Projekt etwa einen Tag. Der Versuch, Jest beizubehalten und mit Vite zu synchronisieren, kann dich Wochen kosten, jedes Mal wenn du eine neue Library hinzufügst. Ich habe Projekte gesehen, die zwei Test-Runner parallel laufen ließen, was die CI-Kosten verdoppelt hat, nur weil man Angst vor dem finalen Schnitt hatte. Sei konsequent. Wenn du das Tooling modernisierst, dann richtig.

👉 Siehe auch: diese Geschichte

Realitätscheck: Lohnt sich der Aufwand wirklich?

Machen wir uns nichts vor: Ein bestehendes React-Projekt auf Vite umzustellen, ist keine Aufgabe für die Mittagspause. Wenn dein Projekt klein ist und keine komplizierten Webpack-Plugins nutzt, bist du in einer Stunde fertig. Aber sobald du komplexe Build-Logiken, Micro-Frontends oder tonnenweise Legacy-Code hast, wird es schmerzhaft.

Es gibt Situationen, in denen ich von der Migration abrate. Wenn das Projekt nur noch im Wartungsmodus ist und keine aktiven Features mehr entwickelt werden, lass es bei Webpack. Die Gefahr, dass du durch die Umstellung subtile Bugs in den Production-Build einführst, ist real. Vite optimiert den Build anders als Webpack. Das kann dazu führen, dass CSS-Kaskaden sich leicht verändern oder die Ladereihenfolge von Skripten variiert.

Wenn du jedoch aktiv an dem Projekt arbeitest, ist die Zeitersparnis bei der Entwicklung unschlagbar. Die Produktivität des Teams steigt enorm, wenn der Frust über langsame Tooling-Ketten verschwindet. Aber sei ehrlich zu deinen Stakeholdern: Es wird ein paar Tage dauern, bis alle Kanten geglättet sind. Es ist kein magischer Schalter, den man umlegt. Es ist eine Operation am offenen Herzen deiner Entwicklungsumgebung.

Wer glaubt, dass er einfach nur ein Paket installiert und fertig ist, wird scheitern. Wer aber versteht, dass er seine gesamte Build-Strategie von Grund auf neu denken muss, wird mit einer Entwicklererfahrung belohnt, die Webpack wie ein Relikt aus der Steinzeit wirken lässt. Die Kosten der Migration amortisieren sich meist schon nach wenigen Wochen durch die eingesparte Wartezeit. Aber nur, wenn man es von Anfang an mit der notwendigen Gründlichkeit angeht und nicht versucht, alte Webpack-Muster in die neue Vite-Welt zu pressen. Es ist ein sauberer Schnitt nötig — technisch und mental.

PK

Philipp Krüger

Seit Jahren begleitet Philipp Krüger Themen aus Politik, Wirtschaft und Gesellschaft mit klarer Einordnung.