본문 바로가기
웹 프론트엔드/React-Native

React Native : 절대 경로 설정하기 (+ 타입스트립트)

by 번데기 개발자 2022. 2. 1.
반응형

React Native를 개발하다 보면 절대 경로 설정을 하고 싶을 때가 있습니다.

 

이때 헤메시는 분들을 위해 간단하게 정리해보겠습니다.

 

 

1. babel-plugin-module-resolver 설치하기

 

먼저 아래와 같은 babel-plugin-module-resolver를 설치하여 줍니다.

npm i babel-plugin-module-resolver

 

 

2. babel.config.js에서 alias 설정하기

babel.config.js는 기본적인 babel에 대한 설정을 저장하고 있는 config 파일입니다.

 

기본적으로 React-Native 프로젝트는 다음과 같이 babel.config.js가 구성되어 있습니다.

 

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
};

 

이를 아래와 같이 바꿔줍니다.

 

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    [
      'module-resolver',
      {
        root: ['./src'],
        extensions: [
          '.ios.ts',
          '.android.ts',
          '.ts',
          '.ios.tsx',
          '.android.tsx',
          '.tsx',
          '.jsx',
          '.js',
          '.json',
        ],
        alias: {
          '~': './src',
          '@components': './src/components',
          '@screens': './src/screens',
          '@assets': './src/assets',
          '@query': './src/query',
        },
      },
    ],
  ],
};

제 경우에는 폴더구조가 src 폴더 안에 assets, components, screens 폴더가 있는 구조로 프로젝트가 구성되어 있어서 이에 대한 alias를 구성하여 빌드시 절대 경로로 해당 폴더에 접근할 수 있도록 설정하였습니다.

 

 

 

3. tsconfig.js 설정하기 (Typescript 사용시)

 

만약 타입 스크립트를 사용하신다면 tsconfig.js도 설정을 하셔야 코드상에서 오류가 나지 않습니다.

 

기본적으로 React Native 프로젝트에서 tsconfig.json은 다음과 같이 구성되어 있습니다. 

 

{
  "compilerOptions": {
    /* Basic Options */
    "target": "esnext",                       /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "lib": ["es2017"],                        /* Specify library files to be included in the compilation. */
    "allowJs": true,                          /* Allow javascript files to be compiled. */
    // "checkJs": true,                       /* Report errors in .js files. */
    "jsx": "react-native",                    /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    // "outDir": "./",                        /* Redirect output structure to the directory. */
    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "removeComments": true,                /* Do not emit comments to output. */
    "noEmit": true,                           /* Do not emit outputs. */
    // "incremental": true,                   /* Enable incremental compilation */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    "isolatedModules": true,                  /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true,                           /* Enable all strict type-checking options. */
    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
    // "strictNullChecks": true,              /* Enable strict null checks. */
    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */

    /* Additional Checks */
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */

    /* Module Resolution Options */
    "moduleResolution": "node",               /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
    // "types": [],                           /* Type declaration files to be included in compilation. */
    "allowSyntheticDefaultImports": true,     /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
    "skipLibCheck": false,                    /* Skip type checking of declaration files. */
    "resolveJsonModule": true                 /* Allows importing modules with a ‘.json’ extension, which is a common practice in node projects. */

    /* Source Map Options */
    // "sourceRoot": "./",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "./",                       /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
  },
  "exclude": [
    "node_modules", "babel.config.js", "metro.config.js", "jest.config.js"
  ]
}

 

여기서 아래 부분을 추가하여 줍니다.

 

{
  "compilerOptions": {
    ...
    "baseUrl": "./src",
    "paths": {
      "~/*": ["./*"],
      "@components/*": ["components/*"],
      "@screens/*": ["screens/*"],
      "@assets/*": ["assets/*"],
      "@query/*": ["query/*"]
    },
    ...
  }  
}

 

제가 사용할 경로인 @components, @screens, @query, @assets 들을 위와 같이 추가하여 줍니다.

 

baseUrl을 기준으로 각각의 폴더의 하위 모든 파일들을 @를 이용한 경로로 치환하는 설정입니다.

 

 

4. 적용 후 테스트

 

 

설정 후 절대 경로에서 해당 컴포넌트나 파일들을 잘 가져오는 것을 확인할 수 있습니다.

 

궁금한 점 있으면 아래 질문 부탁드립니다.

 

감사합니다.

반응형