I'm excited to share that we are successfully transitioning from create-react-app (CRA) to Vite in my workplace! ?
Switching wasn’t straightforward, but it was necessary. Our app was becoming increasingly sluggish, and the developer experience (DX) was deteriorating. I found myself leaving my laptop on all day because restarting the app was painfully slow. If you ever removed node_modules, reinstalled them, and attempted to start the app, you could lose an hour just waiting for everything to download and start up again. The app would usually take 12-15 minutes to start—a significant delay, especially when dealing with urgent bug reports. Additionally, CRA is deprecated and is no longer recommended for bootstrapping React applications.
Why Vite?
Initially, I considered using Rspack, which is touted as
A drop-in replacement for webpack, with more powerful features and exceptional productivity.
However, the transition wasn’t as seamless as I had hoped. Although Rspack is nearing production readiness (at version 1.0.0-beta.4 as of this writing), I decided to opt for the more mature and battle-tested solution: Vite.
Moving away from Webpack and CRA gave me a newfound appreciation for these tools and the effort behind them. They simplify so much of the development process and provide a ready-to-use setup.
I hope that one day we’ll have a true drop-in replacement for CRA and Webpack, so we won’t need to make extensive file changes when switching to tools like Vite.
If you have no idea what Webpack, Vite, or Rspack are, I went down this rabbit hole in my last post, I explored Webpack and what it does. Vite and Rspack are more modern tools doing a similar job but more efficient.
Before diving into how I transitioned our old app to Vite, I'd like to share the pros and cons I've encountered during my brief experience using Vite in development and production environment.
Note:The laptop I’m testing on is quite old. On a newer machine with better specs, startup times were as low as 20–30 seconds for the second start.
With Webpack
With Vite
This is the most crucial step. Extensive research is essential. I browsed Reddit to read about other developers’ experiences transitioning from CRA to Vite. Most agreed that the process is tricky but worth the effort. Additionally, I read several blog posts on the steps needed to move a CRA app to Vite, as there is no official tutorial or documentation on this topic now.
yarn remove react-scripts yarn add vite @vitejs/plugin-react --dev
and in the project root
import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; export default defineConfig({ plugins: [react()], build: { // to output your build into build dir the same as Webpack outDir: 'build', }, server: { open: true, port: 3000, }, });
❌ ✅
yarn add vite-plugin-eslint --dev
import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import eslintPlugin from 'vite-plugin-eslint'; export default defineConfig({ plugins: [react(), eslintPlugin()], build: { outDir: 'build', }, server: { open: true, port: 3000, }, });
❌
import Logo from 'assets/images/logo.svg'; ✅
2. ResolveglobalThis is not defined.
global variable “globalThis” in a Webpack application
window.global ||= window; // just double checked my code and I'm a bit skeptical of why I'm not using // `window.globalThis`and why my code is working with `window.global` ?
3. Generate source maps for error monitoring.
import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import eslintPlugin from 'vite-plugin-eslint'; export default defineConfig({ plugins: [react(), eslintPlugin()], build: { outDir: 'build', sourcemap: true, }, server: { open: true, port: 3000, }, });
4. Fix global SASS variables.
//theme.scss ❌ :export { primaryColor: $app-primary; secondaryColor: $secondary; .... } import theme from '../styles/theme.scss';Hello World
Will be replaced by
// theme.js ✅ const theme = { primaryColor: '#10142a', secondaryColor: '#2695a2', ..... } export default theme; import theme from '../styles/theme.js';Hello World
5. Handle absolute imports for .jsx files.
import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import eslintPlugin from 'vite-plugin-eslint'; export default defineConfig({ plugins: [react(), eslintPlugin()], build: { outDir: 'build', sourcemap: true, }, resolve: { alias: [ { find: 'actions', replacement: '/src/actions' }, { find: 'assets', replacement: '/src/assets' }, { find: 'components', replacement: '/src/components' }, ..... { find: 'styles', replacement: '/src/styles' }, ], }, server: { open: true, port: 3000, }, });
6. Handle absolute imports for **.scss files.**
import MyComponent from 'components/MyComponent'; import styles from 'styles/app.scss';
// index.jsx import React from 'react'; import { render } from 'react-dom'; import Main from './pages/Main'; // Import SCSS globally import './global.scss'; render(, document.querySelector('#root')); // global.scss .class1{...} .class2{...} ... // cut & paste classes from styles/app.scss here // then drop that cursed file
then I’d use them like vanilla CSS
7. Address third-party library issues.
Der Übergang von der Create-React-App zu Vite war eine herausfordernde, aber lohnende Erfahrung. Allein die Leistungsverbesserungen haben dafür gesorgt, dass sich der Aufwand gelohnt hat, und ich glaube, dass dies sowohl die Entwicklerproduktivität als auch die allgemeine Wartbarkeit des Projekts erheblich steigern wird. Indem Sie diese Probleme sorgfältig angehen, können Sie die modernen Tools von Vite optimal nutzen und die Effizienz Ihres Entwicklungsworkflows verbessern.
The above is the detailed content of Migrating from Create-React-App to Vite: Boosting Performance in Legacy Applications. For more information, please follow other related articles on the PHP Chinese website!