npx는 패키지를 전역에 설치하지 않고 그 안의 명령을 바로 실행하는 도구입니다. 프로젝트 node_modules에 명령이 있으면 그것을 쓰고, 없으면 npm 캐시에 받아 실행합니다. 처음 받는 패키지라면 설치해도 되는지 묻고, 자동 실행 스크립트처럼 질문에 답할 수 없는 곳에서는 --yes나 --no를 붙여야 멈추지 않습니다. npm 7부터 npx는 npm exec를 쓰도록 다시 만들어졌고, 그 뒤로 옵션은 패키지 이름 앞에 적어야 npx가 읽습니다. 예전 블로그 글에 나오는 --no-install, --node-arg 같은 옵션도 바뀌었으니 2026년 10월 28일에 연 npm v11 공식 문서 기준으로 확인하세요.
npx 요약
하는 일
패키지 명령을 설치 없이 실행
찾는 순서
로컬 node_modules, 그다음 npm 캐시
질문 건너뛰기
--yes 또는 --no
옵션 위치
패키지 이름보다 앞
npx는 정확히 무엇을 하나요?
바로 답 | 패키지 안의 실행 파일(bin)을 찾아 실행합니다. 로컬에 없으면 npm 캐시에 내려받아 실행하고, 전역 설치는 하지 않습니다.
npm 공식 문서는 npx를 "로컬 또는 원격 npm 패키지에서 명령을 실행한다"고 정의합니다. 프로젝트 의존성에 이미 들어 있는 도구라면 node_modules/.bin에 있는 실행 파일을 쓰고, 처음 쓰는 패키지라면 npm 캐시 폴더에 받아서 PATH에 잠시 붙여 실행합니다.
그래서 create-next-app처럼 가끔 한 번 쓰는 생성 도구나, 프로젝트마다 버전이 다른 린터를 돌릴 때 npx가 편합니다. npm 문서도 전역 설치 권한 오류(EACCES)를 피하는 대안으로, 가끔 쓰는 명령이라면 npx를 검토해 보라고 적었습니다.
npx 기본 사용 예 (npm 공식 문서 형식)
# 로컬에 있으면 로컬 버전, 없으면 받아서 실행
npx eslint .
# 로컬 의존성의 tap을 인자와 함께 실행
npx tap --bail test/foo.js
# 패키지 이름과 실행 파일 이름이 다를 때
npx -p typescript tsc --version
"Need to install the following packages"에서 멈추면?
바로 답 | npx --yes 패키지로 확인 질문을 건너뛰거나, 설치 자체를 막으려면 --no를 붙이세요.
npm 문서에 따르면 실행하려는 패키지가 로컬 의존성에 없으면 npx는 캐시에 설치하기 전에 확인을 묻습니다. 터미널에서 직접 쓸 때는 y를 누르면 되지만, CI나 스크립트처럼 입력할 수 없는 곳에서는 여기서 멈춥니다.
옵션
동작
쓰는 곳
--yes, -y
묻지 않고 받아서 실행
CI, 자동화 스크립트
--no
받아야 하면 실행하지 않고 실패
로컬 의존성만 쓰게 강제할 때
옵션 없음
처음 받는 패키지면 확인 질문
터미널에서 직접 실행
--no-install
npm 7 이후 --no로 바뀜
예전 스크립트 정리 대상
남이 만든 패키지를 --yes로 자동 실행하면 그 패키지 코드가 확인 없이 돌아갑니다. 이름을 잘못 적은 비슷한 이름의 패키지가 실행될 수도 있으니, 자동화에서는 npx 패키지@버전처럼 버전까지 고정하세요.
npx와 npm exec는 무엇이 다른가요?
바로 답 | 하는 일은 같고, 옵션을 읽는 방식이 다릅니다. npx는 패키지 이름 앞의 옵션만 읽고, npm exec는 -- 뒤를 모두 명령에 넘깁니다.
npm 문서는 npx를 실행하면 npm exec를 쓰도록 바뀌었다고 설명하며 차이를 예시로 듭니다. npx에서는 첫 번째 위치 인자 뒤에 오는 옵션이 모두 실행할 명령으로 넘어갑니다. npm exec에서는 --를 넣지 않으면 뒤쪽 옵션을 npm이 먼저 가져갑니다.
같은 결과를 내는 두 가지 쓰는 법 (npm 공식 문서 예시)
npx foo@latest bar --package=@npmcli/foo
# 위와 같은 동작
npm exec -- foo@latest bar --package=@npmcli/foo
# npx에서 -p는 --package의 약자
npx -p @npmcli/foo foo
npm 7 이전 npx에 있던 --node-arg, -n은 빠졌고 문서는 대신 NODE_OPTIONS 환경 변수를 쓰라고 안내합니다. 셸 대체 실행 기능(shell fallback)과 --ignore-existing, --npm 옵션도 제거되었습니다.