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 재시작 밖에 모르겠다.