How to migrate CoreUI React Templates to Vite

How to migrate CoreUI React Templates to Vite

After carefully considering and evaluating our build and development tools in version 5 of our React.js admin templates, we have decided to migrate from Create React App (CRA) to Vite. This decision was driven by several key factors that align with our goals for a more efficient and modern development experience.

Table of Contents

Speed up your responsive apps and websites with fully-featured, ready-to-use open-source admin panel templates—free to use and built for efficiency.


Vite offers faster start-up and update times during development due to its use of native ES modules over traditional webpack bundling. This leads to a significant improvement in the speed and responsiveness of our development process. Additionally, Vite’s out-of-the-box features, such as hot module replacement (HMR) and rich built-in features, meant we could streamline our toolchain and reduce configuration overhead.

Migrating to Vite can improve build times and a more responsive development experience. This guide will walk you through the process step by step. For a comprehensive view of the specific changes, you can also check this commit: - https://github.com/coreui/coreui-free-react-admin-template/commit/1d05bd4cd636da9a1ea884ea964085883323b93f

Prerequisites

  • Ensure you have Node.js installed on your system.
  • Familiarity with command line tools and npm/yarn package management.
  • Existing CRA project that you wish to migrate.

Step 1: Update ESLint Configuration

Navigate to your project’s .eslintrc.js file and remove the 'react-app' and 'react-app/jest' configurations from the extends array. After the change, your ESLint configuration should resemble the following:

module.exports = {
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: 'module',
    ecmaFeatures: {
      jsx: true,
    },
  },
  settings: {
    react: {
      version: 'detect',
    },
  },
  extends: [
    'plugin:react/recommended',
    'plugin:prettier/recommended',
  ],
  plugins: ['react', 'react-hooks'],
  rules: {
    // Custom ESLint rules can be added here
  },
};

Step 2: Reorganize Public Assets

  • Move your index.html from the public directory to the project root and update any %PUBLIC_URL% references to ./.

    mv public/index.html .
    
  • Update the <script> tag in index.html to correctly point to your entry file, adjusting the path to match the new project structure:

    <script type="module" src="/src/index.jsx"></script>
    

Step 3: Install Vite and Update Dependencies

Install Vite and remove react-scripts:

npm install vite --save-dev
npm uninstall react-scripts

Add or update other dependencies:

npm install @vitejs/plugin-react autoprefixer eslint eslint-plugin-react eslint-plugin-react-hooks postcss --save-dev
npm uninstall @babel/plugin-proposal-private-property-in-object @testing-library/jest-dom @testing-library/react @testing-library/user-event web-vitals

Step 4: Setting Up Vite

Create a new file named vite.config.js or vite.comfig.mjs at the root of your project and fill it with the following basic Vite configuration:

import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'node:path';
import autoprefixer from 'autoprefixer';

export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), '');
  process.env = { ...process.env, ...env };

  return {
    base: './',
    build: {
      outDir: 'build',
    },
    css: {
      postcss: {
        plugins: [autoprefixer({})], // Add options as needed
      },
    },
    define: {
      'process.env': process.env,
    },
    esbuild: {
      loader: 'jsx',
      include: /src\/.*\.jsx?$/,
      exclude: [],
    },
    optimizeDeps: {
      force: true,
      esbuildOptions: {
        loader: {
          '.js': 'jsx',
        },
      },
    },
    plugins: [react()],
    resolve: {
      alias: [{
        find: 'src/',
        replacement: `${path.resolve(__dirname, 'src')}/`,
      }],
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.scss'],
    },
    server: {
      port: 3000,
      proxy: {
        // Define proxies here (if needed)
      },
    },
  };
});

Step 5: Updating package.json for Vite Commands

Adjust the scripts section of your package.json file to use Vite’s commands:

"scripts": {
  "start": "vite",
  "build": "vite build",
  "serve": "vite preview"
},

Step 8: Update Main Application Entry Point

Modify the main entry point of your application to reflect the new imports and setup:

  • Remove the import for react-app-polyfill/stable if you’re confident about browser compatibility or if Vite’s default polyfilling meets your needs.
  • Ensure that core-js is imported if you rely on its polyfills.
  • Remove reportWebVitals if you no longer need to track performance metrics, or if you will be using an alternative method in Vite.
  • Add the Provider component from react-redux to wrap your <App />, enabling Redux state management throughout your application.

Your src/index.js should now look like this:

import React from 'react';
import { createRoot } from 'react-dom/client';
import 'core-js';
import App from './App';
import store from './store';
import { Provider } from 'react-redux';

createRoot(document.getElementById('root')).render(
  <Provider store={store}>
    <App />
  </Provider>
);

Step 9: Clean Up Unused Files

Remove any CRA-specific files that are no longer needed:

  • jest.config.js
  • jsconfig.json
  • src/App.test.js
  • src/reportWebVitals.js
  • src/setupTests.js

This can be done using your file system or a command line interface.

rm jest.config.js jsconfig.json src/App.test.js src/reportWebVitals.js src/setupTests.js

Step 10: Finalize the Migration

Run your project with Vite to ensure everything works correctly:

npm start

If you encounter issues, consult the Vite documentation or rollback changes and migrate one step at a time.


Congratulations on migrating your project to Vite!


About the Author

Subscribe to our newsletter
Get early information about new products, product updates and blog posts.
How to Redirect to a New URL Using JavaScript Redirect Techniques
How to Redirect to a New URL Using JavaScript Redirect Techniques

How to Achieve Perfectly Rounded Corners in CSS
How to Achieve Perfectly Rounded Corners in CSS

How to Add a Tab in HTML
How to Add a Tab in HTML

How to Open Link in a New Tab in HTML?
How to Open Link in a New Tab in HTML?

How to Clone an Object in JavaScript
How to Clone an Object in JavaScript

How to Fix “Sass @import Rules Are Deprecated and Will Be Removed in Dart Sass 3.0.0.”
How to Fix “Sass @import Rules Are Deprecated and Will Be Removed in Dart Sass 3.0.0.”