npm vs yarn vs pnpm

Table of Contents

์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿคท TL;DR

  • npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.
  • ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.

๐ŸŽ npm

Untitled

์šฐ์„  npm์ž…๋‹ˆ๋‹ค. npm์— ๋Œ€ํ•ด ๋” ํ•  ์ด์•ผ๊ธฐ๋Š” ์—†์ง€๋งŒ, ์šฐ์„  ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ค€์ด ๋  ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰๊นŒ์ง€ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ ์‹คํ—˜ํ•  ํ”„๋กœ์ ํŠธ๋Š” ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” React boilerplate์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜๋Š”์ง€๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ README.md๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

Untitled

์„ค์น˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Œ€๋กœ package.json์— ์ •์˜๋œ dev ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฆฌ์•กํŠธ ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Untitled

๋ฌด๋‚œํ•˜๊ฒŒ ์ง„ํ–‰์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿˆ Yarn

Yarn์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€, ๋น„๊ต์  ์ตœ๊ทผ์— ๋‚˜์˜จ ๋ฒ„์ „์ธ Yarn berry์˜ PnP ์ „๋žต์„ ํ†ตํ•œ ํŒŒ์ผ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค. npm์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ค์ง€ A, B๊ฐ€ C๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ C๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด๋„ C๋ฅผ node_modules ๋””๋ ‰ํ† ๋ฆฌ ์ตœ์ƒ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ…ํ•˜์—ฌ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋•Œ A, B๊ฐ€ ์ฐธ์กฐํ•˜๋Š” C์˜ ๋ฒ„์ „์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋‘ ๋ฒ„์ „ ์ค‘ ํ•˜๋‚˜๋งŒ์ด ํ˜ธ์ด์ŠคํŒ…๋˜๋ฉฐ, ์ดํ›„ ํ˜ธ์ด์ŠคํŒ…๋˜์ง€ ์•Š์€ ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๋งŽ์•„์ง€๋”๋ผ๋„ ์ด ๊ตฌ์กฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์™„์ „ํ•œ ์ตœ์ ํ™”๋Š” ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Yarn berry์—์„œ๋Š” ํŒจํ‚ค์ง€์˜ ๊ฐ ๋ฒ„์ „๋งˆ๋‹ค ํ•˜๋‚˜์˜ .zip ํŒŒ์ผ๋กœ ์„ค์น˜๋˜๊ณ , ์•ž์„œ ๋งํ•œ ์ค‘๋ณต ์„ค์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .zip ํŒŒ์ผ๋กœ ์••์ถ•๋˜๋ฉด์„œ ์–ป๋Š” ์šฉ๋Ÿ‰ ์ƒ์˜ ์ด์ ๋„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ํ† ์Šค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”!

๊ทธ๋Ÿผ ์ด์ œ Yarn ๊ณต์‹ ๋ฌธ์„œ์˜ ์„ค๋ช…์„ ๋”ฐ๋ผ์„œ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. NodeJS์˜ Corepack ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์•ผ ํ•˜๋Š” ๋ชจ์–‘์ธ๋ฐ, ๋…ธ๋“œ ๋ฒ„์ „ 16.10์„ ๊ธฐ์ค€์œผ๋กœ ์ถ”๊ฐ€ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” NodeJS v16.16.0์„ ์‚ฌ์šฉ์ค‘์ด๋ฏ€๋กœ ๋ณ„๋„ ์„ค์น˜ ์—†์ด corepack์„ ํ™œ์„ฑํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

corepack enable
corepack prepare yarn@3.2.4 --activate // yarn@stable ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•จ
yarn init -2

๐Ÿ’ก yarn init ๋’ค์˜ -2 ๋ผ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ Zero-Installs๋ฅผ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ๋Š” ๋ชจ์–‘์ธ๋ฐ์š”, Yarn2 (Berry)์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ node_modules๋ฅผ ๋Œ€์ฒดํ•˜๋Š” PnP ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์–‘์ž…๋‹ˆ๋‹ค. -2๋ฅผ ๋นผ๊ณ  ์ดˆ๊ธฐํ™”ํ•ด๋ณด๋‹ˆ node_modules ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜๋”๋ผ๊ตฌ์š”. Zero-Installs์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

npm์œผ๋กœ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ boilerplate ํŒŒ์ผ์„ ๋ฐฉ๊ธˆ ์ดˆ๊ธฐํ™”ํ•œ yarn ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ  yarn install์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Untitled

๋ญ”๊ฐ€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ๋“ฏํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋‹ค๊ฐ€ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์— ํŒจํ‚ค์ง€๋“ค์ด .zip ํŒŒ์ผ๋กœ ์••์ถ•๋˜์–ด ๋“ค์–ด์žˆ๋„ค์š”.

Untitled

Untitled

