How to set import shortcuts/aliases in create-react-app? From this:
import { Layout } from '../../Components/Layout'
to this:
import { Layout } from '@Components/Layout'
I have a webpack
4.42.0 version.
I don't have a webpack.config.js file in the root directory. I've tried to create one myself with this code inside:
const path = require('path')
module.exports = {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src/'),
}
}
};
But it doesn't seem to work. I've seen the NODE_PATH=.
variant in .env
file. But I believe, it is deprecated - better not to use. And also, I have a posstcss.config.js
file. Because I've installed the TailwindCss and I import the CSS library there. I've tried to paste the same code there, but it also didn't work.
Now inside the root directory create a file with the name config-overrides. js and paste the below code. Here we are first importing {alias} from react-app-rewire-alias. After that, we are adding an object with key-value pairs inside alias where the key is your path definition and the value is the path.
To import a component from another file in React:Export the component from file A , e.g. export function Button() {} . Import the component in file B as import {Button} from './another-file' . Use the imported component in file B .
To import component outside src/ directory with React, we can declare a local dependency on package. json. { //... "dependencies": { "app-b-dashboard": "file:./packages/app-b-dashboard" //... } //... } to declare the app-b-dashboard dependency in the dependencies section of package.
// Absolute path: paths which are relative to a specific path import Input from 'components' // src/components import UsersUtils from 'page/users/utils' // src/page/users/utils // Alias path: other naming to specific path import Input from '@components' // src/components import UsersUtils from '@userUtils' // src/page/users/utils
In order for webpack's aliases to work, you need to configure the default webpack.config.js
of create-react-app
.
The official way is to use the eject
script.
But the recommended way is to use a library without ejecting, like craco
.
After following the installation, add craco.config.js
to your root folder with the desired configuration.
My example:
// craco.config.js const path = require(`path`); const alias = require(`./src/config/aliases`); const SRC = `./src`; const aliases = alias(SRC); const resolvedAliases = Object.fromEntries( Object.entries(aliases).map(([key, value]) => [key, path.resolve(__dirname, value)]), ); module.exports = { webpack: { alias: resolvedAliases, }, };
Where aliases.js
(./src/config/aliases
) exports a helper function:
const aliases = (prefix = `src`) => ({ '@atoms': `${prefix}/components/atoms`, '@molecules': `${prefix}/components/molecules`, '@organisms': `${prefix}/components/organisms`, '@templates': `${prefix}/components/templates`, '@components': `${prefix}/components`, '@config': `${prefix}/config`, '@enums': `${prefix}/enums`, '@hooks': `${prefix}/hooks`, '@icons': `${prefix}/components/atoms/Icons`, '@styles': `${prefix}/styles`, '@utils': `${prefix}/utils`, '@state': `${prefix}/state`, '@types': `${prefix}/types`, '@storybookHelpers': `../.storybook/helpers`, }); module.exports = aliases;
In addition, you should add jsconfig.json
file for path IntelliSense in VSCode (or tsconfig.json
), see followup question.
Now such code with IntelliSense will work:
// NOTE THAT THOSE ARE ALIASES, NOT ABSOLUTE PATHS // AutoComplete and redirection works import {ColorBox} from '@atoms'; import {RECOIL_STATE} from '@state';
It is finally possible with Create React App v.3
Just put:
{
"compilerOptions": {
"baseUrl": "src"
},
"include": ["src"]
}
into jsconfig.json
or tsconfig.json
if you use Typescript
Here is wonderful article about this.
Simplest way to archive this follow below steps. (same way as @DennisVash showed as but in simple form)
yarn add @craco/craco
# OR
npm install @craco/craco --save
craco.config.js
file in the root directory and configure CRACO:/* craco.config.js */
const path = require(`path`);
module.exports = {
webpack: {
alias: {
'@': path.resolve(__dirname, 'src/'),
'@Components': path.resolve(__dirname, 'src/components'),
'@So_on': path.resolve(__dirname, 'src/so_on'),
}
},
};
react-scripts
in the scripts section of your package.json
file to use the craco CLI:/* package.json */
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test"
}
Now let's test it.
// Before
import Button from "./form/Button"
import { Layout } from '../../Components/Layout'
// After
import Button from "@/form/Button"
import { Layout } from '@Components/Layout'
Documentation Craco
Thank you. :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With