pino-pretty strip-json-comments "ERR_REQUIRE_ESM" 해결하기

감자·2025년 9월 3일
0

회고

목록 보기
7/7

개요

개인적으로 진행해보는 프로젝트에서 서버의 로그를 쌓기 위해 멘삼딱 강의를 따라하면서 사용했던 pino라는 라이브러리를 사용하였다. 그런데 강의를 따라할 때는 발생하지 않았던 ERR_REQUIRE_ESM 오류가 발생하였다.
해당 오류는 node v20.19.0 버전 미만 환경이 아니라면 발생하지 않았을 수도 있다.

오류 원인과 해결책

해결만 빠르게 하고 싶은 사람들을 위해 원인과 해결책 부터 적어보았다.

원인

pino-pretty 13.0.0 버전에서 13.1.0으로 업데이트 과정에서 strip-json-comments 의존성을 v3 -> v5로 변경되었는데 해당 버전은 pure ESM 으로 변경되었다. 그런데 13.1.0 버전에서 여전히 require('strip-json-comments')로 사용하고 있어 오류가 발생한다

해결책

  1. Node 버전 변경하기
    v20.x라면 v20.19 이상 버전 혹은 v22 버전 이상에서는 puse ESM 모듈을 require 구문으로 사용하여도 오류가 발생하지 않는다.
    • node v20.x을 유지해야 한다면, 메이저 버전만 v20.19.0 버전 이상으로 변경 으로 바꾸면 해결됨
    • node v22 혹은 v23버전 사용하기
  2. pino-pretty 다운그레이드 하기
    • 해당 오류는 최신 13.1.1 부터 발생하는 문제이기 때문에 이전버전으로 다운그레이드하면 해결됨

오류 찾아가 보기

터미널 오류 파악하기

yarn node v1.22.18
✨  Done in 0.26s.
(node:21997) ExperimentalWarning: `--experimental-loader` may be removed in th
e future; instead use `register()`:
--import 'data:text/javascript,import { register } from "node:module"; import 
{ pathToFileURL } from "node:url"; register("extensionless", pathToFileURL("./
"));'
(Use `node --trace-warnings ...` to show where the warning was created)
yarn run v1.22.18
$ /Users/jeongjeongsu/cursor/game/course/apps/web/node_modules/.bin/pino-prett
y --singleLine
/Users/jeongjeongsu/cursor/game/course/node_modules/.pnpm/pino-pretty@13.1.1/n
ode_modules/pino-pretty/bin.js:14
const { default: stripJsonComments } = require('strip-json-comments')
                                       ^

Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/jeongjeongsu/cursor/gam
e/course/node_modules/.pnpm/strip-json-comments@5.0.3/node_modules/strip-json-
comments/index.js from /Users/jeongjeongsu/cursor/game/course/node_modules/.pn
pm/pino-pretty@13.1.1/node_modules/pino-pretty/bin.js not supported.
Instead change the require of index.js in /Users/jeongjeongsu/cursor/game/cour
se/node_modules/.pnpm/pino-pretty@13.1.1/node_modules/pino-pretty/bin.js to a 
dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/Users/jeongjeongsu/cursor/game/course/node_modules
/.pnpm/pino-pretty@13.1.1/node_modules/pino-pretty/bin.js:14:40) {
  code: 'ERR_REQUIRE_ESM'
}

Node.js v20.11.0

터미널의 문구를 보면 pino-pretty 파일에서 const { default: stripJsonComments } = require('strip-json-comments')에서 require() of ES Module 라는 문구를 보면 strip-json-comments이 문제일거라는 추측해볼 수 있었다.

원인을 어떻게 찾지?

왜 발생했을까 추측해보기

이전에 발생하지 않던 오류가 왜 발생했는지 생각해보니, 신규 프로젝트를 진행하면서 pino-prettey 최신 버전을 설치와 yarn에서 pnpm 변경하였는데 이 부분에 문제가 있지 않을까 생각하고 원인을 찾아보기로 했다.

GPT 물어보기? github에서 찾아보기? 구글링? 어디서 찾아야하지

요즘 오류가 발생하면 구글링보다는 gpt를 통해 원인을 찾아보는데, 라이브러리의 최신 버전 사용한 경우 gpt 등과 같은 챗봇에서는 과거 버전의 해결책을 제안해주는 경우가 많아 직접 찾는것보다 더 오래 걸렸던적이 많았다.
그런데, 이번 원인이 라이브러리의 최신 버전의 문제일 수도 있어서 github에서 찾아보기로 했다.

github issue 탭 검색해보기

나는 바로 문제가 있었보이는 pino-prettey github repo에서 이슈 탭으로가 단순하게 ERR_REQUIRE_ESM만 검색을 해보았다.
아니나 다를까 내가 겪었던 이슈가 바로 나왔다.

github-이슈창

정확한 원인이 뭘까?

이슈 내용 읽어보기


원인은 등록자의 이슈 내용을 쉽게 찾을 수 있었는데,
13.0에서 v13.1 로 버전업 내용중 #600-chore: upgrade strip-json-comments 에서 strip-json-comments 의존성 버전이 ^3.1.1 에서 ^5.0.2 변경되면서 발생하게 되었다는 것을 알 수 있었다.
왜 의존성 버전을 최신 버전으로 변경하였는지 PR 내용에 없었는데 Merge되었다는게 조금 의아하긴 했다.

strip-json-comments v3 / v5 버전간의 무슨 차이가 있었을까?

strip-json-comments 버전이 변경되면서 발생한 것은 알겠는데 정확히 어떤 버전부터 어떤 부분이 변경되어 발생하는지가 궁금하여 패치 노트를 찾아봤고, sctrip-json-comments 4.0.0 버전부터 pure ESM으로 변경 되었다는 것을 되었다.

pure ESM을 변경되었는데 pino-pretty에서 여전히 require 구문으로 사용하여 발생한 문제였다.

오류를 테스트도 안해보고 merge가 된걸까?

사실 내가 발생했던 문제는 Node를 버전을 20.19.x 버전 이상으로 사용하고 있었다면 문제가 발생하지 않았을 수도 있다.
왜냐하면 v20.19.0 버전업 내용 을 보면 v20.x 버전중 v20.19.0 미만 버전에서는 ESM 모듈을 require() 문으로 사용하기 위해서 --experimental-require-module 을 옵션을 주어야했다.
그런데, v20.19 버전부터 해당 옵션이 기본으로 변경되어 이 문제가 발생하지 않도록 수정되었다.

github-이슈 댓글

node-v20.19.0 버전 업데이트

그래서 테스트하는 환경이 노드 버전을 최신(22 or 23)이나 v20.19.0 이상버전을 사용하였다면 발생하지 않아 몰랐을 수도 있었을 거 같다

마무리

사실 문제 해결하는 방법만 보면 node 버전만 바꾸면 되기 때문에 간단해 보였다.
그런데 원인을 파고들다보니 개발 환경별로 발생할 수 있는 문제가 정말 많을 수 있다는 것을 알게되었다. 왜 .nvmrc 통해 노드버전을 고정시켜야 하는지 패키지 dependency를 고정시켜서 사용해야하는지 조금은 이해하게 되었다.

profile
Frontend Developer

0개의 댓글