์Œ, ๊ทธ๋Ÿฐ๋ฐ ์ด ์ƒํƒœ๋กœ ๋ฐ”๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์–ด๋””๊ฐ€ ๋ถˆํŽธํ•œ์ง€ ๋น„๋ช…์„ ์ง€๋ฅด๊ณ  ์žˆ๊ตฌ์š”. ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ package.json์—๋Š” ๋ช…์‹œ๋˜์ง€ ์•Š์€ peer-dependency ํŒจํ‚ค์ง€๋“ค์ด ๋น ์ ธ ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ package.json์—์„œ ์ž๋™์™„์„ฑ๊ณผ ํ•จ๊ป˜ ๋ฒ„์ „๊นŒ์ง€ ์•Œ์•„์„œ ์ฑ„์›Œ์ฃผ์–ด์„œ ์ ๋‹นํžˆ ์ ์–ด์„œ yarn install์„ ๋‹ค์‹œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด์Šˆ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ ๋‹ต์„ ๊ตฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ฒฐ๊ตญ ์ง์ ‘ ํ•˜๋‚˜์”ฉ ์„ค์น˜ํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Untitled

๐ŸงŠ pnpm

Untitled

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๊ณ , yarn๊ณผ ๋ณ„ ์ฐจ์ด ์—†์ด corepack์„ ํ†ตํ•ด ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋งŒ ๋ณด๋ฉด์„œ ํ–ˆ๋Š”๋ฐ ๋ฌธ๋“ ๋ณด๋‹ˆ ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์˜์–ด๊ฐ€ ๋ฐ˜, ํ•œ๊ตญ์–ด๊ฐ€ ๋ฐ˜์œผ๋กœ ๋˜์–ด ์žˆ์—ˆ๋„ค์š”. ์œ„ ์‚ฌ์ง„์€ ๊ธ€์„ ์ฝ์ง€ ์•Š๊ณ  ๋ฌด์ž‘์ • ๋ช…๋ น์–ด ์‹คํ–‰ํ•˜๋ฉด์„œ ์ฐ์€ ์‚ฌ์ง„์ธ๋ฐ, Powershell์ด ๋ญ”๊ฐ€ ํ•ดํ•ดํ‚นํ‚น์ด์ด ๋˜๋˜ใ„ด๋Š” ๊ธฐ๋ถ„์ด ๋“ค์–ด์„œ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

Untitled

pnpm install์„ ์‹คํ–‰ํ•˜๋‹ˆ, peer dependency ์ด์Šˆ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์›Œ์ค๋‹ˆ๋‹ค. yarn์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋„ค์š”. ์ด ๋งํฌ์—์„œ ๋‹ต์„ ์ฐพ์•„ pnpm i --shamefully-hoist=true๋กœ ์„ค์น˜ํ•˜๋‹ˆ ์•Œ์•„์„œ ํ”ผ์–ด ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ™์ด ์„ค์น˜ํ•ด ์ค๋‹ˆ๋‹ค.

Untitled

Untitled

๐Ÿคจ ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ์š”..?

Untitled

์‚ฌ์‹ค ์ด ์ •๋„ ํ…Œ์ŠคํŠธ๋กœ ์ฐจ์ด๋ฅผ ๋Š๋ผ๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ฒดํ—˜ํ•ด ๋ดค์œผ๋‹ˆ, ๊ทธ๋‚˜๋งˆ ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • npm์€ ๋…๋ณด์ ์œผ๋กœ ์˜์กด์„ฑ ์„ค์น˜๊ฐ€ ๋Š๋ฆฌ๊ณ , ๋ฌด๊ฑฐ์› ์Šต๋‹ˆ๋‹ค.
  • yarn์˜ ํŒจํ‚ค์ง€ ์šฉ๋Ÿ‰์ด ์ •๋ง ๊ฐ€๋ฒผ์› ์Šต๋‹ˆ๋‹ค. pnpm์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ธ์ง€, npm๊ณผ ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • pnpm์€ peer-dependency ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ œ๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ผ€์ด์Šค๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ธด ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฑฑ์ •์ด ๋งŽ์•˜๋˜ ESLint๋Š” ์˜์™ธ๋กœ ๊ธˆ๋ฐฉ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค, ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

๋ณด์•ˆ์ด๋ผ๋˜์ง€, ์„ฑ๋Šฅ์ด๋ผ๋˜์ง€ ๋น„๊ต๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์ œ ์‹คํ—˜์šฉ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ ์˜๋ฏธํ•œ ์ฐจ์ด๋ฅผ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ package.json์— ์ •์˜๋œ npm scripts๋ฅผ ๋ฌธ์ œ์—†์ด ์‹คํ–‰ํ•ด ์ค€๋‹ค๋Š” ์ ์ด ์ธ์ƒ ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค. javascript์—์„œ typescript๋กœ ์˜ฎ๊ฒจ๊ฐˆ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ์นœ์ ˆํ•˜๋„ค์š”.

๐Ÿ“– Refs.

https://github.com/yarnpkg/yarn/issues/1503
node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry
pnpm does not resolve dependencies
[๋ฒˆ์—ญ] JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋น„๊ต - npm, Yarn ๋˜๋Š” pnpm?
npm, yarn, pnpm ๋น„๊ตํ•ด๋ณด๊ธฐ
์„ค์น˜ํ•˜๊ธฐ | pnpm
Installation
yarn berry(yarn2) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•
yarn berry๋กœ React.js ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ | Kasterra’s Archive
๊ทธ๋ฆฌ๊ณ  ๋ถ€์ŠคํŠธ ์ปจํผ๋Ÿฐ์Šค ํ…Œํฌํ†ก์—์„œ ๋ฉ‹์ง„ ๋ฐœํ‘œ๋ฅผ ํ•ด ์ฃผ์‹  J166 ์ดํœ˜์ฐฌ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ™‡