특정 컴포넌트나 파일을 import할 시 경로의 depth가 깊어지면 깊어질수록 import하려는 파일의 위치에 따라 상대경로가 상당히 길어질 수 있다.
import deep from '../../../../../../../A/B/C/file.js';
import deep1 from '../../../../../../../A/B/C/file1.js';
import deep2 from '../../../../../../../A/B/C/file2.js';
import deep3 from '../../../../../../../A/B/C/file3.js';
import deep4 from '../../../../../../../A/B/C/file4.js';
이런 식으로 상대경로가 길어지면 import할 파일을 찾기위한 수고가 커지고 가독성 면에서도 좋지 않다.
이런 경우 tsconfig.json
또는 jsconfig.json
의 설정을 통해 절대경로를 설정할 수 있다.
typscript에 대한 설정을 할 수 있는 파일이며 javascript로 이루어진 레포지토리라면 jsconfig.json
을 사용한다.
해당 레포지토리가 Typescript를 사용하고 있다면 루트 디렉토리에 tsconfig.json
이 존재해야며 tsc명령어를 통한 컴파일시 로드한다.
컴파일러에 대한 옵션 설정과 더불어 다양한 기능을 제공한다.
// tsconfig.json의 예시
{
"compilerOptions": {
...
},
"include": [...],
"exclude": [...]
}
tsconifg.json에서 compilerOptions 옵션의 baseUrl과 paths를 이용해서 절대경로를 설정한다.
baseUrl의 경우 paths를 설정하기 위해서는 반드시 설정해야하는 옵션이다.
paths의 경우 key-value쌍으로 이루어진 객체이며 절대경로를 정의하고자 하는 경로의 이름을 key에 입력하며 baseUrl을 기준으로 상대적인 경로를 value에 입력한다.
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".", // 이 경우는 `tsconfig.json`이 존재하는 루트 디렉토리를 기준으로 삼는다.
"paths": {
"@_components/*": ["src/components/*"],
"@_apis/*": ["src/api/*"],
"@_types/*": ["src/types/*"],
"@_icons/*": ["public/assets/icons/*"],
"@_images/*": ["public/assets/images/*"],
"@_emojis/*": ["public/assets/emoji/*"]
}
}
}
위와 같은 paths를 지정한다면 실제로 루트 디렉토리를 기준으로한 구조는 다음과 같다.
Root
├─ public
│ └─ assets
│ ├─ icons
│ ├─ images
│ └─ emojis
└─ src
├─ components
├─ api
└─ types
실제로 적용된 예시를 보자
import path1 from '@_components/home/main.tsx';
import path2 from '@_icons/sample.png';
import path2 from '@_apis/member'
특정 파일뿐만 아니라 모듈도 절대경로로 지정이 가능하다.
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"jquery": ["node_modules/jquery/dist/jquery"]
}
}
}
절대경로를 추가하는 paths가 늘어나면tsconfig.json
의 extends옵션을 이용해서 따로 빼놓는 것도 가능하다.
기본 config 파일을 읽어온 후 extends에 지정한 파일에 의해 오버라이딩(overridden) 된다. include나 exclude에 정의한 파일의 경우 기본 config 파일을 덮어쓴다.(overwrite)
extends 옵션은 스트링값으로만 받는다. 여러 설정 파일을 extend하고 싶다면 줄줄이 이어받는 구조를 만들어야한다.
// tsconfig.a.json
{
"compilerOptions": {
...
},
}
// tsconfig.b.json
{
"compilerOptions": {
...
},
"extends": "./tsconfig.a.json"
}
// `tsconfig.json`
{
"compilerOptions": {
...
},
"extends": "./tsconfig.b.json"
}
위에 설정한 파일을 따로 만들어 저장해둔다. 파일명은 어떤식으로 지어도 상관없으며, 어느 디렉토리에 속해도 된다. json형식이면 된다.
tsconfig.path.json
을 루트 디렉토리에 만들어 사용할 수도 있다.
// tsconfig.paths.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@_components/*": ["src/components/*"],
"@_apis/*": ["src/api/*"],
"@_types/*": ["src/types/*"],
"@_icons/*": ["public/assets/icons/*"],
"@_images/*": ["public/assets/images/*"],
"@_emojis/*": ["public/assets/emoji/*"]
}
}
}
tsconfig.json
에 extends옵션을 추가한 뒤 확장하고자하는 json을 파일을 tsconifg.json
을 기준으로한 상대경로로 입력해준다.
// tsconifg.json
{
"compilerOptions": {
...
},
"extends": "./tsconfig.paths.json"
}
참고