Storybook v8 preset ์—๋Ÿฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ตœ๊ทผ Storybook v8์„ ๋„์ž…ํ–ˆ๋Š”๋ฐ, ๊ณ„์† preset์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•ด๊ฒฐ์€ ํ—ˆ๋ฌดํ•  ๋งŒํผ ๋‹จ์ˆœํ–ˆ์ง€๋งŒ, ์›์ธ์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ

์˜ˆ์ƒ ๊ฒฝ๋กœ

packages/design-system/
โ”œโ”€โ”€ .storybook/
โ””โ”€โ”€ preset.js  # ์—ฌ๊ธฐ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•จ

์‹ค์ œ ํƒ์ƒ‰ ๊ฒฝ๋กœ

project-root/
โ”œโ”€โ”€ node_modules/@storybook/core/  # ์—ฌ๊ธฐ์„œ ์‹คํ–‰๋˜์–ด
โ””โ”€โ”€ ??? # ๋ฃจํŠธ์—์„œ preset์„ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„

๋ถ„๋ช…ํžˆ design-system ์›Œํฌ์ŠคํŽ˜์ด์Šค ์•ˆ์— ์žˆ๋Š” preset์„ ์ฝ์–ด์•ผ ํ•˜๋Š”๋ฐ, Storybook์€ ๋ฃจํŠธ์—์„œ๋งŒ ์ฐพ์œผ๋ ค ํ–ˆ๋‹ค. ์–ด๋–ค ์ด์œ ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ฐ์ด ์•ˆ ์žกํ˜€์„œ ์ผ๋‹จ ์˜์กด์„ฑ์„ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.

โ”€ storybook@npm:8.6.14
โ”‚  โ””โ”€ @storybook/core@npm:8.6.14 (via npm:8.6.14)
โ”‚
โ””โ”€ storybook@npm:8.6.14 [a_id]
   โ””โ”€ @storybook/core@npm:8.6.14 [b_id] (via npm:8.6.14 [b_id])

์™œ ๋ฒ„์ „์ด ๋‘ ๊ฐœ๋‚˜ ๋‚˜์˜ฌ๊นŒ..? ๊ถ๊ธˆํ•ด์ ธ์„œ ์ฐพ์•„๋ดค๋Š”๋ฐ Yarn Berry๋Š” peerDependencies๋ฅผ ์ถฉ์กฑํ•˜๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ๋ฒ„์ „์ด๋ผ๋„ virtual package๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, @storybook/core@8.6.14๊ฐ€ ๋‘ ์ค„๋กœ ๋ณด์ธ๋‹ค.

  • [a_id], [b_id] ๊ฐ™์€ ๊ฑด Yarn์ด ๋ถ™์ด๋Š” virtual package ID๋‹ค.
  • ์‹ค์ œ ๋””์Šคํฌ์—๋Š” ํ•˜๋‚˜๋งŒ ์„ค์น˜๋œ๋‹ค.
  • Yarn์ด ์•ˆ์ „ํ•˜๊ฒŒ ์˜์กด์„ฑ์„ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋…ผ๋ฆฌ์ ์œผ๋กœ๋งŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ.

๊ทธ๋Ÿผ ์™œ ๊ตณ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ• ๊นŒ?

  • ํŒฌํ…€ ์˜์กด์„ฑ ๋ฐฉ์ง€: ์„ ์–ธํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋ฅผ ๋ชฐ๋ž˜ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ฌธ์ œ ์ฐจ๋‹จ
  • peerDependencies ์•ˆ์ •์„ฑ ํ™•๋ณด: React 17๊ณผ React 18์ฒ˜๋Ÿผ context๋งˆ๋‹ค peer ์š”๊ตฌ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
  • ๋ฒ„์ „ ์ถฉ๋Œ ๋Œ€๋น„: ๋‚˜์ค‘์— ์ผ๋ถ€ ์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ 8.7.0์„ ์š”๊ตฌํ•˜๋”๋ผ๋„ ์ถฉ๋Œ ์—†์ด ๊ณต์กด ๊ฐ€๋Šฅ

๊ฐ™์€ ๋ฒ„์ „์ด ๋‘ ๋ฒˆ ๋‚˜์˜จ ์ด์œ ๋Š” ์‹ค์ œ ์ด์Šˆ์™€ ์ง์ ‘์ ์ธ ์ƒ๊ด€์€ ์—†์—ˆ์ง€๋งŒ, ์ฐพ๋Š” ๊ณผ์ •์—์„œ Yarn์˜ virtual package ๊ฐœ๋…์„ ๋‹ค์‹œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋„ˆ๋ฌด ํ—ˆ๋ฌดํ–ˆ๋Š”๋ฐ ์บ์‹œ๋ฅผ ๋‚ ๋ฆฌ๊ณ  ๋‹ค์‹œ ์„ค์น˜๋ฅผ ํ•ด์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค...

