DEV Community

Jumbo Daniel
Jumbo Daniel

Posted on

How to Setup Path Alias Vite + React

Why Path Aliases?

Path Aliases in Vite allow us to use custom paths to our project directory when importing our modules.
⁠Say we are working on a React project, in our cards component we want to import about three different components to build our card. Let's say a button, header, image.

We can write it as this

import Button from '../../components/Button'
import Header from '../../components/ui/Header'
import Image from '../../components/Image'
Enter fullscreen mode Exit fullscreen mode


It looks good for now, but think of when we want to refactor or improve our component and have to import about 5 or 6 more components. Then it starts to get messy.

import Button from '../../components/Button'
import Header from '../../components/ui/Header'
import Image from '../../components/Image'
import Panel from "../../components/Dashboard/Panel";
import Input from "../../components/Forms/Input";
import Submit from "../../components/Forms/Submit"

Enter fullscreen mode Exit fullscreen mode

That's where path imports become useful, they make our import statements cleaner and more manageable. With Path Alias what we have above becomes

import Button from '@/src/components/Button'
import Header from '@/src/components/ui/Header'
import Image from '@/src/components/Image'
Enter fullscreen mode Exit fullscreen mode

For those that don't use auto import, you do not need to remember how far the directory is from the component you are working on. It just simplifies code organization when you need to move files or refactor your project structure, you won't have to update numerous relative import paths across your codebase

Adding Path Alias to Your Project

First, you need to install React + Vite
⁠pnpm create vite setup-path-alias --template react
Next, you will go into the project directory you just created then run

cd setup-path-alias                                                                                                                                         pnpm install 
pnpm run dev    
Enter fullscreen mode Exit fullscreen mode

Note: I used the shortcut to create the Vite app with the template, you can use any other method you prefer. So as long you create the app. I also used pnpm but you can use your preferred package manager (npm, yarn, bun....).

After that is completed, the Vite project directory looks like this
⁠├── public
├── src/
│ └── components/
│ └── HelloWorld.jsx
├── .gitignore
├── index.html
├── package.json
├── README.md
└── vite.config.js

⁠Now go to vite.config.js file, this is how the file should look by default

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
})
Enter fullscreen mode Exit fullscreen mode

Next, we will install Path module, we use it to use the path.resolve() method, which helps create absolute paths.

pnpm i path

Then we will resolve the path alias in our vite.config.js file and the result should look like this

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    }
  },
});
Enter fullscreen mode Exit fullscreen mode

Configuring VS Code IntelliSense

To ensure VS Code recognizes your aliases, create or update jsconfig.json in your project root:

{
    "compilerOptions": {
      "paths": {
        "@/*": [
          "./src/*"
        ]
      }
    }
  }
Enter fullscreen mode Exit fullscreen mode

Then we can update our imports from

import Button from '../../components/Button'
//to this
⁠import Button from '@/src/components/Button'
Enter fullscreen mode Exit fullscreen mode

Note that we can make the path alias like this, and resolve as many paths as we want, then update our intellisense. I left my own simpler since my project is small and by default, the src folder contains all the project files, then I can just point it to src but when you use the components folder a lot of times in your code you can just add it to the path alias to keep your imports clean. Then again it is advised to avoid the overuse of aliases: because while they can simplify imports, overusing them can make your code less intuitive for new team members. Use aliases for common, frequently accessed directories.

⁠    alias: {
      '@': path.resolve(__dirname, './src'),
      '@components': path.resolve(__dirname, './src/components'),
  },

Enter fullscreen mode Exit fullscreen mode

Potential Issues and How to Avoid Them

  1. Circular Dependencies: Be cautious when using aliases to avoid creating circular dependencies. Always structure your imports in a way that maintains a clear hierarchy.
  2. Overuse of Aliases: While aliases can simplify imports, overusing them can make your code less intuitive for new team members. Use aliases for common, frequently accessed directories.
  3. Inconsistent Naming: Stick to a consistent naming convention for your aliases across the project. For example, always use the '@' prefix for aliased paths.
  4. Forgetting to Update jsconfig.json: If you add new aliases in vite.config.js, remember to update jsconfig.json as well to maintain IDE support.
  5. Alias Conflicts: Ensure your alias names don't conflict with npm package names or browser globals to avoid confusion and potential errors.

Thanks for reading

Top comments (3)

Collapse
 
martinbaun profile image
Martin Baun

Nice! I used to love path aliases but it started to feel like it's just one more layer of complication in the build script so I moved away from it... This could get me back, very well compiled!

Collapse
 
jumbo02 profile image
Jumbo Daniel

Sometimes I avoid them on smaller projects, but as files are bigger with more dependencies I always add them into my setup.
Thank you for your kind words.

Collapse
 
jivkojelev91 profile image
JivkoJelev91

You can use
import tsconfigPaths from 'vite-tsconfig-paths';
for absolute paths without extra @.