개발을 하다 보면 직접 만든 utils 또는 프론트엔드의 경우 components 폴더, styles 폴더 등 현재 작업 파일과 다른 경로의 파일들을 import 시켜야 할 때가 있다.
import 시킬 필요가 없는 파일은 아주 단순한 스크립트이거나 온갖 로직을 하나의 파일에 다 작성할 때인데 별로 좋지 않은 패턴이다.
그래서 파일의 상단에는 다음과 같은 현상이 일어난다.
import styled from 'styled-components';
import { TextField } from '../../components/textfield';
...
line 1과 line2가 import 방식이 조금 다른 것을 알 수 있다.
line 1의 styled의 경우 styled-components라는 npm 패키지 모듈로써 프로젝트의 최상단 경로에 있는 node_modules 폴더에 있기 때문에 node.js 프로젝트라면 별도로 앞에 경로를 붙이지 않아도 잘 작동한다.
line 2의 TextField의 경우 프로젝트 내에서 직접 작성한 UI 컴포넌트이다.
"../" 이란 현재 파일의 바로 상위의 경로를 뜻하며, 따라서 "../../"란 현재 파일의 경로보다 두 단계 위의 경로를 뜻한다.
즉, "../../components/textfield"란 현재 파일 기준 두 단계 위의 상위 경로에 있는 components 폴더로 접근해서 그 하위에 있는 textfield라는 경로에서 모듈을 가져오라는 말이다.
이런 방식이 좀 예쁘진 않아도 일단 작동하는데는 문제가 없지만 추후 계속 프로젝트를 작성하거나 리팩토링 할 때 문제가 발생할 수 있다.
만약 현재 파일이 존재하는 경로 기준 하위 경로의 파일에서 같은 모듈을 불러온다면 다음과 같이 import 할 것이다.
import styled from 'styled-components';
import { TextField } from '../../../components/textfield';
...
TypeScript 프로젝트에서는 tsconfig.json 파일이 프로젝트 최상단 경로에 존재하게 되는데, 거기서 여러 편의 설정을 할 수 있다.
{
"compilerOptions": {
...,
"baseUrl": ".",
...
},
...
}
위와 같이 compilerOptions에 baseUrl을 "."으로 설정하면 기본 경로를 프로젝트 최상단으로 설정하겠다는 말이다.
그럼 아래와 같이 점박이들을 다 없애고 깔끔하게 작성할 수 있다.
import styled from 'styled-components';
import { TextField } from 'src/components/textfield';
...
이렇게 작성하면 현재 파일과 다른 경로에 파일을 만들어서 동일한 모듈을 import하려고 복사 붙여넣기를 할 때 별도로 경로를 바꾸지 않아도 된다.
아무리 depth가 깊은 곳에 있는 파일이라도 TextField라는 모듈을 불러올 때 모두 동일하게 작성할 수 있다.
하지만 이것도 예쁘지 않고 뭔가 좀 비효율적이라는 생각이 든다.
웬만한 모듈들은 다 src 하위에 있을 거라 일단 죄다 앞에 src를 붙여야 한다.
그렇다고 baseUrl을 "./src" 이렇게 설정하기에는 프로젝트 최상단에 있는 여러 각종 파일이나 폴더 등이 영향을 받을 수도 있다.
그래서 다음과 같이 "paths"를 추가 설정을 한다.
{
"compilerOptions": {
...,
"baseUrl": ".",
"paths": {
"components/*": [
"src/components/*"
],
"pages/*": [
"src/pages/*"
],
"styles/*": [
"src/styles/*"
],
"utils/*": [
"src/utils/*"
],
},
...
},
...
}
그럼 파일에서는 다음과 같이 import해도 된다.
import styled from 'styled-components';
import { TextField } from 'components/textfield';
...
아름답다.
'개발 > JavaScript, TypeScript' 카테고리의 다른 글
Typescript 타입을 배열로 정의해보자 (0) | 2021.12.21 |
---|---|
node.js 및 npm 버전 업데이트 (0) | 2021.05.15 |
Array의 반복 관련 메서드(2) - reduce (0) | 2021.05.14 |
Array의 반복 관련 메서드(1) (0) | 2021.05.04 |
반복문 - while문, break, continue, 무한루프 (0) | 2021.05.04 |