( ++ ์‚ฝ์งˆํ•˜๋‹ค๊ฐ€ ๋ฌธ๋“ ์˜ˆ์ „ ํšŒ์‚ฌ ํŒ€์›๋ถ„๋“ค๊ณผ ์ž์ฃผ ์ฃผ๊ณ ๋ฐ›๋˜ 'ํ˜น์‹œ ์บ์‹œ ๋‚ ๋ ค๋ณด์…จ์–ด์š”?' ๊ฐ€ ์ƒ๊ฐ๋‚˜์„œ ํ–ˆ๋”๋‹ˆ ํ•ด๊ฒฐ๋๋‹ค.)

ํ•ด๊ฒฐ ํ›„์— ์ฐพ์€ ๋‚˜์™€ ๋น„์Šทํ•œ ๊ด€๋ จ GitHub ์ด์Šˆ ์ฝ”๋ฉ˜ํŠธ์—๋„ ๊ฐ™์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์–ธ๊ธ‰๋˜์–ด ์žˆ์—ˆ๋‹ค.

+++ yarn ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด์„œ๋„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

Yarn Workspaces์˜ ํ•ต์‹ฌ: ํ˜ธ์ด์ŠคํŒ…

Yarn Workspaces๋Š” ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์„ ๋ฃจํŠธ node_modules๋กœ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค.

monorepo/
โ”œโ”€โ”€ node_modules/          # ๋ชจ๋“  ์˜์กด์„ฑ์ด ์—ฌ๊ธฐ๋กœ ํ˜ธ์ด์ŠคํŒ…
โ”‚   โ”œโ”€โ”€ react/
โ”‚   โ”œโ”€โ”€ lodash/
โ”‚   โ””โ”€โ”€ @storybook/core/
โ”œโ”€โ”€ yarn.lock              # ์ „์ฒด ์˜์กด์„ฑ ์ž ๊ธˆ
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ packages/
    โ”œโ”€โ”€ design-system/
    โ”‚   โ””โ”€โ”€ package.json   # react, @storybook/core ์„ ์–ธ
    โ””โ”€โ”€ web-app/
        โ””โ”€โ”€ package.json   # react, lodash ์„ ์–ธ

ํ˜ธ์ด์ŠคํŒ…์˜ ์ด์ 

  • ์ค‘๋ณต ์„ค์น˜ ๋ฐฉ์ง€ โ†’ ๋””์Šคํฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ
  • ์„ค์น˜ ์‹œ๊ฐ„ ๋‹จ์ถ•
  • ์ „์ฒด ๋ชจ๋…ธ๋ ˆํฌ์˜ ์˜์กด์„ฑ ์ผ๊ด€์„ฑ ๋ณด์žฅ

yarn.lock์˜ ์—ญํ• 

  • ๋ฃจํŠธ์—๋งŒ ์ƒ์„ฑ๋˜๋ฉฐ, ๋ชจ๋“  ์›Œํฌ์ŠคํŽ˜์ด์Šค ์˜์กด์„ฑ์„ ํ†ตํ•ฉ ๊ด€๋ฆฌ
  • ๋ฒ„์ „ ์ถฉ๋Œ ๋ฐฉ์ง€
  • CI/CD ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์˜์กด์„ฑ ํŠธ๋ฆฌ ๋ณด์žฅ

nohoist vs nmHoistingLimits

ํŠน์ • ํŒจํ‚ค์ง€๋Š” ํ˜ธ์ด์ŠคํŒ… ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”๋ฐ, Yarn์€ ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

1. Yarn Classic(v1) โ†’ nohoist

{
  "workspaces": {
    "packages": ["packages/*"],
    "nohoist": [
      "**/react-native",
      "**/react-native/**"
    ]
  }
}

2. Yarn Berry(v2+) โ†’. yarnrc.yml

nmHoistingLimits: workspaces

nohoist์™€ nmHoistingLimits๋Š” ๊ฐ™์€ ๊ฐœ๋…์˜ ๋‹ค๋ฅธ ๋ฒ„์ „ ์˜ต์…˜์ด๋‹ค. v1์ธ์ง€ v2+์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๋งž๋Š” ์„ค์ •์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

--> ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ์ƒ๊ฒผ์„ ๋•Œ ๋น ๋ฅด๊ฒŒ ์ ๊ฒ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•ด ๋‘์—ˆ๋‹ค.

  1. ์บ์‹œ ์ •๋ฆฌ๋ถ€ํ„ฐ
  2. yarn cache clean yarn install
  3. yarn.lock ์ƒํƒœ ํ™•์ธ (ํ•„์š”์‹œ ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑ)
  4. ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ตฌ์กฐ ํ™•์ธ โ†’ yarn workspaces info
  5. ํ˜ธ์ด์ŠคํŒ… ๋™์ž‘ ํ™•์ธ
  6. ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ๋ถ„์„ โ†’ yarn why [ํŒจํ‚ค์ง€๋ช…]

https://yarnpkg.com/advanced/lexicon#virtual-package

https://www.docs4dev.com/docs/yarn/berry/advanced/architecture.html?utm_source=chatgpt.com

https://classic.yarnpkg.com/blog/2018/02/15/nohoist/