react-native & expo에서 ts paths alias 사용하기

모성종·2023년 7월 30일

React를 포함한 프론트엔드 프로젝트를 진행하다보면 소스파일의 폴더구조가 깊어지고 해당 코드를 import 하려면 상대참조로 너무 길어져서 읽기어렵고 복잡하게 보이는 경우가 있다.

이럴 경우 typescript의 paths alias 기능을 사용하면 훨씬 가독성있게 설정할 수 있다.

예시
설정 전

import util from '../../../../src/funcs/util';

설정 후

import util from '@funcs/util';

1. tsconfig.json

프로젝트 폴더 최상위에 있는 tsconfig.json 파일에 paths 옵션에 경로를 축약하고싶은 값을 입력한다.

{
  "compilerOptions": {
    "baseUrl": ".", 
    "paths": {
      "@components": ["./src/components/module"],
      "@funcs": ["./src/funcs"],
      "@api": ["./src/api/api"],
      "@styles": ["./src/components/styles"]
    }
  }
}

이렇게까지만 해도 에디터 상에서는 문제없이 /src/funcs 경로를 @funcs 라는 별칭으로 자동완성이 되고 import도 할 수 있다.

하지만 실제로 실행해보거나 build하게되면 해당 module을 찾을 수 없다는 오류가 발생할 것이다.

React, React-Native 등의 코드는 babel을 통해 js로 트랜스파일링되는데 소스코드 상에 작성한 @funcs/util의 경로는 babel이 모듈로 인식하여 node_modules에서 찾아서 그렇다. node_modules가 아니라 내가 정한 path 규칙에 맞는 폴더경로를 찾도록 하려면 추가 패키지를 설치 후 babel 설정을 해줘야 한다.

2. module resolver 설치

npm install --save-dev babel-plugin-module-resolver

3. babel.config.js 수정

react-native 를 expo로 시작했다면 최상위 경로에 babel.config.js 파일이 있을 것이다.

다음과 같이 plugins에 module-resolver 관련 설정을 추가해준다.

module.exports = function (api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
    plugins: [
      "expo-router/babel",
      [
        "module-resolver",
        {
          root: ["."],
          alias: {
            "@components": "./src/components/module/",
            "@funcs": "./src/funcs/",
            "@api": "./src/api/api",
            "@styles": "./src/components/styles/",
          },
        },
      ],
    ],
  };
};

여기까지하면 에디터 상에서 자동완성, import 는 물론이고 실행했을 때도 정상적으로 동작한다.
alias로 등록한 경로에 index.ts 을 만들어서 named export 를 등록해두면 import할 때 저 효율적으로 할 수 있을 것이다.

profile
FE Developer

1개의 댓글

comment-user-thumbnail
2023년 7월 30일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기