Create React App to Vite

Create React App to Vite

Tested migrating a React 17 create-react-app using craco to Vitejs.

There is a new hype saying that it is Lightning Fast to work with and I wanted to start playing around with it.

Start new project

I made the migration creating a new project from scratch to start with a project from scratch.

yarn create vite migration --template react-ts
cd migration
yarn
yarn dev

Move old CRA src files to new project

Had to downgrade react to v17.0.1 because I didn't want to have to deal with migrating to react 18 in this test

Than moved all files from the old repository to the new changing index.html to point to index.tsx

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React + TS</title>
  </head>
  <body>
    <div id="root"></div>
-    <script type="module" src="/src/main.tsx"></script>
+    <script type="module" src="/src/index.tsx"></script>
  </body>
</html>

Ran yarn dev --debug installing all missing libraries and got a problem importing files using a absolute path.

Absolute path resolve

[vite] Internal server error: Failed to resolve import "shared/components/Context" from "src/index.tsx". Does the file exist?

After some time looking for a solution came across this plugin:

yarn add -D vite-tsconfig-paths

Adding this configuration to vite.config.ts

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
+ import tsconfigPaths from "vite-tsconfig-paths";

// https://vitejs.dev/config/
export default defineConfig({
+  plugins: [react(), tsconfigPaths()]
})

Sass problem

The old project was using sass so this error appeared:

Preprocessor dependency "sass" not found. Did you install it?

First we need to install the sass library:

yarn add -D sass

Throughout the project it is used variables to define our common theme style as it wasn't loaded running the project I got many problems like this:

root stylesheet
Undefined variable.
  ╷
9 │   font-weight: $font-weight-medium;
  │                ^^^^^^^^^^^^^^^^^^^

Previously we solved this using craco-sass-resources-loader on .craco.js:

const sassResourcesLoader = require('craco-sass-resources-loader');
require('dotenv').config();

module.exports = {
  plugins: [
    {
      plugin: sassResourcesLoader,
      options: {
        resources: [
          './src/shared/styles/variables.scss',
          './src/shared/styles/mixins.scss',
        ],
      },
    },

  ],
};

And Vite has a built in way to do this sort of things:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tsconfigPaths from "vite-tsconfig-paths";

// https://vitejs.dev/config/
export default defineConfig({
+  css: {
+    preprocessorOptions: {
+      scss: {
+        additionalData: `
+        @import "./src/shared/styles/variables";
+        @import "./src/shared/styles/mixins";
+        `,
+      },
+    },
+  },
  plugins: [
    react(),
    tsconfigPaths(),
  ],
});

One caveat is that a scss file library import in Vite doesn't require ~ in the start of the import:

Can't find stylesheet to import.
  ╷
1 │ @import '~@company/ui-design-tokens/build/web/tokens.scss';
  │         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ╵

src/shared/styles/variables.scss

- @import '~@company/ui-design-tokens/build/web/tokens.scss';
+ @import '@company/ui-design-tokens/build/web/tokens.scss';

Env variables

All environment variable on .env should be changed from REACT_APP_ to VITE_. You could also change it using vite-plugin-env-compatible.

Final thoughts

Will write a follow up articles as I go playing around with this.

Probably around adding linguijs to a Vite project.

Please feel free to leave me a comment for questions or if I missed something.