최종 프로젝트를 시작 하기 전 했었던 두번의 프로젝트를 겪으면서 느낀 것이 있었다.
프로젝트가 점점 복잡해지고 컴포넌트나 함수들을 다양한 이름이나 계층의 폴더에 두고 import 해서 사용하다보니
import 경로 깊이가 너무 깊어져 사용이 힘들고 알아보기도 힘들었다.
그리고 가끔 ide 삑사리나면 자동완성 안떠서 직접 넣을 때 있는데 짜증난다.
nextjs
를 공부할 때는 이것저것 참고하다보니 설정하는게 있어서 설정하고 사용했었는데
CRA에서는 어떻게 해야할지 몰라 조사해보았다.
찾아보니 ts.config
와 webpack
설정을 바꾸면 된다고 하는데 이는 복잡하다고 하였고
craco
라는 라이브러리를 알게되어 설정할 수 있었다!
Create React App Configuration Override 즉 CRA를 위한 라이브러리인데
config
설정을 CRA
에 상속하여 따로 뭘 건드리지 않고 추가적인 설정을 부여할 수 있게 해주는 것이다.
루트경로에 craco.config.js
를 추가함으로 eslint, babel 등을 쉽게 설정할 수 있다고 한다.
설치
npm i @craco/craco // craco 라이브러리
npm i -D craco-alias // directory alias
tsconfig에 넣을 설정 json 파일 작성하기
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@yourdir/*": ["./yourdir/*"],
}
}
}
craco.config.js 파일 작성하기
const CracoAlias = require('craco-alias');
module.exports = {
plugins: [
{
plugin: CracoAlias,
options: {
source: 'tsconfig',
baseUrl: './적용할루트폴더(ex: src)',
tsConfigPath: './앞에서만든파일.json',
},
},
],
};
tsconfig.ts 파일에 override 설정
"extends": "./tsconfig.paths.json"
package.json에서 실행 스크립트 수정
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
},
사용하기
import usePopState from '@hooks/usePopState';
import { useAppDispatch, useAppSelector } from '@redux/hooks';
import { clearAllGamePlayState } from '@redux/modules/gamePlaySlice';
import { addChat, clearScore, updateRoom } from '@redux/modules/gameRoomSlice';
import { clearPlayerStream } from '@redux/modules/playerMediaSlice';
import { clearMedia } from '@redux/modules/userMediaSlice';
import { userApi } from '@redux/query/user';
import { alertToast } from '@utils/toast';
import CamList from '@components/game/CamList';
어느 깊이에서 import
해와도 늘 같은 경로 규칙으로 적용할 수 있다.
가독성 측면에서의 장점도 있지만 해당 파일(import를 이것저것 해오는)의 경로자체가 변경이 일어날 때도 alias
처리 된 모듈의 import
부분은 변경되지 않는다는 것도 있을 것 같다!
설정하는데 10분도 안걸리는데 길게 개발을 해야될 것 같은 프로젝트라면 되도록 적용을 하는 편이 좋을 것 같다는 생각이 들었다.
deprecated
되어서 사실은 사용하면 안되지만 이미 설정하고 나서 적용한 뒤에 알았다.
보통 deprecated
되면 사용할 때 ide에서 늘 줄 을 보여줘서 알았는데 안보여줘서 몰랐다.
문서 좀 보려고 깃허브 들어갔다가 대문짝만하게 deprecated 되었다고 써있어서 무안했다.
react-app-alias 이걸 쓰라고 한다.