DEV Community

loading...
Cover image for Clean Up Your Imports using Absolute Imports & Alias on React apps (Next.js, CRA, and React-Vite)

Clean Up Your Imports using Absolute Imports & Alias on React apps (Next.js, CRA, and React-Vite)

Theodorus Clarence
Checkout my personal site for library of code snippets!
Updated on ・2 min read

Absolute Import is a great way to clean up your imports

Setting up absolute imports can be a lot of pain to search on the internet, I spend quite some time to make this work, so here is all of the setup I use to make it work, all in one blog.

The problem

This is the usual way of importing with .. operator to go back 1 folder:

import Nav from '../../components/Nav';
Enter fullscreen mode Exit fullscreen mode

In larger projects, this could be a nightmare.

And this is the cleaner import after using absolute import and alias:

import Nav from '@/components/Nav';
Enter fullscreen mode Exit fullscreen mode

You can also change the @ symbol to whatever you want. Neat right?

There are 4 react apps setup I found on the internet, and I summarized all of those for you.

  1. For Next.js Apps
  2. For Create React App using Craco
  3. For Create React App without using Craco (alias not available)
  4. For React + Vite

For Next.js

  1. Add this to root with the filename of jsconfig.json
{
  "compilerOptions": {
    "jsx": "preserve",
    "baseUrl": ".",
    "paths": {
      "@/*": ["*"],
      "@/components/*": ["components/*"],
      "@/styles/*": ["styles/*"]
      // add more folders here
    }
  },
  "exclude": ["node_modules", ".next"]
}
Enter fullscreen mode Exit fullscreen mode

Or you can just use my Next.js & Tailwindcss starter template with all of the boilerplate set up.

[edit] It turns out in Next.js we can just write the first path like so:

{
  "compilerOptions": {
    "jsx": "preserve",
    "baseUrl": ".",
    "paths": {
      "@/*": ["*"]
    }
  },
  "exclude": ["node_modules", ".next"]
}
Enter fullscreen mode Exit fullscreen mode

Credits to Kutsan Kaplan, I am not removing the original one, in case there are some problems about auto imports or F12 look up.


For Create React App using Craco

Only available if using Craco, usually we use Craco when also using Tailwind CSS, so no extra setup.

  1. Add this to root with the filename of jsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./src",
    "jsx": "preserve",
    "paths": {
      "@/*": ["./src/*"],
      "@/components/*": ["./components/*"],
      "@/pages/*": ["./pages/*"],
      "@/contexts/*": ["./contexts/*"],
      "@/routes/*": ["./routes/*"]
    }
  },
  "exclude": ["node_modules", "build"]
}
Enter fullscreen mode Exit fullscreen mode

You need to update this file every time you create a new folder

  1. And in craco.config.js
const path = require('path');

module.exports = {
  // ...existing code
  webpack: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
};
Enter fullscreen mode Exit fullscreen mode

For Create React App without using Craco

Create React App only supports absolute import, but no alias

  1. Add in jsconfig.json
{
  "compilerOptions": {
    "baseUrl": "src"
  },
  "include": ["src"]
}
Enter fullscreen mode Exit fullscreen mode

The absolute import will only remove the relative path, but won't add @/ alias.

For example:

import Button from 'components/Button';
Enter fullscreen mode Exit fullscreen mode

For React Vite

  1. Add this to root with the filename of jsconfig.json
{
  "compilerOptions": {
    "jsx": "preserve",
    "baseUrl": "./src",
    "paths": {
      "@/components/*": ["./components/*"],
      "@/pages/*": ["./pages/*"],
      "@/routes/*": ["./routes/*"],
    },
  },
}
Enter fullscreen mode Exit fullscreen mode

You need to update this file every time you create a new folder

  1. Also add this to root with the filename of vite.config.js
import { defineConfig } from 'vite';
import reactRefresh from '@vitejs/plugin-react-refresh';
const path = require('path');

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

Or you can just use my Vite + React + Tailwindcss starter template


Originally posted on my personal site, find more blog posts and code snippets library I put up for easy access on my site 🚀

Discussion (9)

Collapse
kutsan profile image
Kutsan Kaplan

Wasn't this enough? No need to add an entry everytime you create a folder.

{
  "compilerOptions": {
    // ...
    "baseUrl": "src",
    "paths": {
      "@/*": ["*"]
    }
  }
}

Enter fullscreen mode Exit fullscreen mode
Collapse
theodorusclarence profile image
Theodorus Clarence Author • Edited

Oh cool, just tried it and it works on Next.js, I remember it has some issue for the F12 look up but I think there is no problem now! Thanks for your addition, updated the blog.

It kinda messes with CRA auto import using that approach, will update if I found anything.

Collapse
kutsan profile image
Kutsan Kaplan

Sorry for the late response, I'm glad it's working for you. Also, I think auto-imports are bad. It sometimes does wrong imports and every time I need to check it if it's imported correctly. Actually, I like being explicit about this and I don't mind to manually import everything.

Collapse
consoletvs profile image
Erik C. Forés

Sorry but what's wrong with?

// tsconfig.json or jsconfig.json
{
  "compilerOptions": {
    "baseUrl": "."
  }
}
Enter fullscreen mode Exit fullscreen mode
Collapse
theodorusclarence profile image
Theodorus Clarence Author

It's really just preference

Collapse
mlnzyx profile image
R. Maulana Citra

Awesome article bro, very helpful, thanks for sharing!

Collapse
hasnaindev profile image
Muhammad Hasnain

This does not help with syntax highlighting, right?

Collapse
snxk profile image
Sayan Mallick

How to implement this in typescript? Do I just edit the tsconfig.json?

Collapse
omkar_k45 profile image
Omkar Kulkarni

Yes. That would take care of it.