Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make an import shortcut/alias in create-react-app?

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.

like image 945
a b Avatar asked Jul 24 '20 05:07

a b


People also ask

How do I add an alias to react?

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.

How do I import another file into react?

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 .

How import outside SRC react?

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.


Video Answer


3 Answers

NOTE FOR CONFUSING TERMS

// 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; 

VSCode IntelliSense

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'; 
like image 77
Dennis Vash Avatar answered Sep 24 '22 12:09

Dennis Vash


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.

like image 52
Igor Sukharev Avatar answered Oct 24 '22 02:10

Igor Sukharev


Simplest way to archive this follow below steps. (same way as @DennisVash showed as but in simple form)

  1. Installation - install and setup CRACO.
yarn add @craco/craco

# OR

npm install @craco/craco --save
  1. Create a 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'),
    }
  },
};
  1. Update the existing calls to 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"
}

Done! Setup is completed.

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. :)

like image 43
dipenparmar12 Avatar answered Oct 24 '22 03:10

dipenparmar12