매일 npm을 사용하는 개발자라면 읽을 가치는 충분한 책, npm Deep Dive을 완독하고 이에 대해 이야기해보려고 한다.
어쩌다 해당 책의 완독 챌린지를 모집하는 공지를 보았는데 아주 찔리는 문구가 있었다. '언젠가는 제대로 공부해야지..' 너무 공감가는 문구에 챌린지에 참여했고, 혼자 읽었다면 완독에 어려움이 있을 수도 있었지만 한달 동안 함께한 챌린저들이 있어서 읽어낼 수 있었다.
npm의 역사로 시작해서
npm, yarn, pnpm의 비교 분석, CommonJS와 ESModule의 역사와 차이점, 트랜스파일러와 폴리필 등을 다룬다.
또한 끝에는 npm 패키지와 CLI 도구 및 모노레포를 이용한 프로젝트 예제가 있어서 패키지를 직접 다뤄보며 이해할 수 있었다.
package.json )
‘들어가며’ 장에서 언급하는 peer update --force 를 사용하는 개발자 중 1명으로 살짝 찔렸었다. package.json는 dependencies와 script를 파악할 때 보는 것이 대부분이었는데, 앞으로는 package.json의 다른 영역도 자주 보게될 것 같다.
유령의존성 )
'유령의존성(phantom dependency)'이란 평탄화 작업으로 인해 실제 의존성으로 선언하지 않은 패키지가 실행 가능해지는 문제를 말한다. 사실 이 개념을 알기 전에 이전 직장에서 멀티레포에서 모노레포로 전환하는 과정에서 해당 경험을 한 적이 있는데, "아, 이래서 그랬구나!"하고 깨달았다. 덕분에 다음 프로젝트에서는 npm보다는 pnpm을 사용하려고 한다.
CommonJS와 ESModule )
부끄럽지만 단순히 서버단은 CommonJs 브라우저단은 ESModule이라고 어렴풋이 생각하고 있었는데, 이는 단순히 문법 차이만이 아니라 모듈 시스템 전체의 차이였다.
CommonJS - require()가 런타임에서야 사용될 모듈이 동적으로 결정되어, 빌드 시점에는 실제로 어떤 모듈을 사용하는지 몰라 트리쉐이킹 최적화가 어렵다.
ESModule - mport, export문을 통해 모듈을 정적으로 로드하고, 모듈 파싱 -> 모듈 인스턴스화 -> 모듈 평가 순으로 진행된다.
약 1000쪽에 달하는 저서다보니 5권으로 분철해서 들고다니며 읽었다
챌린지를 진행하면서 책에서도 물론 아주 많은 정보를 얻어갔지만 다른 챌린저분들의 인사이트를 읽으면서 때마다 알아가는 꿀팁이나 견해도 좋았다. 특히 기억나는 건 pnpm에서 npm을 막는 꿀팁과 '정답은 없다. CJS는 현실이고, ESM은 방향이다. 지금은 둘 다 함께 가는 과도기다.'라고 하신 견해가 기억에 남는다.
또한 중간에 구름톤에 참가할 일정이 생겨 디자인 시스템을 다룬 모노레포 프로젝트를 다룬 8장을 해커톤 이후에 읽게 되었는데, 구름톤에서 구름의 디자인시스템인 vapor를 사용하면서 흥미가 생긴 부분을 어느정도 해소할 수 있었다. 앞으로 디자인 시스템을 작업할 일이 생기면 모노레포 방식으로 제작하며 해당 파트를 사전처럼 옆에 두고 함께 할 것 같다.
단순히 이론뿐아니라 실제 npm 생태계에서 있었던 사건이나 사례를 바탕으로 이야기가 전개된다는 점이 재밌고, 의문을 가질말한 부분도 짚어서 작가분의 의견을 제시해줘서 이해할 수 있었다.
방대한 양으로 모든 내용을 체득하기는 어려워도, 해당 책을 읽음으로써 npm에 대한 이해도를 올라가는 건 확실하다. 프런트엔드 개발자라면 한번 쯤은 읽어보는 것을 추천한다.