• [monorepo] hot reload 적용 :: 마이구미
    React 2022. 9. 13. 20:16
    반응형
    이 글은 모노레포 환경에서 핫 리로드를 적용하는 글을 다룬다.
    모노레포에 대해서는 다루지 않는다.
    예제는 CRA 를 기준으로 작성된다.
    CRA 를 사용하지 않더라도, 도움을 얻을 수 있는 정보가 있을 것이라 생각한다.
    예제 코드 - https://github.com/hotehrud/monorepo-react
    참고 자료 - https://muguku.medium.com/fix-go-to-definition-and-hot-reload-in-a-react-typescript-monorepo-362908716d0e

     

    개발 환경을 모노레포로 구성하는 경우에 핫 리로드 기능의 확장을 원할 수 있다.

    기본적으로 CRA 로 환경을 구성하면 핫 리로드는 기본적으로 적용되어있다.

    코드를 수정하고 저장하면 자동적으로 업데이트된 코드가 적용되는 것을 확인할 수 있다.

    하지만 모노레포로 구성한다면, 원했던 결과를 보지 못하는 경우가 존재한다.

     

    packages/app // CRA 로 셋팅된 프로젝트
    packages/components // 공용으로 사용될 컴포넌트 모듈

     

    app 내부에서 코드 변경에 따른 핫 리로드는 정상적으로 동작한다.

    하지만 app 을 벗어난 별도의 패키지 components 내부의 파일 변경시에는 핫 리로드가 발생하지 않는다.

    다시 app 을 실행해야만 변경된 코드가 적용되어 업데이트된 결과를 볼 수 있게 된다.

     

    그렇다.

    이 글은 components 내부의 코드 변화에도 app 의 핫 리로드 기능이 동작하게 하는 것이 목적이다.

    적용 방법은 간단하다.

     

    기본적으로 CRA 내부에서 핫 리로드에 대한 watch 는 /src 디렉토리를 기준으로 설정되어있다.

    /src 디렉토리 내부 파일들이 변경되면, 자동으로 이것을 탐지하여 리로드하는 것이다.

     

    그렇기에, app 내부의 코드 변화는 탐지하여 리로드가 가능했다.

    하지만 /components 의 경우에는 /src 디렉토리 범위에서 벗어나기 때문에 코드 변화를 탐지할 수 없었던 것이다.

    결과적으로 기본값으로 설정된 /src 를 변경해주면 되는 것이다.

     

    CRA 설정을 커스텀하기 위해서는 craco 또는 react-app-rewired 를 사용할 수 있다.

     

    // craco.config.ts
    const cracoConfig = {
      webpack: {
        configure: (config: any) => {
          removePlugins(config.resolve, pluginByName('ModuleScopePlugin'))
    
          const { isFound, match } = getLoader(
            config,
            loaderByName('babel-loader'),
          ) as any
    
          if (isFound) {
            match.loader.include = undefined
            match.loader.exclude = /node_modules/
          }
    
          return config
        },
      },
    }​

     

    우선 ModuleScopePlugin 을 제거한다.

    이 플러그인은 CRA 에서 /src 를 벗어난 범위의 import 를 막는 기능이라고 볼 수 있다.

    우리가 원하는 것은 /src 외부를 포함하는 것이기에, 이 플러그인을 제거한다.

     

    바벨 /src 외부의 변화를 탐지하기 위해서 include 를 수정해준다.
    기본값으로는 /src 를 가르키고 있다.

     

    결과적으로 모노레포로 구성될 경우에도 모든 패키지의 코드 변화를 탐지할 수 있게 된다.

     


    https://github.com/hotehrud/monorepo-react

    예제는 clone 한 후 쉽게 확인해볼 수 있다.

    1. yarn start
    2. app/App.tsx 수정 => 핫 리로드 확인
    3. componetns/Button.tsx 수정 => 핫 리로드 확인
    반응형

    댓글

Designed by Tistory.