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';
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';
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.
- For Next.js Apps
- For Create React App using Craco
- For Create React App without using Craco (alias not available)
- For React + Vite
For Next.js
- 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"]
}
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"]
}
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.
- 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"]
}
You need to update this file every time you create a new folder
- And in craco.config.js
const path = require('path');
module.exports = {
// ...existing code
webpack: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
};
For Create React App without using Craco
Create React App only supports absolute import, but no alias
- Add in jsconfig.json
{
"compilerOptions": {
"baseUrl": "src"
},
"include": ["src"]
}
The absolute import will only remove the relative path, but won't add @/
alias.
For example:
import Button from 'components/Button';
For React Vite
(might be outdated)
- Add this to root with the filename of
jsconfig.json
{
"compilerOptions": {
"jsx": "preserve",
"baseUrl": "./src",
"paths": {
"@/components/*": ["./components/*"],
"@/pages/*": ["./pages/*"],
"@/routes/*": ["./routes/*"],
},
},
}
You need to update this file every time you create a new folder
- 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()],
});
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 🚀
Top comments (16)
Wasn't this enough? No need to add an entry everytime you create a folder.
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.
i have two jsconfig.json flie in my project one is for my reactjs and one is for my nodejs project
and it is always good to use special character before the folder path
the config i user for my backend :-
Looks good but I think tilde-slash prefix (
~/
) shouldn't be used for project-scoped aliases.~/
means home directory for current user on unix-like systems. So, it is looking like an absolute path to me at the first glance.Great article.
Would it be possible to configure vite to understand absolute path WITHOUT using a prefix like (@)?
My vite project is created as React JS (not TS).
Previously with CRA + WebPack, I was able to specify this:
where my jsconfig.json looks like this:
If you are facing "Dynamic required of 'path' is not supported" error in vite.config.js replace
const path = require('path')
withimport * as path from 'path'
this will fix the issueand
@vitejs/plugin-react-refresh
is deprecated useimport react from "@vitejs/plugin-react"
instud.Sorry but what's wrong with?
It's really just preference
@vitejs/plugin-react-refresh
is deprecated, maybe consider updating the article and removing it?Hii bro" i have fixed for new problem on React Vite without TS, just just chillin add ./ before src on alias (vite.config.js), and it will solve your problem.
Awesome article bro, very helpful, thanks for sharing!
How to implement this in typescript? Do I just edit the tsconfig.json?
Yes. That would take care of it.
This does not help with syntax highlighting, right?
For Create React App without using Craco in latest version (v5.0.1) , absolute import doesn't work. it's a bug. please revise the post. github.com/facebook/create-react-a...