Skip to content

Instantly share code, notes, and snippets.

@silverprize
Last active November 22, 2022 07:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save silverprize/c208bda2f5e2429cbbab66388f13551f to your computer and use it in GitHub Desktop.
Save silverprize/c208bda2f5e2429cbbab66388f13551f to your computer and use it in GitHub Desktop.
[macOS] webpack-dev-server reload loop

webpack-dev-server 모듈 기반으로 구성된 프런트엔드 개발환경에서 불시에 페이지 무한 리로드를 발생시키는 문제가 있어 코드를 쫓아가 보았다.
webpack-dev-server -> chokidar -> fsevents 관계로 의존하고 있다.

chokidar 모듈은 파일 시스템 watch를 사용하기 좋게 만든 모듈이고 fsevents 모듈은 macOS 파일시스템 이벤트를 감지하는 모듈이다.
macOS 파일 시스템 이벤트 목록은 아래 링크에서 볼 수 있다.
https://developer.apple.com/documentation/coreservices/1455361-fseventstreameventflags?language=objc
즉, fsevents 모듈은 chokidar 모듈의 엔진이라고 볼 수 있다.

무한 리로드 현상은 위 링크의 이벤트중에서 "kFSEventStreamEventFlagMustScanSubDirs & kFSEventStreamEventFlagKernelDropped" 으로 조합된 이벤트가 발생했을때 시작된다.
macOS는 이 이벤트가 발생하는 원인을 해결할 때까지 이벤트를 계속 보내준다.

chokidar 모듈에서 이 이벤트에 대한 고려가 없어 엉뚱하게 변경(추가/삭제/이름 변경)이 발생했을때 전파하는 이벤트를 보내준다.
webpack-dev-server 모듈에서는 이 이벤트를 받으면 웹 브라우저에게 리로드하라는 메시지를 보내게 되어있다.
macOS가 "kFSEventStreamEventFlagMustScanSubDirs & kFSEventStreamEventFlagKernelDropped" 이벤트를 계속 보내주고 chokidar 모듈은 엉뚱한 이벤트를 webpack-dev-server 모듈로 보내고 무한 리로드하게 된다.

"kFSEventStreamEventFlagMustScanSubDirs & kFSEventStreamEventFlagKernelDropped" 이벤트가 발생했을때 애플리케이션에서 어떻게 해야 더이상 발생하지 않게 할수있는지는 찾지 못하였다.

"kFSEventStreamEventFlagMustScanSubDirs & kFSEventStreamEventFlagKernelDropped" 이벤트 발생을 멈추는 방법은 지금으로서는 macOS 재시작 밖에 모르겠다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment