이벤트 루프는 환경마다 다를까?
Javascript의 모든 코드는 이벤트 루프에서 처리된다. 그리고 Node.js의 이벤트 루프 구현체로 libuv가 사용 된다는 사실은 널리 알려져 있다. 그런데 이상하지 않은가?
왜 Node.js를 설명할 때 이벤트 루프의 구현체라며 따로 소개하는 걸까?
과연 브라우저 상의 이벤트 루프와 Node.js의 이벤트 루프는 동일하다고 생각해도 될까?
이벤트 루프 구현체가 다르다는 것을 어떻게 생각하면 좋을까?
원인은 환경 차이
이벤트 루프의 처리 방식은 스펙으로 결정돼있지만 벤더마다 약간씩 다르게 구현하는 부분이 있다고 한다. Node.js 또한 예외는 아니다.
기능 | 브라우저 | NodeJs |
---|---|---|
File, Network I/O | No | Yes |
Event의 종류 | Mouse, Keyboard Events | File, Network I/O |
이벤트 루프 구현체 | libevent (크롬 기준) | libuv |
자바스크립트 엔진 | V8 (크롬 기준) | V8 |
process.nextTick (process 모듈 자체 API) | No | Yes |
setImmediate (ECMA 표준 아님) | No | Yes |
위 표 이외에 처리 순서의 차이가 약간 있긴 하지만 Node v11부터는 그 차이마저 적은 편이다.
결론: 환경의 차이 때문에 약간의 구현 상의 차이가 있다 정도로 받아들이자.
이벤트 루프는 환경마다 다를까?