[TypeScript] CRA์—์„œ tsconfig ์ ˆ๋Œ€๊ฒฝ๋กœ ์ง€์ •ํ•˜๊ธฐ
728x90

Today, What I learned?

์ฝ”๋“œ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ ์ค‘ ํ•˜๋‚˜์˜€๋˜ ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด๊ธฐ ๋„์ „ ๊ณผ์ •์„ ๊ธฐ๋กํ•ด ๋ณธ๋‹ค.. ๐Ÿ‘€

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— CRA๋กœ ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋‹ค๋ณด๋‹ˆ ๋ณ€๊ฒฝํ•ด ๋ณด๊ธฐ๊ฐ€ ๋˜ ์—ฌ๊ฐ„ ์‰ฌ์šด ์ผ์ด ์•„๋‹ˆ์—ˆ๋‹ค!..

ํ”ผ๋“œ๋ฐฑ!

 

 

์ฒซ ์‹œ๋„

์ฒ˜์Œ์—” tsconfig.json์— baseUrl๊ณผ paths๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ CRA๋กœ ์ƒ์„ฑ๋œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ์ธ์ง€๋ผ ๋‹จ์ˆœํžˆ tsconfig.json์— ๋ช‡๋ช‡ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜์ง€ ์•Š์•˜๋‹ค.

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

 

์™œ๋ƒ!.. CRA๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ„๊ฒฐํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ์›นํŒฉ ์„ค์ •์ด ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ์ˆจ๊ฒจ๋†“๊ณ  ์žˆ๋‹ค.
์ด ํŒŒ์ผ๋“ค์„ ์ปค์Šคํ…€ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด eject๋ฅผ ํ†ตํ•ด์„œ ์ถ”์ถœํ•ด์„œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

 

eject๋ฅผ ํ•˜๋ฉด ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€??

  • ํ•œ ๋ฒˆ ์ถ”์ถœํ•˜๊ณ  ๋‚˜๋ฉด ์„ค์ •๊ณผ ๊ด€๋ จ๋œ scripts ํด๋”, config.. pacakage.json์˜ ์˜์กด์„ฑ ๋“ฑ ํŒŒ์ผ๋“ค์ด ๋…ธ์ถœ๋œ๋‹ค.
  • ํ•œ ๋ฒˆ ์ถ”์ถœ๋˜๋ฉด ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค (!!)
  • ๋ฒ„์ „์—…์— ๋Œ€ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ถˆ๊ฐ€๋Šฅ..
  • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ ธ ์„ค์ •ํ•˜๋ ค๋Š” ๋ถ€๋ถ„์„ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค.

 

๊ณ ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ๋– ๋‚ฌ๋‹ค.

 

 

๋‘ ๋ฒˆ์งธ ์‹œ๋„

์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ craco ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. craco๋Š” Create-React-App Configuration Override์˜ ์•ฝ์ž๋กœ, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ eject ์—†์ด๋„ ์—ฌ๋Ÿฌ ์„ค์ •์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋‹ค.

 

์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ npm install @craco/craco --save
$ yarn add @craco/craco

 

 

์ด๋ ‡๊ฒŒ ์„ค์น˜ํ•œ ํ›„์—๋Š” package.json์˜ react-scripts start ์ด๋Ÿฐ ์‹์œผ๋กœ ๋˜์–ด์žˆ๋˜ script๋ฅผ craco๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

// package.json
...
"scripts": {  
    "start": "craco start",  
    "build": "craco build",  
    "test": "craco test",  
    "eject": "craco eject"  
}

 

 

์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด ํ˜„์žฌ craco-alias๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— (2023.02์›” ๊ธฐ์ค€) react-app-alias ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. (์ด ํŒจํ‚ค์ง€๊ฐ€ ์ข€ ๋” ํ™•์žฅ๋œ ํŒจํ‚ค์ง€์ธ๋“ฏ??) CracoAliasPlugin ์š” ๋ถ€๋ถ„์„ react-app-alias์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

// craco.config.js
const { CracoAliasPlugin } = require('react-app-alias');

module.exports = {
  plugins: [
    {
      plugin: CracoAliasPlugin,
      options: {
        source: 'tsconfig',
        baseUrl: '.',
        tsConfigPath: './tsconfig.paths.json',
      },
    },
  ],
};

 

 

paths๋ฅผ ์ข€ ๋” ์„ธ๋ถ„ํ™”ํ•ด์„œ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค. @components ์š”๋Ÿฐ ์‹์œผ๋กœ.. ๋‚˜๋Š” ์ผ๋‹จ ์ƒ๋Œ€๊ฒฝ๋กœ ์•ž์˜ ../../../ ๋ถ€๋ถ„๋งŒ ์—†์• ๋ณด๋ ค๊ณ  ์ด๋ ‡๊ฒŒ ์ ์šฉํ•ด ๋ณด์•˜๋‹ค.

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

tsconfig.json์— ์ž‘์„ฑํ–ˆ๋˜ tsconfig.paths.json ํŒŒ์ผ์„ extends๋กœ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

// tsconfig.json
{
  "compilerOptions": {
    ...
  },
  "include": ["src", "src/utils/Api.ts"],
  "extends": "./tsconfig.paths.json"
}

 

์ด๋ ‡๊ฒŒ ์ ์šฉํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

import { getSearchVideos } from '@/redux/modules/MediaSlice';

 

 

 

์ฐธ๊ณ 

 

[TS] CRA์—์„œ tsconfig paths๋กœ ์ ˆ๋Œ€๊ฒฝ๋กœ ์„ค์ •ํ•˜๊ธฐ (react-app-alias)

{ "compilerOptions": { "baseUrl": "./src", "paths": { "@components/*": ["./components/*"], "@assets/*": ["./assets/*"], "@styles/*": ["./styles/*"], "@contexts/*": ["./contexts/*"], "@hooks/*": ["./hooks/*"], "@utils/*": ["./utils/*"] } } } import Header f

tesseractjh.tistory.com

 

 

[์˜ค๋Š˜์˜์‚ฝ์งˆ#2] CRA ํ™˜๊ฒฝ์—์„œ tsconfig ์ ˆ๋Œ€๊ฒฝ๋กœ ์„ค์ •

๐Ÿง ๋ฐœ๋‹จ ๋ฆฌ์•กํŠธ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์•ž์„œ ํ•ญ์ƒ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ๊ณ ๋ คํ•ด ๋„ฅ์ŠคํŠธ(Next.js) ํ™˜๊ฒฝ์„ ์„ ํƒํ•  ์ง€, ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ฐฉ์‹์˜ ํ™˜๊ฒฝ์„ ์„ ํƒํ•  ์ง€ ๊ณ ๋ฏผ์— ๋น ์ง€

velog.io

 

728x90