Storybook: ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์› - Stencil.js

์— ๋งŒ๋“  2018๋…„ 10์›” 29์ผ  ยท  119์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: storybookjs/storybook

์›ํ•˜๋Š” ์†”๋ฃจ์…˜ ์„ค๋ช…
Storybook์€ ๋งค์šฐ ๊ตฌ์„ฑ ์š”์†Œ์— ์ค‘์ ์„ ๋‘๊ณ  Stencil์€ ๋งค์šฐ ๊ตฌ์„ฑ ์š”์†Œ์— ์ค‘์ ์„ ๋‘” ํ”„๋ ˆ์ž„์›Œํฌ ์ด๋ฏ€๋กœ Stencil.js ์ง€์›์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ์„œ๋กœ๋ฅผ ๋งค์šฐ ์ž˜ ๋ณด์™„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์„ ํ˜„์‹ค๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์˜ˆ, ์ €๋Š” ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

P1 html web-components feature request todo

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์ง€๋‚œ 2์ฃผ ๋™์•ˆ StencilJS์™€ Storybook์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  ๋‚ด ์†”๋ฃจ์…˜์„ ๋‹ค๋ฃจ๋Š” ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ HMR์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฑฐ์˜ ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ์Šคํ…์‹ค ๋ฒˆ๋“ค์—์„œ ๋กœ๋”๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=XwHtPw3izLE

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๋ ˆํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ^_^
https://github.com/MadnessLabs/enjin-components

๋ชจ๋“  119 ๋Œ“๊ธ€

#1870 ๋ฐ #3423์— ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์„œ ํ† ๋ก ์„ ๊ณ„์†ํ•˜์ž

ํ˜„์žฌ ์Šคํ…์‹ค ๋ฐ SB 5๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์Šคํƒ€ํ„ฐ ๋นŒ๋“œ ์ƒ์„ฑ ์˜ˆ์ •

@Edd-Srickland๋Š” stencl ์ง€์› ๋ฒ„์ „ ์ž‘์—…์„ ์›ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰

์Šคํ…์‹ค์ด ์žˆ๋Š” ํด๋ฆฌ๋จธ ์Šคํƒ€ํ„ฐ๋ฅผ ์ตœ์‹  ๋ฒ„์ „์˜ SB๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆฌ๋จธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์Šคํ…์‹ค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

@Edd-Strickland๋Š” ์ •๋ณด๋ฅผ ์œ„ํ•ด ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์Šคํƒ€ํ„ฐ์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์Šคํ† ๋ฆฌ๋ถ ๋‚ด๋ถ€์— ์Šคํ…์‹ค์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/vogloblinsky/nutrition-web-components

Storybook์˜ HTML ์Šคํƒ€ํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ Storybook & Stencil์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Stencil์—์„œ ์ƒ์„ฑํ•œ ๊ฐ ๋ฃจํŠธ JavaScript ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋” ์ถ”๊ฐ€
  • Storybook์—์„œ Stencil์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ •์  ํŒŒ์ผ ์ถ”๊ฐ€

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ฃผ์š” ๋ฌธ์ œ๋Š” ์Šคํ† ๋ฆฌ ๋‚ด์—์„œ ๊ฐ€์ ธ์˜จ JavaScript ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Storybook์—์„œ Webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ์›Œํฌํ”Œ๋กœ๋Š” Web Component์˜ JS ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ์ด์ „์— ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด์ง€๋งŒ ํด๋ฆฌ๋จธ ๋ฒ„์ „์—์„œ๋Š” ์ผ๋ฐ˜ ์ •์  W/C ๊ตฌํ˜„์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด ์ œํ•œ์ ์œผ๋กœ ๋Š๊ปด์ง€๋Š” ์Šคํ† ๋ฆฌ๋กœ ๋งค๋ฒˆ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์Šคํ…์‹ค component ์œ ํ˜• ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. https://github.com/nisheed2440/stencil-storybook-wrapper

์›”์š”์ผ์— ํ…Œ์ŠคํŠธ ํ•ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž˜ ํ–ˆ์–ด :)

์ด๊ฒƒ์ด Storybook์˜ ๊ณต์‹ ๋ถ€๋ถ„์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ๊นŒ์š”? ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ ˆ์‹คํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

@otw ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์™€์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ndelangen ๊ธฐ๊บผ์ด ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ/๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ LitElement(๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ๊ตฌ์„ฑ ์š”์†Œ)์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด Stencil์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@nishe2440 ๋ž˜ํผ๊ฐ€ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ณง ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ Storybook ๐Ÿ‘Œ์— ๋ฌธ์„œํ™”๋œ "๋„ค์ดํ‹ฐ๋ธŒ" ํ†ตํ•ฉ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@nisheed2440 ์ €๋Š” ๋งค์šฐ ๋ฐ”๋นด์ง€๋งŒ(๋ชจ๋‘์—๊ฒŒ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค) ์˜ค๋Š˜ ์•„์ฃผ ์ž‘์€ ์ฐฝ์„ ๊ฐ€์ง€๊ณ  ๋กœ์ปฌ์—์„œ ๋งค์šฐ ๋ฐ”๋‹๋ผ ๋ฒ„์ „์„ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค. ์ •๋ง ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฃผ์— ๊ธฐ์กด ์Šคํ…์‹ค ์‚ฌ์šฉ์ž/ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ค๋Š˜ ์•„์นจ์— ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! GJ ์„ค์ •์€ ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

import '@storybook/addon-backgrounds/register';
import '@storybook/addon-knobs/register';
import '@storybook/addon-actions/register';
import '@storybook/addon-notes/register';

๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. addon-knobs https://github.com/storybooks/storybook/issues/5017 ์—์„œ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ์ด๋Š” ๊ณง ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๋‚œ 2์ฃผ ๋™์•ˆ StencilJS์™€ Storybook์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  ๋‚ด ์†”๋ฃจ์…˜์„ ๋‹ค๋ฃจ๋Š” ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ HMR์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฑฐ์˜ ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ์Šคํ…์‹ค ๋ฒˆ๋“ค์—์„œ ๋กœ๋”๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=XwHtPw3izLE

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๋ ˆํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ^_^
https://github.com/MadnessLabs/enjin-components

@nisheed2440 ์•ˆ๋…•ํ•˜์„ธ์š”,
์‹คํ–‰ํ•˜๋ฉด ๋‚ด ๋ชจ๋“  ์Šคํ† ๋ฆฌ๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€๋งŒ ๋ชจ๋“  ์Šคํฌ๋ฆฐ์ƒท์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋กœ๋งคํ‹ฑ ์„œ๋ฒ„์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ์Šคํฌ๋ฆฐ์ƒท์„ ๋ Œ๋”๋งํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์Šคํ…์‹ค์ด ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nisheed2440 ์ •๋ง ๋Œ€๋‹จํ•œ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ์ด๊ฒƒ์€ ํŒ€์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ถœ๋ฐœํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์Šคํ…์‹ค๊ณผ ์Šคํ† ๋ฆฌ๋ถ์€ ์„œ๋กœ์—๊ฒŒ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋งŽ์€ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์งˆ๋ฌธ, ์˜๊ฒฌ ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ์ž์œ ๋กญ๊ฒŒ ํ† ๋ก ์„ ๊ณ„์†ํ•˜์‹ญ์‹œ์˜ค. ๋ถˆํ–‰ํžˆ๋„ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๊ธฐ์—ฌ์— ์—ด๋ ค ์žˆ์œผ๋ฏ€๋กœ ๋„์›€์ด ํ•„์š”ํ•˜๋ฉด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ๋น„ํ™œ์„ฑ ๋ฌธ์ œ๋Š” 30์ผ ํ›„์— ๋‹ซํž™๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์ด๊ฑฐ ์ค๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ ์žˆ์–ด?

์šฐ๋ฆฌ ํŒ€์€ ๊ณตํ†ต ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— StencilJS + Storybook์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ ์ค‘ ๋ช‡ ๋ช…์ด ์ด ์ผ์„ ์ •์ƒ์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค...

๋งŽ์€ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ: https://twitter.com/dboskovic/status/1120336958008348672

ํ•œ ๊ฐ€์ง€ ์‰ฌ์šด ์Šน๋ฆฌ๋Š” @popcorn245 ์˜ ๊ตฌ์„ฑ์„ ์Šคํ† ๋ฆฌ๋ถ ์‚ฌ์ „ ์„ค์ •์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” @storybook/preset-stencil ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์•„์ง ๋งˆ๋ฌด๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ณง ์ถœ์‹œ๋  Storybook ๋ฌธ์„œ ๋ฆด๋ฆฌ์Šค์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ„๋‹จํ•˜๊ณ  ํ–ฅํ›„ ๋Œ€๋ถ€๋ถ„์˜ SB ๊ตฌ์„ฑ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์„ ํƒํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์„ ์•ˆ๋‚ดํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@shilman๋‹˜ , ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ๋ฅผ ์—ด๋ง ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์Šค๋ ˆ๋“œ์—๋Š” ๋‚ด๊ฐ€ ์ฐพ์€ ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ์ ์ด ์žˆ์ง€๋งŒ ๋…ธ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์š”์†Œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์€ ๋ฒ„๊ทธ๊ฐ€ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ตฌํ˜„์€ Stencil ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ”ผ๊ธฐ๋ฐฑํ•˜๊ณ  React ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ™์€ JSX ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด MHO์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Stencil One์€ ๋ช‡ ๊ฐ€์ง€ ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ๊ณง ์ถœ์‹œ๋  ์˜ˆ์ •์ด๋ฏ€๋กœ ์ด ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ด ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ํŒŒ์ดํ”„๋ผ์ธ์— ๋ฌด์—‡์ด ๋‚˜์˜ฌ์ง€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/ionic-team/stencil/blob/core-refactor/BREAKING_CHANGES.md

์ด ์Šค๋ ˆ๋“œ๋Š” ํŠนํžˆ @popcorn245์˜ ๊ตฌ์„ฑ์— ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” @stencil/state-tunnel ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ๊ทธ ๊ตฌ์„ฑ์„ ๊นจ๋œจ๋ ธ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์†Œํ•œ ~hacks~ ์กฐ์ •์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

npm i -D [email protected]

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ .storybook/webpack.config.js :

const { existsSync, readdirSync } = require('fs');
const { resolve } = require('path');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = ({ config }) => {
  // 1. Transpile <strong i="11">@stencil</strong> modules with Babel
  const babelLoader = config.module.rules.find(
    ({ use }) => use && use[0].loader === 'babel-loader'
  );
  babelLoader.exclude = [/node_modules\/(?!\@stencil).*/];
  if (babelLoader.use[0].options) {
    babelLoader.use[0].options.plugins = ['@babel/plugin-syntax-dynamic-import'];
  }

  // 2. Load JS & CSS from our components
  config.entry.push(resolve(__dirname, '..', 'dist', 'MYCOMPONENTNAME.js'));
  config.entry.push(resolve(__dirname, '..', 'dist', 'MYCOMPONENTNAME.css'));

  const components = resolve(__dirname, '..', 'dist', 'collection', 'components');
  readdirSync(components).map(file => {
    jsFilePath = resolve(components, file, `${file}.js`);
    try {
      if (existsSync(jsFilePath)) config.entry.push(jsFilePath);
    } catch (err) {
      console.error(err);
    }

    cssFilePath = resolve(components, file, `${file}.css`);
    try {
      if (existsSync(cssFilePath)) config.entry.push(cssFilePath);
    } catch (err) {
      console.error(err);
    }
  });

  // 3. Fix dynamic imports for Storybook
  // IMPORTANT: webpack must be at 4.28 due to a bug. See here: https://github.com/webpack/webpack/issues/8656
  config.plugins.push(
    new CopyPlugin([
      {
        from: resolve(__dirname, '..', 'dist'),
        to: resolve(__dirname, '..', 'node_modules', '<strong i="12">@storybook</strong>', 'core', 'dist', 'public'),
      },
    ])
  );

  return config;
};

์ด๊ฒƒ์œผ๋กœ ์‹คํ—˜์„ ์‹œ์ž‘ํ•˜๊ณ  (๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด) concurrently ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด (ํ˜„์žฌ๋กœ์„œ๋Š”) ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์Šคํ…์‹ค๊ณผ ์Šคํ† ๋ฆฌ๋ถ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋œ ๋น ๋ฅธ ์‹œ์ž‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ตœ์‹  ์Šคํ…์‹ค ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: stencil-storybook-starter

@fvaldes33 ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค! ๋ณ„ํ‘œ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐฉ๊ธˆ Stencil One ๋ฒ ํƒ€๋กœ ์—…๋ฐ์ดํŠธํ–ˆ๊ณ  ๊ตฌ์„ฑ์ด ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ์›นํŒฉ ์„ค์ •์„ ์™„์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ stencil build --watch (๊ฐœ๋ฐœ์ด ์•„๋‹Œ prod)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋น ๋ฅด๊ณ  Stencil์—์„œ prod ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(ํŠนํžˆ ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ ๋ฐ ๊ธฐํƒ€ ๊ฐ€์ ธ์˜ค๊ธฐ).

@ fvaldes33 ์–ด๋–ป๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ-head.html์—์„œ build/components.js๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ „์ฒด ๊ฒฝ๋กœ(์˜ˆ: http://localhost :3333/build/components.js)๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์•„๋„๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

(๋‚˜๋Š” ๋‹น์‹ ์˜ ์Šคํƒ€ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์ง€๋งŒ ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ๋ถ/html ์„ค์น˜์™€ ํ•จ๊ป˜ ์Šคํ…์‹ค ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

ํŽธ์ง‘ํ•˜๋‹ค:
www ํด๋” ๋Œ€์‹  ํฌํŠธ 6006์—์„œ ์Šคํ† ๋ฆฌ๋ถ์„ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ํ•ด๊ฒฐ๋จ!

์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋น„์Šทํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ(์ €๋ฅผ ํฌํ•จํ•˜์—ฌ https://github.com/jagreehal/stencil-boilerplate) ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํŽธ์ง‘ํ•  ๋•Œ ํ•ซ/๋ผ์ด๋ธŒ ์—…๋ฐ์ดํŠธ๋ฅผ ์ •๋ง ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Storybook์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ์ถ•ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์ฐธ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„๋ณด๊ณ  ์‹ถ๋‹ค!

์œ„์˜ ์‚ฌ์ „ ์„ค์ •์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์œ„์˜ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์ „ ์„ค์ •์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์Šคํ† ๋ฆฌ๋ถ ์ชฝ์—์„œ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์Šคํ…์‹ค ์ธก๋ฉด์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์›ํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์œ„ํ•ด ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž๋™ ์Šคํ† ๋ฆฌ ์ƒ์„ฑ

    • ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ๋“  @Props ์— ๋Œ€ํ•œ ์ž๋™ ๋…ธ๋ธŒ ์ƒ์„ฑ

    • ๊ฐ ์†Œํ’ˆ์— ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋ธŒ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ(์ฝ”๋“œ๋Š” ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถ€์šธ, ๊ฐœ์ฒด, ๋‚ ์งœ ๋ฐ ์ƒ‰์ƒ์„ ์ž˜ ์ถ”์ธกํ•˜์ง€๋งŒ).

    • ์ œ๋ชฉ, ์„ค๋ช… ๋ฐ ๋ณต์‚ฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐ๊ฐ(์ผ์ข…์˜ ๊ฒฝ๋Ÿ‰ ์ฑ•ํ„ฐ ๊ตฌํ˜„)์ด ์žˆ๋Š” ๋‹จ์ผ ํŽ˜์ด์ง€์— ๋ Œ๋”๋ง๋˜๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ

    • ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ(์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ๋œ readme๋ฅผ ์›ํ•จ)

  • ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ผ์ด๋ธŒ ์žฌ๋นŒ๋“œ/๋‹ค์‹œ ๋กœ๋“œ(์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•จ)
  • ๋ทฐํฌํŠธ ์• ๋“œ์˜จ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต

๋‹น์‹ ์˜ ์ƒ๊ฐ์„ ์•Œ๋ ค์ฃผ์„ธ์š”: https://github.com/DesignByOnyx/stencil-storybook-starter

@DesignByOnyx ๋ฉ‹์ง€๋„ค์š” . ์ด์— ๋Œ€ํ•ด ํŠธ์œ—ํ•˜๊ณ  @storybookjs ์–ธ๊ธ‰ํ•˜๋ฉด ์Šคํ† ๋ฆฌ๋ถ ๊ณ„์ •์—์„œ RTํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๊ด€ํ•œ ํฌ์ŠคํŠธ๋ฅผ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ๊ทธ๊ฒƒ์„ ์•Œ๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ˆ˜์š”๊ฐ€ ๊ฝค ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๋ฉ‹์ง„ ์ž‘์—… @DesignByOnyx ! ์ด๊ฒƒ์€ ์‚ฌ์ „ ์„ค์ •์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :tada:

์ข‹์•„, ๋‚˜๋Š” ํŠธ์œ—์„ ํ–ˆ๋‹ค(๋‚˜๋Š” ํŠธ์œ„ํ„ฐ๋ฅผ ๋งŽ์ด ํ•˜์ง€ ์•Š๋Š”๋‹ค). ๊ฒŒ๋‹ค๊ฐ€ ์ €๋Š” ๋ธ”๋กœ๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ ๋‚˜๋Š” ์„œ๋‘˜๋Ÿฌ ๊ทธ๊ฒƒ์„ ํ•จ๊ป˜ ๋˜์ ธ ๋†“์•˜๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ๋ณ‘ํ•ฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€๋Š” ์ •๋ง ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ธฐ ์ „์— ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ”„๋ฆฌ์…‹์ด ์–ด๋–ค ๋ชจ์Šต์ผ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ์ ์€ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š” JSX ์‚ฌ์ „ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Storybook-html ๋‹ค์–‘์„ฑ ์œ„์— ๋” ์‰ฝ๊ฒŒ ๋ Œ๋”๋งํ•˜๊ณ  ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์Šคํ…์‹ค๊ณผ ๋ณ„๋กœ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ์• ๋“œ์˜จ๋„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋ฉฐ, ์ œ๊ฐ€ ๊ทธ ๋…ธ๋ ฅ์„ ๊ฐ€์žฅ ์ž˜ ์กฐ์œจํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , ๋‚ด๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.

@DesignByOnyx ๋””์Šค์ฝ”๋“œ์— https://discordapp.com/invite/UUt2PJb

Storybook ๋ธ”๋กœ๊ทธ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์Šคํ…์‹ค ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ™๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Stencil์šฉ์œผ๋กœ @storybook/html ๋ฅผ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ๊ทธ ๊ฒฝํ—˜์€ ๊ฑฐ์˜ "์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. concurrently ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Storybook ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  stencil build --watch "๋ณ‘๋ ฌ"
  2. -s dist ํ”Œ๋ž˜๊ทธ๋กœ storybook ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ์Šคํ…์‹ค dist ์ด ์ •์  ํŒŒ์ผ๋กœ ์ œ๊ณต๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•˜๋„๋ก .storybook/preview-head.html ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    <script type="module" src="/$PACKAGE_NAME/$PACKAGE_NAME.esm.js"></script>
    <script nomodule="" src="/$PACKAGE_NAME/$PACKAGE_NAME.js"></script>
    

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ! ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ html ์ง€์›์€ ๋ชจ๋“  ์›น ๊ตฌ์„ฑ ์š”์†Œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค @storybook/stencil ์™€ ๊ฐ™์€ ๊ฒฝํ—˜ (์ฝ”๋“œ)์ด ๊ทธ html ์ด์•ผ๊ธฐ ์ œ์ž‘ ์ธก ํŒจํ‚ค์ง€๋ฅผํ•˜์ง€๋งŒ,

  1. concurrently ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์Šคํ† ๋ฆฌ๋ถ์˜ ์ผ๋ถ€๋กœ ์Šคํ…์‹ค ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•ด๋‹น script ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ๋นŒ๋“œ๋  ๋•Œ ์ž๋™ ์ƒˆ๋กœ ๊ณ ์นจ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” Stencil๊ณผ Storybook์—์„œ ํšŒ์‚ฌ๋ฅผ ๋งค๊ฐํ•˜๋Š” ๊ณผ์ •์— ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ์ด ๊ฒฌ์ธ๋ ฅ์„ ์–ป๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด Storybook + Stencil์ด ํ•จ๊ป˜ ํ”Œ๋ ˆ์ดํ•˜๋Š” ๋™์•ˆ ๊ทธ ์ด์•ผ๊ธฐ(๋ง์žฅ๋‚œ์€ ์‹ค๋ก€)๋ฅผ ์ •๋ง ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด "์ž‘์—… ์‹œ๊ฐ„"์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@DesignByOnyx ๊ฐ€ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์€ ์ •๋ง ํ›Œ๋ฅญํ•˜์ง€๋งŒ ํ•ด๋‹น ํ‚คํŠธ๋กœ Stencil ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ _์‹œ์ž‘_ํ•ด์•ผ ํ•˜๊ณ  Stencil์— ๋Œ€ํ•œ "์ผ๋ฐ˜" ๋ฌธ์„œ๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Storybook์ด "์ผ๋ฐ˜" ์Šคํ…์‹ค ์Šคํƒ€ํ„ฐ ํ‚คํŠธ ์œ„์— ๊ณ„์ธตํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ ์ง‘ํ•ฉ์— Storybook ๊ตฌ์„ฑ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์š”์•ฝ @alexlafroscia์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์ด ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์Šคํ…์‹ค์„ ๋‹ค์‹œ ๋นŒ๋“œํ•  ๋•Œ HMR์ด ์ž๋™์œผ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์•ˆ๋˜๋Š”์ง€ ์•„์„ธ์š”?

@igor-dv ์‚ฌ์ „ ์„ค์ •์—์„œ preview-head.html ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Hypnosphi ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‹ค์ค‘ ํ”„๋ ˆ์ž„์›Œํฌ ๋…ธ๋ ฅ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์˜ˆ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ (๋ถ„๋ช…ํžˆ) ์ „์ฒด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@alexlafroscia ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ ์ด์•ผ๊ธฐ์˜ ์˜ˆ๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ผํ•˜๋Š” ํšŒ์‚ฌ์—์„œ ์šฐ๋ฆฌ๋Š” ํ•œ๋™์•ˆ Storybook HTML๊ณผ StencilJS ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

@alexlafroscia ๋งค์šฐ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

  • StencilJS JSX ๊ธฐ๋Šฅ(ํ˜„์žฌ Preact ๊ธฐ๋ฐ˜)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ํ‰๋ฒ”ํ•œ ์˜ค๋ž˜๋œ JS ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...
  • ์›น ๊ตฌ์„ฑ ์š”์†Œ์šฉ Smart Knobs ์• ๋“œ์˜จ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @DesignByOnyx ๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” StencilJS: Fall 2019 Stencil Roadmap์˜ ์ง„ํ–‰ ์ค‘์ธ ๋กœ๋“œ๋งต์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํŠนํžˆ:

๊ณต๊ฐœ ์ปดํŒŒ์ผ๋Ÿฌ API

์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘ํ•˜๊ณ  ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜์—ญ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์ž‘๋™ํ•˜๊ณ  ๋‹ค๋ฅธ ๋„๊ตฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ Stackblitz, CodeSandbox ๋ฐ WebComponents.dev์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ฉ‹์ง„ ํŒ€๊ณผ ํ˜‘๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฏธ NodeJS ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ž‘๋™ํ•˜๋ฏ€๋กœ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ฃผ์š” ๋ฆฌํŒฉํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜ฌ๋ฐ”๋ฅธ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Rollup, Parcel, WebPack ๋ฐ Bazel์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ NodeJS ๋„๊ตฌ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•ด์•ผ ํ•  ๋งŽ์€ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ ๋„๊ตฌ๋“  NodeJS ํ™˜๊ฒฝ์ด๋“  ์ƒ๊ด€์—†์ด ๋„๊ตฌ์˜ ์œ ์ง€ ๊ด€๋ฆฌ์ž์ด๊ณ  Stencil ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ถ€๋‹ด ์—†์ด ์—ฐ๋ฝํ•ด ์ฃผ์‹œ๋ฉด ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์Šคํ…์‹ค์„ ๋‹ค์‹œ ๋นŒ๋“œํ•  ๋•Œ HMR์ด ์ž๋™์œผ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์•ˆ๋˜๋Š”์ง€ ์•„์„ธ์š”?

@shilman Storybook๊ณผ Stencil ์‚ฌ์ด์— ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์„ค์ •์—์„œ "์‹ค์ œ"์—ฐ๊ฒฐ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋œ ์ž์‚ฐ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹จ์ˆœํ•œ <script> ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ ์ด์•ผ๊ธฐ์˜ ์˜ˆ๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์ž…๋‹ˆ๊นŒ?

@Hypnosphi ๊ทธ๋“ค์€์ด ๊ฐ™์€ (๋””ํดํŠธ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋ณด๋ฉด my-component ์Šคํ…์‹ค์€ ์ž์‹ ์ด ๋งŒ๋“  ์ตœ์ดˆ์˜ ํŒจํ‚ค์ง€์— ์ƒ์„ฑํ•˜๋Š” ๋•Œ npm init stencil

import { document, console } from 'global';
import { storiesOf } from '@storybook/html';

storiesOf('My Component', module)
  .add('without a middle name', () => `
    <my-component
      first="Alex"
      last="LaFroscia"
    ></my-component>
  `)
  .add('with a middle name', () => `
    <my-component
      first="Alex"
      middle="Robert"
      last="LaFroscia"
    ></my-component>
  `);

StencilJS JSX ๊ธฐ๋Šฅ(ํ˜„์žฌ Preact ๊ธฐ๋ฐ˜)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ํ‰๋ฒ”ํ•œ ์˜ค๋ž˜๋œ JS ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

@darondel ์Šคํ† ๋ฆฌ ์ €์ž‘ ํŒŒ์ผ์— JSX๊ฐ€ ์—†๋Š” ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์— ๋Œ€ํ•œ ์šฐ๋ ค์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” @storybook/html ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ์ „์— ๊ณผ๊ฑฐ์— ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ OK์ธ React ๊ฒฝํ—˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ" html ๊ฒฝํ—˜์— ๊ฐ€๊น๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋Š” ๋ถ€๋ถ„์€ ์Šคํ† ๋ฆฌ๊ฐ€ HTML ๊ด€์ ์—์„œ ์‹ค์ œ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ ์—ญํ• ์„ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ ์กฐ์ง์—์„œ๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ์ฃผ๋กœ Ember.js ์ƒ์ ์ž…๋‹ˆ๋‹ค).

ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๊ฐ€ ์ข‹์€ ๊ฒฝํ—˜์ด ์•„๋‹ ๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ htm ๊ฐ™์€ ๊ฒƒ์ด ์ข‹์€ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•„์ˆ˜ ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜์ง€๋งŒ Knobs์™€ ๊ฐ™์€ ๊ฒƒ๊ณผ ๋” ์‰ฝ๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค๊ฐ€์˜ค๋Š” DocsPage ์™€ ๊ฐ™์€ ๊ฒƒ๊ณผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด @DesignByOnyx ๊ฐ€ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ์ž‘์—… ์ค‘ ์ผ๋ถ€๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์˜ "๋ฉ”ํƒ€๋ฐ์ดํ„ฐ"๋ฅผ ์ฝ์–ด ๋ฌธ์„œ ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ "v1" ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ "v1.1"์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ •๋ง ๋ฉ‹์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ž๋™ ์†์žก์ด ์• ๋“œ์˜จ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๋‹น์‹ ์˜ ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์ •๋ง ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์˜ค๋Š˜ Storybook 5.2์™€ ํ•จ๊ป˜ ์ถœ์‹œ๋œ DocsPages๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Stencil์—์„œ ์†Œํ’ˆ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ Storybook์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์— ํ•„์š”ํ•œ "์ ‘์ฐฉ์ œ" ๋ฌด๋ฆฌ๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด Stencil๊ณผ ํ•จ๊ป˜ Storybook์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋งž์ถคํ™”๋œ ์• ๋“œ์˜จ ๋˜๋Š” ์‚ฌ์ „ ์„ค์ •์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ํ™•์‹คํžˆ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฃผ์— ์ข€ ๋” ์ด๊ฒƒ์ €๊ฒƒ ํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

@alexlafroscia ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ‘œ์ค€ํ™”ํ•˜๊ณ  @elevatebart )์—์„œ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์„ ๋ณด์•˜๊ณ  @atanasster ๋„ ์„ฑ๋Šฅ์„ ์œ„ํ•ด JSON ํŒŒ์ผ์— prop ์œ ํ˜•์„ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด ์˜์—ญ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์„ 6.0์—์„œ ํ†ตํ•ฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Jetbrains ์ž‘์—…์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๊ฒ€ํ† ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ํŠน์ • ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์ œ ๋ฐฉ์‹๋Œ€๋กœ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

Stencil์˜ ๊ฒฝ์šฐ "๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•"์€ Stencil ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ JSON ๋ฌธ์„œ ๋ฅผ Stencil Storybook ์• ๋“œ์˜จ์œผ๋กœ ์ž˜ ์•Œ๋ ค์ง„ ์œ„์น˜ ๋˜๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด์—๋Š” ์˜ˆ์ƒ๋˜๋Š” props, ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ๋ฐ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์˜ readme ํŒŒ์ผ ๋‚ด์šฉ(์ž๋™ ์ƒ์„ฑ๋œ props ๋ฌธ์„œ ์ œ์™ธ)์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น JSON ํŒŒ์ผ์˜ ์ •๋ณด๋กœ Storybook DocsPage๋ฅผ ์ฑ„์šฐ๋Š” ์ •๋ง ๋งค๋ ฅ์ ์ธ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


ํ•ด๋‹น ํŒŒ์ผ์˜ ์ถœ๋ ฅ ์˜ˆ

{
  "timestamp": "2019-09-18T14:30:38",
  "compiler": {
    "name": "@stencil/core",
    "version": "1.3.2",
    "typescriptVersion": "3.5.3"
  },
  "components": [
    {
      "tag": "fluid-banner",
      "encapsulation": "shadow",
      "readme": "# fluid-banner\n\nThis is the contents of the README!\n",
      "docs": "This is the contents of the README!",
      "docsTags": [],
      "usage": {},
      "props": [],
      "methods": [],
      "events": [],
      "styles": [],
      "slots": []
    },
    {
      "tag": "fluid-button",
      "encapsulation": "shadow",
      "readme": "# fluid-button\n\n\n",
      "docs": "",
      "docsTags": [],
      "usage": {},
      "props": [
        {
          "name": "destructive",
          "type": "boolean",
          "mutable": false,
          "attr": "destructive",
          "reflectToAttr": false,
          "docs": "Whether to display in the `destructive` style",
          "docsTags": [],
          "default": "false",
          "optional": false,
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean",
          "mutable": false,
          "attr": "disabled",
          "reflectToAttr": false,
          "docs": "Whether the button should be treated as `disabled`",
          "docsTags": [],
          "default": "false",
          "optional": false,
          "required": false
        },
        {
          "name": "plain",
          "type": "boolean",
          "mutable": false,
          "attr": "plain",
          "reflectToAttr": false,
          "docs": "Whether to display in the `plain` style",
          "docsTags": [],
          "default": "false",
          "optional": false,
          "required": false
        },
        {
          "name": "primary",
          "type": "boolean",
          "mutable": false,
          "attr": "primary",
          "reflectToAttr": false,
          "docs": "Whether to display in the `primary` style",
          "docsTags": [],
          "default": "false",
          "optional": false,
          "required": false
        },
        {
          "name": "size",
          "type": "\"large\" | \"medium\" | \"small\"",
          "mutable": false,
          "attr": "size",
          "reflectToAttr": true,
          "docs": "The size to display the button",
          "docsTags": [],
          "default": "\"medium\"",
          "optional": false,
          "required": false
        }
      ],
      "methods": [],
      "events": [],
      "styles": [],
      "slots": []
    }
  ]
}

์ผ์ข…์˜ ํ•ดํ‚น(JSON ์ถœ๋ ฅ์„ dist/output.json ์ž‘์„ฑํ•œ ๋‹ค์Œ fetch ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ด)์ด์ง€๋งŒ DocsPage ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šฌ๋กฏ ์†Œํ’ˆ์ž…๋‹ˆ๋‹ค.

Screen Shot 2019-09-18 at 11 35 40 AM

Props ํ…Œ์ด๋ธ”์€ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค. Stencil ์ถœ๋ ฅ์€ ํ…Œ์ด๋ธ”์ด ๊ธฐ๋Œ€ํ•˜๋Š” ๋ชจ๋“  props๋ฅผ ์ œ๊ณตํ•œ ๋‹ค์Œ ์ผ๋ถ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ readme.md ์— ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ํŒŒ์ผ์˜ ๋งจ ์œ„์— ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.


์ง์ ‘ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋Œ€์ฒด page ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

import React, { useContext, useEffect, useState } from "react";
import { DocsPage, DocsContext } from "@storybook/addon-docs/blocks";

export const StorybookDocsPage = () => {
  const docsContext = useContext(DocsContext);
  const [payload, setPayload] = useState(null);

  useEffect(function() {
    fetch("./output.json")
      .then(res => res.json())
      .then(res => setPayload(res));
  });

  if (!payload) {
    return null;
  }

  const component = payload.components.find(component =>
    docsContext.selectedKind.includes(component.tag)
  );

  // Empty because we will use the whole component README
  const titleSlot = () => "";
  const subtitleSlot = () => "";

  const descriptionSlot = () => component.readme;
  const propsSlot = () => ({
    rows: component.props.map(prop => ({
      name: prop.name,
      type: prop.type,
      description: prop.docs,
      required: prop.required,
      defaultValue: prop.default
    }))
  });

  return React.createElement(
    DocsPage,
    { titleSlot, subtitleSlot, descriptionSlot, propsSlot },
    null
  );
};

์—…๋ฐ์ดํŠธ: ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ ์–ป๊ธฐ ์œ„ํ•ด ์ „์ฒด ์‚ฌ์šฉ์ž ์ •์˜ DocsPage (๋‹จ์ˆœํžˆ ์Šฌ๋กฏ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ)๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Screen Shot 2019-09-18 at 12 27 33 PM


์‚ฌ์šฉ์ž ์ •์˜ DocsPage์šฉ ์ฝ”๋“œ

import { createElement as e, useContext, useEffect, useState } from "react";
import { DocsPage, PropsTable } from "@storybook/components";
import { H2, H3 } from "@storybook/components/html";
import {
  Anchor,
  Description,
  DocsContext,
  Preview,
  Story
} from "@storybook/addon-docs/blocks";

function useStencilComponent() {
  const docsContext = useContext(DocsContext);
  const [payload, setPayload] = useState(null);

  useEffect(function() {
    fetch("./output.json")
      .then(res => res.json())
      .then(res => setPayload(res));
  });

  if (!payload) {
    return undefined;
  }

  return payload.components.find(component =>
    docsContext.selectedKind.includes(component.tag)
  );
}

const DocsStory = ({
  id,
  name,
  expanded = true,
  withToolbar = false,
  parameters
}) =>
  e(
    Anchor,
    { storyId: id },
    expanded && e(H3, null, (parameters && parameters.displayName) || name),
    expanded &&
      parameters &&
      parameters.docs &&
      parameters.docs.storyDescription &&
      e(Description, { markdown: parameters.docs.storyDescription }, null),
    e(Preview, { withToolbar }, e(Story, { id, height: "auto" }, null))
  );

export const CustomDocsPage = () => {
  const docsContext = useContext(DocsContext);
  const component = useStencilComponent();
  if (!component) {
    return null;
  }

  const { selectedKind, storyStore } = docsContext;
  const stories = storyStore.getStoriesForKind(selectedKind);
  const [primary, ...otherStories] = stories;

  const propDocs = component.props.length
    ? [
        e(H2, null, "Props"),
        e(
          PropsTable,
          {
            rows: component.props.map(prop => ({
              name: prop.name,
              type: prop.type,
              description: prop.docs,
              required: prop.required,
              defaultValue: JSON.parse(prop.default)
            }))
          },
          null
        )
      ]
    : [];

  const styleDocs = component.styles.length
    ? [
        e(H2, null, "Styles"),
        e(
          PropsTable,
          {
            rows: component.styles.map(style => ({
              name: style.name,
              description: style.docs
            }))
          },
          null
        )
      ]
    : [];

  const additionalStories = otherStories.length
    ? [
        e(H2, null, "Stories"),
        ...otherStories.map(story =>
          e(
            DocsStory,
            { key: story.id, ...story, expanded: true, withToolbar: false },
            null
          )
        )
      ]
    : [];

  return e(
    DocsPage,
    null,
    e(Description, { markdown: component.readme }, null),
    e(
      DocsStory,
      { key: primary.id, ...primary, expanded: false, withToolbar: true },
      null
    ),
    ...propDocs,
    ...styleDocs,
    ...additionalStories
  );
};

์‚ฌ์šฉ์ž ์ •์˜ ํŽ˜์ด์ง€๋Š” ๋˜ํ•œ ๊ฐ ์ด์•ผ๊ธฐ์˜ ๋†’์ด๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ 500px ๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

@alexlafroscia ์ด๊ฒƒ์€ ๋†€๋ž๊ณ  ์—„์ฒญ๋‚œ ์ž‘์—…์ž…๋‹ˆ๋‹ค!

์ฐธ๊ณ ๋กœ, ์šฐ๋ฆฌ๋Š” 5.3์—์„œ prop ํ…Œ์ด๋ธ”์„ ์ผ๋ฐ˜ํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ Vue์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ์Šฌ๋กฏ ๋ฐ ์ด๋ฒคํŠธ์˜ ๊ฐœ๋…์ด ์žˆ์œผ๋ฏ€๋กœ ์ž์ฒด ํ…Œ์ด๋ธ”๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ์Šคํƒ€์ผ ์ž‘์—…์€ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/storybookjs/storybook/issues/8123

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ Jetbrains ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(cc @piotrtomiak): https://github.com/JetBrains/web-types

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ž์„ธํžˆ ๋ณด์ง€ ์•Š์•˜๊ณ  ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋งž๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถฉ์กฑํ•˜๊ณ  ๋„ˆ๋ฌด ๋งŽ์€ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‚˜๋Š” ์šฐ๋ฆฌ ์ž์‹ ์˜ ํ‘œ์ค€์„ ๋ฐœ๋ช…ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ธฐ์กด ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@shilman ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด ๊ตํ™˜์— ๋Œ€ํ•œ ํ‘œ์ค€์„ ์›น ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ (JetBrains) ๋…ธ๋ ฅ์„ ์‚ดํŽด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ์˜ ์ดˆ๊ธฐ ์ถ”์ง„๋ ฅ์€ ๋‹จ์ˆœํžˆ HTML ํŒŒ์ผ์˜ Vue ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์šฐ์ˆ˜ํ•œ ์ฝ”๋“œ ์™„์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์—ˆ์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ํ‘œ์ค€์œผ๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์œผ๋ฏ€๋กœ ์ผ๋ฐ˜ ์ •๋ณด ๊ตํ™˜ ํ˜•์‹(IDE, ๋„๊ตฌ, ๋ฌธ์„œ). ์ง€๊ธˆ๊นŒ์ง€๋Š” Vue ํ”„๋ ˆ์ž„์›Œํฌ์— ์ค‘์ ์„ ๋‘์—ˆ์ง€๋งŒ ์›น ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ๊ธฐํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ง€์›์„ ํ•ญ์ƒ ์—ผ๋‘์— ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. web-types ํ‘œ์ค€์€ ๊ฝค ์‹ ์„ ํ•˜์ง€๋งŒ Vue ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ธ์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ด๋ฏธ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Vue ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์‚ฌ์–‘์„ ์ ๊ทน์ ์œผ๋กœ ํ™๋ณดํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์•ฝ๊ฐ„์˜ ๊ด€์‹ฌ์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด์„œ ๋„ˆ๋ฌด ์ข‹์Šต๋‹ˆ๋‹ค!

web-types JSON ์Šคํ‚ค๋งˆ์— ๋ˆ„๋ฝ๋œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ์‚ฌ์–‘์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Vue ํŠน์ • ํ•ญ๋ชฉ์—๋Š” vue ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ CSS ์ง€์›์„ ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒด ์„น์…˜์ด ๋ˆ„๋ฝ๋˜์–ด ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ web-types ์— ๊ธฐํšŒ๋ฅผ ์ค„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์–ธ์ œ๋“ ์ง€ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ PR์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

web-types ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ถ€์ž‘์šฉ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•  ๋•Œ ์ข‹์€ ์ฝ”๋“œ ์™„์„ฑ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ชจ๋“  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๊ณตํ†ต web-types ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜ ์ง€์›์„ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋” ๋งŽ์€ ํ˜•์‹์„ ์ˆ˜์šฉํ•˜๋ฉด ๋‹ค๋ฅธ IDE๊ฐ€ ์ด ํ˜•์‹์— ๋Œ€ํ•œ ์ง€์›์„ ๋”ฐ๋ฅผ ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” ๋ชจ๋‘์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. :)

@alexlafroscia ํ™˜์ƒ์ ์ธ ์ž‘ํ’ˆ! ์Šคํ…์‹ค ๋ฐ ์Šคํ† ๋ฆฌ๋ถ ํ†ตํ•ฉ(https://github.com/storybookjs/storybook/issues/7644์™€ ํ•จ๊ป˜)์ด ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ์— ์—ฐ๊ฒฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์›๋ž˜ ๋น„์Šทํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ฐŸ์•˜์ง€๋งŒ(๊ธฐ์กด README ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ๋“  ์‚ฌ์šฉํ•˜๊ณ  DocsPage๋กœ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•จ) ๊ถ๊ทน์ ์œผ๋กœ Stencil์ด ๋ฌธ์„œ JSON ํŒŒ์ผ์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ํฌํ•จํ•˜์ง€ _ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์†Œํ’ˆ ๋ฐ ๋ชจ๋“  ๊ฒƒ(ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” JSON ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๋ฐ ์™„๋ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์—).

@alexlafroscia ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. CustomDocsPage ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•์„ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?

addParameters ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‚ฌ์šฉ์ž ์ง€์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋Œ€์‹  ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


.storybook/config.js ์„ค์ •

import { configure, addParameters } from '@storybook/react';
import { themes } from '@storybook/theming';

import { CustomDocsPage } from './docs.jsx';

addParameters({
  options: { theme: themes.dark },
  docs: { page: CustomDocsPage }
});

configure(require.context('../src', true, /\.(story|stories)\.(mdx)$/), module);


component.story.mdx

### Web Component
<Story name="WC">
    <component-name name="test"></component-name>
</Story>

WC ์ž์ฒด๋Š” CustomDocsPage ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์Šคํ† ๋ฆฌ๋ถ ๋ฌธ์„œ ํŽ˜์ด์ง€์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ๋ถ€ ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ๋„ ๊ฒช์—ˆ๋‹ค -- ๋‚˜๋Š” "๊ตฌ์„ฑ ์š”์†Œ" ์ˆ˜์ค€์—์„œ DocsPage ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ–ˆ๋‹ค

https://github.com/storybookjs/storybook/blob/next/addons/docs/docs/docspage.md#replace -docspage

@storybook/html ๊ฐ€ jsx์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋‚ด ์ด์•ผ๊ธฐ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ  ์ž๋™ ์™„์„ฑ๋˜๋ฉฐ document.createElement ๋˜๋Š” ํฐ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜์‘ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งจ ์œ„์— // @jsx ๋กœ typescript๋ฅผ ์†์ด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@vidarc ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡ ์‚ฌ์šฉ์ž ์ •์˜ babel ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์— ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ typescript๋Š” Cannot find name 'h' ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด tsconfig์—๋Š” jsx = react ๋ฐ jsxFactory = h๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจ ์œ„์— ์žˆ๋Š” // <strong i="6">@jsx</strong> h pragma ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DOM ๋…ธ๋“œ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ† ๋ฆฌ๋ถ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ: https://github.com/developit/vhtml ๋‹ค์Œ

ํŽธ์ง‘ : jsx์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ typescript์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :/

@vidarc h ๊ฐ€ ํ•˜์ดํผ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ์šฐ ๋ฌธ์ž์—ด๋„ DOM ์š”์†Œ๋„ ์•„๋‹Œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

vhtml์€ ๊ฐˆ ๊ธธ์„ ๋ณด์ธ๋‹ค

์ฐธ๊ณ ๋กœ web-components ์•ฑ์— ๋Œ€ํ•œ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/storybookjs/storybook/pull/8400

์—ฌ๊ธฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ์™€ ์–ด๋–ป๊ฒŒ ๊ต์ฐจํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? @Vidarc @DesignByOnyx @Edd-Strickland @alexlafroscia @daKmoR

์•„์ง #8400์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ํ†ตํ•ด "๋ผ์ด๋ธŒ" ์Šคํ…์‹ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ํ•˜๋‚˜์˜ ์ฐฝ์—์„œ start-storybook -s ./www ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค๋ฅธ ๊ณณ์—์„œ stencil build --dev --watch ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. .storybook/config.ts ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ HMR์—์„œ ์ฐฝ์„ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
const req = require.context('../src/components', true, /.stories.tsx$/);

function loadStories() {
  req.keys().forEach(filename => req(filename));
}

configure(loadStories, module);

if (module.hot) {
  module.hot.accept(req.id, () => {
    const currentLocationHref = window.location.href;
    window.history.pushState(null, null, currentLocationHref);
    window.location.reload();
  });
}

์กฐ๊ธˆ ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/CleverCloud/clever-components/blob/master/stories/atoms/cc-button.stories.js ์™€ ๊ฐ™์€ ๋Œ€์•ˆ์„ ์กฐ์‚ฌํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” import "./my-component" ๊ฐ€ import { Component } from "@stencil/core" ์ดํ›„ ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

https://github.com/ionic-team/stencil/blob/master/src/compiler/transformers/validate-types-transform.ts

์‹ค์ œ๋กœ IE11์—์„œ ์ž‘๋™ํ•˜๋Š” ์Šคํ…์‹ค ๋ฐ ์Šคํ† ๋ฆฌ๋ถ ๊ตฌํ˜„/๊ตฌ์„ฑ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์šด์ด ์—†์ด ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰๋œ ๊ฐ ๊ตฌํ˜„์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•ญ์ƒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์•ฝ์† ๊ฑฐ๋ถ€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. TypeError: Invalid Scheme with stencil versions 1.2.4 -> 1.7.4.

@shilman web-components ์•ฑ์—์„œ ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด html ํ•˜๋‚˜๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฝ๊ณ  HMR์€ ' t ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ์— ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค.

React, Angular ๋“ฑ๊ณผ ๊ฐ™์€ ์Šคํ† ๋ฆฌ๋ถ ์‹คํ–‰ ์‹œํ€€์Šค์— ์Šคํ…์‹ค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ "๋ผ์ด๋ธŒ" ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์‹œ๋„ํ•  ๊ฒƒ์ด์ง€๋งŒ ๋‚ด๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์‹ค์ˆ˜ํ•˜์ง€ ์•Š๋Š” ํ•œ _์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค_( stencil build --dev --watch ) ๋ฐ ๋Ÿฐํƒ€์ž„์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

import { MyComponent} from "./MyComponent" ์‹œ๋„ํ–ˆ์ง€๋งŒ @Component ๊ฐ€ ์‹ค์ œ๋กœ @stencil/core ์—์„œ ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋นŒ๋“œ ๋‹จ๊ณ„์˜ ์ผ๋ถ€๋กœ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

https://github.com/ionic-team/stencil/blob/master/src/compiler/transformers/validate-types-transform.ts

์ด๊ฒƒ์„ ์•Œ๊ณ  ๋‚ด ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋Š” React ๋ฐ”์ธ๋”ฉ(https://github.com/ionic-team/stencil-ds-plugins)์œผ๋กœ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋˜ ๋Œ€์‹  HMR ๋กœ์ง์„ HTML ๋Œ€์‹  React๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

์ด๊ฒƒ์ด ์Šคํ† ๋ฆฌ๋ถ UX๊ฐ€ React์™€ ์ผ์น˜ํ•˜๋„๋ก ํ•˜๊ณ  Stencil์€ ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌํ˜„์—๋งŒ ๋‚จ๊ฒŒ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

stencil build ๊ฐ€ ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์„ธ์ƒ์˜ ์ข…๋ง์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • package.json ์—์„œ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํ…์‹ค ์‚ฌ์ „ ์„ค์ •์€ ์‹œ์ž‘ ์‹œ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆจ๊ธฐ๋ ค๋ฉด ์ข…๋ฃŒ ์‹œ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›€์ง์ด๋Š” ๋ถ€๋ถ„์ด ์ ์€ ์†”๋ฃจ์…˜์ด ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์ข‹์€ ๊ฒƒ์ด ํฐ ๊ฒƒ์„ ์ ์œผ๋กœ ๋‘์ง€ ๋ง™์‹œ๋‹ค. AFAIK๋Š” ํ˜„์žฌ ๋ชจ๋‘๊ฐ€ ์—ฌ์ „ํžˆ ์ž์ฒด ์Šคํ…์‹ค ์ง€์›์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ผ์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค...

๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜„์žฌ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ์ฆ๋ถ„ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์‚ฌ์šฉ์ž๋กœ ๋งŒ๋“  ์ฃผ๋œ ์ด์œ ๋Š” ์Šคํ…์‹ค์ด ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” "์ด์œ "์˜€์Šต๋‹ˆ๋‹ค.
์Šคํ…์‹ค ํŠน์ • ์—†์ด๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋‚ด ๋ฐ˜์‘ ์ด์•ผ๊ธฐ๋กœ
๋ณ€๊ฒฝ.

2019๋…„ 10์›” 31์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 5:02 Michael Shilman [email protected]
์ผ๋‹ค:

๋‚˜๋Š” ์Šคํ…์‹ค ๋นŒ๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์„ธ์ƒ์˜ ์ข…๋ง์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰:

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๊ฒƒ์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋“ค์˜ package.json์—์„œ https://www.npmjs.com/package/concurrently
  • ์Šคํ…์‹ค ์‚ฌ์ „ ์„ค์ •์€ ์‹œ์ž‘ ์‹œ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆจ๊ธฐ๋ ค๋ฉด ์ข…๋ฃŒ ์‹œ

์›€์ง์ด๋Š” ๋ถ€๋ถ„์ด ์ ์€ ์†”๋ฃจ์…˜์ด ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ์œ„๋Œ€ํ•œ ๊ฒƒ์˜ ์ ์ด ๋˜์‹ญ์‹œ์˜ค. AFAIK ์ง€๊ธˆ์€ ๋ชจ๋‘๊ฐ€ ์—ฌ์ „ํžˆ ๋กค๋ง ์ค‘์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ž์ฒด ์Šคํ…์‹ค ์ง€์›์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ผ์„ ๋‹จ์ˆœํ™”ํ•˜์‹ญ์‹œ์˜ค ...

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/storybookjs/storybook/issues/4600?email_source=notifications&email_token=AAADWTSIACMC4XSZHQWMAFTQRNW2DA5CNFSM4F7Y7BGKYY3PNVWWK3TUL52HS4DFVEXG43VMXHJ2LDNMV
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAADWTWS5RITQW46NXEJHZLQRNW2DANCNFSM4F7Y7BGA
.

์ด์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(์Šคํ…์‹ค)์—์„œ UI(์Šคํ† ๋ฆฌ๋ถ)๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ๋ถ ๋…๋ฆฝ ์‹คํ–‰ํ˜•์œผ๋กœ ์ด๊ฒƒ์€ ์ด๋ฏธ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋น ๋ฅธ ๋ถ€ํŒ… ์‹œ๊ฐ„์„ ์˜๋ฏธํ•˜๋Š” ์Šคํ† ๋ฆฌ๋ถ ๐Ÿ’ช์„ ๋ฏธ๋ฆฌ ๊ตฌ์ถ•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ์Šคํ…์‹ค ๋นŒ๋“œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์Šคํ† ๋ฆฌ๋ถ UI ์‚ฌ์šฉ). ์ฆ‰, ์Šคํ† ๋ฆฌ๋ถ ์›นํŒฉ ์„ค์ •๊ณผ์˜ ์ƒํ˜ธ ์šด์šฉ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š” ์—†์ด ์Šคํ…์‹ค ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์žฅ์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์‚ฌ์šฉํ•˜์—ฌ์ด ์กฐ์‚ฌ es-dev-server ์œ„ํ•œ ์ „์›์— ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ web-components . ์šฐ๋ฆฌ๋Š” ์ผ์ข…์˜ POC๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฑฐ์นœ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์Šคํ…์‹ค์—์„œ๋„ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ๊ฑฐ๋‚˜ ์Šคํ…์‹ค์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๊ฑฐ๋‚˜ es-dev-server ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋ฉด @LarsDenBakker ๊ฐ€ ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๊บผ์ด ๊ณต์œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿค—

์ถ”์‹ : ์ด ๋ชจ๋“  ๊ฒƒ์€ ์Šคํ† ๋ฆฌ๋ถ์— ์ฑ„๋„ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ ๋ฉ‹์ง„ iframe ์„ค์ •์ด ์žˆ์–ด UI๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์™€ ๋ณ„๋„๋กœ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ๐Ÿค—

๋ชจ๋‘ ์•ˆ๋…•

์–ผ๋งˆ ํ›„ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆผ์ด ๋๋‚˜๋ฉด ์Šคํ…์‹ค ํ†ตํ•ฉ ์Šคํ† ๋ฆฌ๋ถ ๊ตฌํ˜„ https://github.com/Edd-Stricland/stencilbook์— ๋Œ€ํ•œ ๋‚ด ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค

์ถ”๊ฐ€๋กœ ๋…ผ์˜ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌํ•ญ์ด readme์™€ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ package.json์„ ๋ณด๋ฉด ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐ”๋‹๋ผ ์Šคํ…์‹ค ์Šคํƒ€ํ„ฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐ”๋‹๋ผ ์Šคํ† ๋ฆฌ๋ถ HTML ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณด์‹œ๊ณ  ํ›„๊ธฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค...

StencilBook - ์Šคํ…์‹ค ์Šคํ† ๋ฆฌ๋ถ ์Šคํƒ€ํ„ฐ

์ด๊ฒƒ์€ ์Šคํ…์‹ค๊ณผ ์Šคํ† ๋ฆฌ๋ถ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…๋ฆฝํ˜• ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ€ํ„ฐ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์›ํŒ

์Šคํ…์‹ค์€ ์›น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์›น ์•ฑ์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค.

์Šคํ…์‹ค์€ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ตœ๊ณ ์˜ ๊ฐœ๋…์„ ๋Ÿฐํƒ€์ž„ ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. Stencil์€ TypeScript, JSX, ์ž‘์€ ๊ฐ€์ƒ DOM ๋ ˆ์ด์–ด, ํšจ์œจ์ ์ธ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ, ๋น„๋™๊ธฐ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ(React Fiber์™€ ์œ ์‚ฌ) ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ–‰๋˜๋Š” 100% ํ‘œ์ค€ ๊ธฐ๋ฐ˜ ์›น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Custom Elements v1 ์‚ฌ์–‘์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ

์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์›น ๊ตฌ์„ฑ ์š”์†Œ์ผ ๋ฟ์ด๋ฏ€๋กœ ๋ชจ๋“  ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ์ „ํ˜€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ณต์ œ

git clone https://github.com/Edd-Strickland/stencilbook.git

๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณ€๊ฒฝ:

cd stencilbook

๋ชจ๋“ˆ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm install

์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

npm run build:all

์ด ์‹คํ–‰ ์Šคํ† ๋ฆฌ๋ถ ํ›„:

npm run storybook

์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šคํ…์‹ค ๋นŒ๋“œ:

npm run stencil

์„œ๋น™/๊ฐ์‹œ ๋ชจ๋“œ์—์„œ ์Šคํ…์‹ค์„ ์ง์ ‘ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

npm run stencil:start

watch ๋ฐ serve๋กœ ์Šคํ† ๋ฆฌ๋ถ ๋ฐ ์Šคํ…์‹ค ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋นŒ๋“œ๋˜์–ด ๋กœ์ปฌ์—์„œ ์ œ๊ณต๋  ์ด์ „ ๋ฒ„์ „์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

npm run storybook:build:all

์ง€์—ญ์—์„œ ์Šคํ† ๋ฆฌ๋ถ ์ œ๊ณต:

npm run storybook:serve

๋ชจ๋“ˆ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm run reset:modules

๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

npm test

์‹œํ—˜

๊ฐ์‹œ ๋ชจ๋“œ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

npm run test.watch

์ƒˆ ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ

์ƒˆ ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ ค๋ฉด:

npm run generate

@Edd-Srickland ๋ฉ‹์ง„ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค! ๋” ์‰ฌ์šด ๋ถ€ํŒ…์„ ์œ„ํ•ด ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด "start": "npm-run-all -p stencil:start storybook" ํ–ˆ์œผ๋ฉฐ ์Šคํ† ๋ฆฌ๋ถ์ด ์Šคํ…์‹ค์ด ๋นŒ๋“œ๋  ๋•Œ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•ซ ๋‹ค์‹œ ๋กœ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

...๊ทธ๊ฑด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ?

@shilman ์ด๋ฏธ ๋งˆ์Šคํ„ฐ ์•ŒํŒŒ์— @storybook/web-components ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ README.md์—์„œ ์ฐธ์กฐ๋œ ์Šคํ…์‹ค์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค: https://github.com/storybookjs/storybook/tree/next/ ์•ฑ/์›น ๊ตฌ์„ฑ ์š”์†Œ

์ด๊ฒƒ์€ ๋ณ‘ํ–‰ ๋…ธ๋ ฅ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์ œ์—์„œ web-components ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. app: web-components ํƒœ๊ทธ๋ฅผ ์ฐพ์•˜์ง€๋งŒ ๋ฐฉ๊ธˆ ๋ฆด๋ฆฌ์Šค ๋ฐ ๋ฒ„๊ทธ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@robaxelsen https://github.com/storybookjs/storybook/pulls?utf8=%E2%9C%93&q=is%3Apr+sort%3Aupdated-desc+is%3Aclosed+label%3A%22app%3A+web-components %22+

@storybook/web-components ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ์ ์ ˆํ•œ ์Šคํ…์‹ค ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค!

@Edd-Srickland ๋ฉ‹์ง„ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค! ๋” ์‰ฌ์šด ๋ถ€ํŒ…์„ ์œ„ํ•ด ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด "start": "npm-run-all -p stencil:start storybook" ํ–ˆ์œผ๋ฉฐ ์Šคํ† ๋ฆฌ๋ถ์ด ์Šคํ…์‹ค์ด ๋นŒ๋“œ๋  ๋•Œ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•ซ ๋‹ค์‹œ ๋กœ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

...๊ทธ๊ฑด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ?

ํ  ์‚ฌ๊ณผ๋Š” ๋ฐ”์˜๊ณ  ์ง€๋‚œ์ฃผ ๋ง์— ํšŒ์˜์— ์ฐธ์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ repo ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

@robaxelsen https://github.com/storybookjs/storybook/pulls?utf8=%E2%9C%93&q=is%3Apr+sort%3Aupdated-desc+is%3Aclosed+label%3A%22app%3A+web-components %22+

@storybook/web-components ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ์ ์ ˆํ•œ ์Šคํ…์‹ค ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค!

์›น ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฐ”๋‹๋ผ ์ธ์Šคํ„ด์Šค์™€ ์ž‘๋™ํ•˜์ง€๋งŒ ์Šคํ…์‹ค์€ ์›น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ W/C๊ฐ€ ์•„๋‹Œ W/C์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ‹€๋ฆผ์—†์ด ๋‘˜ ๋‹ค ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ JS W/C์™€ ์Šคํ…์‹ค ์ปดํŒŒ์ผ๋Ÿฌ์šฉ ํ•˜๋‚˜๋Š” ๋ฐ˜์‘ ๋˜๋Š” ๊ฐ๋„ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์Šคํ† ๋ฆฌ๋ถ ์ธก๋ฉด์—์„œ ์Šคํ…์‹ค ๊ธฐ๋ฐ˜ W/C์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

@daKmoR ๊ณผ ๋งŒ๋‚˜ ์ด๊ฒƒ์ด ์ค‘๋ณต์ธ์ง€ ์ค‘๋ณต์ธ์ง€ ๋…ผ์˜ํ•  ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ ๋‹น๋ถ„๊ฐ„ ์ด ๋ฒ„์ „์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ Bulmil ๊ณผ nuxt-stencil ๋ฐ nuxt ์˜ˆ์ œ ์™€ Stencil ํ†ตํ•ฉ์— ๋Œ€ํ•œ ์ž‘์—…์œผ๋กœ ์ธํ•ด ์šฐ์—ฐํžˆ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ ์ ˆํ•œ Storybook ์ง€์›์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€๊ฐ€ ์ด ์Šค๋ ˆ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ผ๋‹จ ์Šคํ† ๋ฆฌ๋ถ ์„ ์‹คํ–‰ํ•˜๋ฉด Bulmil ๋‚ด์—์„œ ์ฆ‰์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@storybook/addon-actions ์ด(๊ฐ€) ์•„์ง ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๊ฑฐ๋‚˜ ์•„์ง ์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ @Gomah๋ฅผ ๋งŒ๋‚˜์„œ ์Šคํ† ๋ฆฌ๋ถ์˜ ์Šคํ…์‹ค ์ง€์›์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ˜‘์—…์— ๋Œ€ํ•œ ๊ทธ์˜ ์•„์ด๋””์–ด๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ตœ๊ทผ์— ๋‚˜๋Š” Bulmil ๊ณผ nuxt-stencil ๋ฐ nuxt ์˜ˆ์ œ ์™€ Stencil ํ†ตํ•ฉ์— ๋Œ€ํ•œ ์ž‘์—…์œผ๋กœ ์ธํ•ด Bulmil์„ ์šฐ์—ฐํžˆ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ ์ ˆํ•œ Storybook ์ง€์›์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€๊ฐ€ ์ด ์Šค๋ ˆ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ผ๋‹จ ์Šคํ† ๋ฆฌ๋ถ ์„ ์‹คํ–‰ํ•˜๋ฉด Bulmil ๋‚ด์—์„œ ์ฆ‰์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@storybook/addon-actions ์ด(๊ฐ€) ์•„์ง ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๊ฑฐ๋‚˜ ์•„์ง ์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ™•์‹คํžˆ ์œ„์˜ repo ๋‚ด์—์„œ add on action์ด ํ‘œ์ค€ ์Šคํ† ๋ฆฌ๋ถ ์• ๋“œ์˜จ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

E2A: @Gomah ๋ณ€ํ˜•์ด ์•„๋‹Œ ์Šคํ…์‹ค ์ฑ….

์œ„์˜ ๊ธฐ๋ณธ ์Šคํ…์‹ค/SB ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•œ ๋ชฉ์ ์€ ๋‹จ์ˆœํžˆ ์Šคํ† ๋ฆฌ๋ถ์—์„œ ์Šคํ† ๋ฆฌ๋ถ์œผ๋กœ, ์Šคํ…์‹ค์—์„œ ์Šคํ…์‹ค๋กœ, ๊ทธ๋ฆฌ๊ณ  ๋‘˜ ๋‹ค ํ•จ๊ป˜ ํ†ตํ•ฉ๋˜์–ด ์Šคํ…์‹ค์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์›น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์Šคํ† ๋ฆฌ๋ถ ํ”„๋ ˆ์ž„์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ฐ˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” W/C ๋ฒ„์ „์ด ์ด ๋ฐ˜๋ณต๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹คํ–‰๋˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ์กด ๋ฒ„์ „์„ W/C ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ 2์ฃผ ๋™์•ˆ ํŒ€ ์Šคํ”„๋ฆฐํŠธ์— ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” W/C ๋ณ€ํ˜•์ด ๋‹จํŽธํ™”๋˜์ง€ ์•Š๋„๋ก ๋ชจ๋‘ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ W/C ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ ์Šคํ…์‹ค์€ ์‹ค์ œ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ. ๋”ฐ๋ผ์„œ ๋‚˜์ค‘์— W/C๋กœ ์ถœ๋ ฅํ•  JSX ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ์ •๋ง ๊ฐ„๋‹จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŒŒ์ดํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์— ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ typescript๋Š” Cannot find name 'h' ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด tsconfig์—๋Š” jsx = react ๋ฐ jsxFactory = h๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจ ์œ„์— ์žˆ๋Š” // <strong i="7">@jsx</strong> h pragma ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DOM ๋…ธ๋“œ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ† ๋ฆฌ๋ถ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ: https://github.com/developit/vhtml ๋‹ค์Œ

ํŽธ์ง‘ : jsx์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ typescript์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :/

์•ˆ๋…•ํ•˜์„ธ์š” @vidarc์ž…๋‹ˆ๋‹ค. storiesOf() ๊ตฌ๋ฌธ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์…จ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ฝ”๋“œ ์˜ˆ์ œ ๋˜๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์Šคํ† ๋ฆฌ๋ถ๊ณผ ์Šคํ…์‹ค์ด ํ†ตํ•ฉ๋˜์–ด ํ”„๋กœ์ ํŠธ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๊ฐœ์ฒด ์†Œํ’ˆ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด document.createElement() ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. vhtml ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ, ๊ทธ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@robaxelsen https://github.com/storybookjs/storybook/pulls?utf8=%E2%9C%93&q=is%3Apr+sort%3Aupdated-desc+is%3Aclosed+label%3A%22app%3A+web-components %22+

@storybook/web-components ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ์ ์ ˆํ•œ ์Šคํ…์‹ค ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค!

๋‹น์‹  ๋ง์ด ๋งž์•„์š”, ์ €๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. README.md์— ํฌํ•จ๋œ ํด๋”๋ฅผ ๋ณด๊ณ  ๋‹ค๋ฅธ ์›น ๊ตฌ์„ฑ ์š”์†Œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณด์•˜์ง€๋งŒ ์Šคํ…์‹ค์€ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

By default the following folders are included

src/*.js
packages/*/src/*.js
node_modules/lit-html/*.js
node_modules/lit-element/*.js
node_modules/@open-wc/*.js
node_modules/@polymer/*.js
node_modules/@vaadin/*.js

๊ทธ๋ž˜์„œ ์Šคํ…์‹ค์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.

Btw, ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์›น ๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์ „ ์„ค์ •์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ด์ œ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์— ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ typescript๋Š” Cannot find name 'h' ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด tsconfig์—๋Š” jsx = react ๋ฐ jsxFactory = h๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจ ์œ„์— ์žˆ๋Š” // <strong i="8">@jsx</strong> h pragma ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DOM ๋…ธ๋“œ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ† ๋ฆฌ๋ถ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ: https://github.com/developit/vhtml ๋‹ค์Œ
ํŽธ์ง‘ : jsx์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ typescript์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :/

์•ˆ๋…•ํ•˜์„ธ์š” @vidarc์ž…๋‹ˆ๋‹ค. storiesOf() ๊ตฌ๋ฌธ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์…จ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ฝ”๋“œ ์˜ˆ์ œ ๋˜๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์Šคํ† ๋ฆฌ๋ถ๊ณผ ์Šคํ…์‹ค์ด ํ†ตํ•ฉ๋˜์–ด ํ”„๋กœ์ ํŠธ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๊ฐœ์ฒด ์†Œํ’ˆ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด document.createElement() ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. vhtml ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ, ๊ทธ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ตœ์‹  ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ CSF ์Šคํ† ๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ  ์Šคํ† ๋ฆฌ๋ฅผ ์ž˜ ์ž‘๋™ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ํŒฉํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ’ˆ์„ ์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค....

@robaxelsen https://github.com/storybookjs/storybook/pulls?utf8=%E2%9C%93&q=is%3Apr+sort%3Aupdated-desc+is%3Aclosed+label%3A%22app%3A+web-components %22+
@storybook/web-components ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ์ ์ ˆํ•œ ์Šคํ…์‹ค ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค!

๋‹น์‹  ๋ง์ด ๋งž์•„์š”, ์ €๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. README.md์— ํฌํ•จ๋œ ํด๋”๋ฅผ ๋ณด๊ณ  ๋‹ค๋ฅธ ์›น ๊ตฌ์„ฑ ์š”์†Œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณด์•˜์ง€๋งŒ ์Šคํ…์‹ค์€ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

By default the following folders are included

src/*.js
packages/*/src/*.js
node_modules/lit-html/*.js
node_modules/lit-element/*.js
node_modules/@open-wc/*.js
node_modules/@polymer/*.js
node_modules/@vaadin/*.js

๊ทธ๋ž˜์„œ ์Šคํ…์‹ค์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.

Btw, ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์›น ๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์ „ ์„ค์ •์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ด์ œ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์Šคํ…์‹ค๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋‹ค์‹œ ๋ณด๊ณ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์Šคํ…์‹ค๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ซ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ...

...

์•ˆ๋…•ํ•˜์„ธ์š” @vidarc์ž…๋‹ˆ๋‹ค. storiesOf() ๊ตฌ๋ฌธ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์…จ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ฝ”๋“œ ์˜ˆ์ œ ๋˜๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์Šคํ† ๋ฆฌ๋ถ๊ณผ ์Šคํ…์‹ค์ด ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉ๋˜์–ด ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๊ฐœ์ฒด ์†Œํ’ˆ ๋“ฑ์ด ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด document.createElement() ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. vhtml ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ, ๊ทธ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ตœ์‹  ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ CSF ์Šคํ† ๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ  ์Šคํ† ๋ฆฌ๋ฅผ ์ž˜ ์ž‘๋™ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ํŒฉํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ’ˆ์„ ์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค....

๊ฐ์‚ฌ ํ•ด์š”. CSF๊ฐ€ ์ง€๊ธˆ ๊ถŒ์žฅ๋˜๋Š” ์Šคํ† ๋ฆฌ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. jsx ์• ๋“œ์˜จ์ด vhtml btw์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

...

์•ˆ๋…•ํ•˜์„ธ์š” @vidarc์ž…๋‹ˆ๋‹ค. storiesOf() ๊ตฌ๋ฌธ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์…จ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ฝ”๋“œ ์˜ˆ์ œ ๋˜๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์Šคํ† ๋ฆฌ๋ถ๊ณผ ์Šคํ…์‹ค์ด ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉ๋˜์–ด ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๊ฐœ์ฒด ์†Œํ’ˆ ๋“ฑ์ด ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด document.createElement() ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. vhtml ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ, ๊ทธ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ตœ์‹  ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ CSF ์Šคํ† ๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ  ์Šคํ† ๋ฆฌ๋ฅผ ์ž˜ ์ž‘๋™ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ํŒฉํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ’ˆ์„ ์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค....

๊ฐ์‚ฌ ํ•ด์š”. CSF๊ฐ€ ์ง€๊ธˆ ๊ถŒ์žฅ๋˜๋Š” ์Šคํ† ๋ฆฌ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. jsx ์• ๋“œ์˜จ์ด vhtml btw์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ JSX๋Š” ์Šคํ…์‹ค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์„€๋„์šฐ ๋”์œผ๋กœ ์ง์ ‘ ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํ† ๋ฆฌ๋ถ์— ์ปดํŒŒ์ผ๋Ÿฌ ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ํ‘œ์ค€ ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ CSF ์Šคํ† ๋ฆฌ์— ํฌํ•จ์‹œํ‚จ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ํŒฉํ† ๋ฆฌ๋กœ ๊ฐ€์ ธ์™€์„œ ์†Œํ’ˆ์„ ์ฑ„์›๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฒŒ์‹œํ•œ ๋ฐ”๋‹๋ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” VHTML ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์Šคํ…์‹ค๋กœ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ž˜ํผ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ storyOf ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹น์‹ ์€ ๊ณ ์ „์ ์ธ document.createElement ํŒจํ„ด์— ์ž ๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ ์•„์ด์ฝ˜์— ๋Œ€ํ•œ ์ด ์˜ค๋ž˜๋œ ์ด์•ผ๊ธฐ์˜ ๊ตฌ๋ฌธ

import { storiesOf } from '@storybook/html';
/** 
  * Import readme from component into the story 
  */
import markdown from './readme.md';

storiesOf('1-Atoms/icon', module)
    .addParameters({ viewport: { defaultViewport: 'responsive' } })
    .add('knobs', () => {
        /**
         * Add Knobs to component panel
         * Set within Each knob as the third parameter
         */
        let icon = document.createElement('namespace-icon');
        icon.classList.add('namespace-action-plan');
        icon.size = 'medium';
        return icon;
    }, { notes: { markdown } });

VS

import centered from '@storybook/addon-centered/html';
import markdown from './readme.md';

export default {
  title: 'Atoms|Icon',
  decorators: [centered],
  parameters: {
    notes: { markdown },
    viewport: { defaultViewport: 'responsive' }
  }
};

export const knobs = (): HTMLNamespaceIconElement => {
  const icon: HTMLYooIconElement = document.createElement('namespace-icon');

  icon.classList.add('namespace-action-plan');
  icon.size = 'medium';

  return icon;
};

์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์— ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ typescript๋Š” Cannot find name 'h' ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด tsconfig์—๋Š” jsx = react ๋ฐ jsxFactory = h๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจ ์œ„์— ์žˆ๋Š” // <strong i="8">@jsx</strong> h pragma ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DOM ๋…ธ๋“œ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ† ๋ฆฌ๋ถ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ: https://github.com/developit/vhtml ๋‹ค์Œ
ํŽธ์ง‘ : jsx์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ typescript์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :/

์•ˆ๋…•ํ•˜์„ธ์š” @vidarc์ž…๋‹ˆ๋‹ค. storiesOf() ๊ตฌ๋ฌธ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์…จ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ฝ”๋“œ ์˜ˆ์ œ ๋˜๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์Šคํ† ๋ฆฌ๋ถ๊ณผ ์Šคํ…์‹ค์ด ํ†ตํ•ฉ๋˜์–ด ํ”„๋กœ์ ํŠธ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๊ฐœ์ฒด ์†Œํ’ˆ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด document.createElement() ๋กœ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. vhtml ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ, ๊ทธ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@roboxelsen
@storybook/react๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  webpack ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜์—ฌ MDX ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ MD ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ json ๋ฌธ์„œ ์ถœ๋ ฅ ์Šคํ…์‹ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ธ๋ธŒ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์•ฝ๊ฐ„์˜ ์ฝ”๋“œ๊ฐ€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šคํ…์‹ค ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ CLI์—์„œ ์Šคํ† ๋ฆฌ๋ถ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ preview-head.html ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ชฉ์ ์— ์•„์ฃผ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

@Edd-Srickland ์˜ˆ์ œ์™€ ์„ค๋ช…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์š”์†Œ์˜ ์†Œํ’ˆ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์†์„ฑ์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํฌ๋ง์€ vhtml์ด๋‚˜ ์ผ๋ฐ˜ ์Šคํ…์‹ค ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋‚ด ์ด์•ผ๊ธฐ๋ฅผ JSX๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋Œ€์‹ :

export const knobs = (): HTMLNamespaceIconElement => {
  const icon: HTMLYooIconElement = document.createElement('namespace-icon');

  icon.classList.add('namespace-action-plan');
  icon.size = 'medium';

  return icon;
};

...๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ๊ฒƒ์ด๋‹ค.

export const knobs = (): HTMLNamespaceIconElement => {
    return (
        <namespace-icon class="namespace-action-plan" size="medium">
        </namespace-icon>
    );
};

๊ฐ€๋…์„ฑ๊ณผ ์Šคํ† ๋ฆฌ ์ž‘์„ฑ์˜ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด. ๊ทธ๋Ÿฌ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฑด๊ฐ€์š”? ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์ด ๋” ์‰ฌ์šฐ๋ฉด ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋ถˆํ™” ์ฑ„ํŒ…์—์„œ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Rob Axelsen#1373 ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์œ„์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด CSF ์„ค๋ช…์„œ๋„ ์‚ดํŽด๋ณด๊ณ  h ๊ฐ€์ ธ์˜ค๊ธฐ JSX ๊ตฌ๋ฌธ์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ "์Šคํ† ๋ฆฌ์—์„œ HTML ์Šค๋‹ˆํŽซ ๋˜๋Š” DOM ๋…ธ๋“œ ๊ธฐ๋Œ€: "๋‹จ์ˆœํ•œ ์ด์•ผ๊ธฐ" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. "๊ตฌ์„ฑ ์š”์†Œ"์˜.":

export const simpleStory = () => <namespace-icon class="namespace-action-plan" size="medium"></name-spaceicon>;

์ด๊ฒƒ์ด ์›น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์†์„ฑ์„ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์Šคํ† ๋ฆฌ ์ž‘์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด @storybook/web-components ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. lit-html ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์ด ์žˆ๋Š”

์ด๊ฒƒ์€ ์Šคํ† ๋ฆฌ๋ถ๊ณผ ์Šคํ…์‹ค์„ ๋‚˜๋ž€ํžˆ ์‹คํ–‰ํ•  ๋•Œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :)

์Šคํ…์‹ค์ด lit html์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ . ๊ทธ๊ฒŒ Vue์˜ ๋ฌธ์ œ์•ผ...

@shilman ์ด๋ฏธ ๋งˆ์Šคํ„ฐ ์•ŒํŒŒ์— @storybook/web-components ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ README.md์—์„œ ์ฐธ์กฐ๋œ ์Šคํ…์‹ค์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค: https://github.com/storybookjs/storybook/tree/next/ ์•ฑ/์›น ๊ตฌ์„ฑ ์š”์†Œ

์—ฌ๊ธฐ์— ๋งํฌ๋œ ์ €์žฅ์†Œ์— ๋ณต์ œ ์ž‘์—… ๋“ฑ์ด ์—†๋Š” ์›น ๊ตฌ์„ฑ ์š”์†Œ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๊นŒ?

@Edd-Stricland๋Š” ๋ฉ”์ธ ์Šคํ† ๋ฆฌ๋ถ ๋ชจ๋…ธ๋ ˆํฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์Šคํ…์‹ค์ด lit html์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ . ๊ทธ๊ฒŒ Vue์˜ ๋ฌธ์ œ์•ผ...

lit thing ๐Ÿค”

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์›น ๊ตฌ์„ฑ ์š”์†Œ์˜ ์•„๋ฆ„๋‹ค์›€์ž…๋‹ˆ๋‹ค. ํ›„๋“œ ์•„๋ž˜์—์„œ ์Šคํ…์‹ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. lit-html์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์Šคํ† ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ•„์š”ํ•œ ๊ฒƒ์€ ์†์„ฑ์œผ๋กœ "html"์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฟ์ž…๋‹ˆ๋‹ค.

lit-html์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export myStory = () => {
  const dataArray = [{ name: 'john', age: 21 }, { name: 'maria', age: 28 }];
  return html`
    <my-lit-component .title=${'some title'} power="unlimited">
      <p> some light dom</p>
    </my-lit-component>
    <my-stencil-component super-mode .data=${dataArray}></my-stencil-component>
  `;
}

๋”ฐ๋ผ์„œ ์Šคํ† ๋ฆฌ์—์„œ Chrome์˜ DevTools๋กœ ์ด๋™ํ•˜๋ฉด ์กฐ๋ช… ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค์Œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†์„ฑ ์ œ๋ชฉ ์˜ˆ: console.log($0.title) // ์ผ๋ถ€ ์ œ๋ชฉ
  • ์†์„ฑ power eg console.log($0.getAttribute('power')) // ๋ฌด์ œํ•œ

์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ "๋™์ผ"ํ•ฉ๋‹ˆ๋‹ค.

  • ์†์„ฑ ๋ฐ์ดํ„ฐ eg console.log($0.data) // [{ name: 'john', age: 21 }, { name: 'maria', age: 28 }];
  • ์†์„ฑ ์Šˆํผ ๋ชจ๋“œ ์˜ˆ: console.log($0.hasAttribute('super-mode')) // true

lit-html์€ dom๋งŒ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค... dom ์š”์†Œ๊ฐ€ ๋“ฑ๋ก๋œ ์œ„์น˜/๋ฐฉ๋ฒ• lit-html์€ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์€ ์™„์ „ํžˆ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๋ช… ์š”์†Œ, ์Šคํ…์‹ค, ๋ฐ”๋‹๋ผ HTMLElement ๋˜๋Š” ์ „์ฒด ๋ฐ˜์‘/๋ทฐ/๊ฐ๋„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ์›น ๊ตฌ์„ฑ ์š”์†Œ ๋ž˜ํผ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค... ๐Ÿ˜ฑ

์Šคํ…์‹ค์€ ์ปดํŒŒ์ผ๋Ÿฌ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์›น ์ปดํฌ๋„ŒํŠธ๋กœ ์ปดํŒŒ์ผ๋˜๋ฉด ๊ทธ๋ƒฅ dom์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿค—

์ถ”์‹ : @storybook/web-components ๋Š” lit-html์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์Šคํ…์‹ค ํŒ€์€ ์Šคํ…์‹ค/์Šคํ† ๋ฆฌ๋ถ ํ†ตํ•ฉ์„ ๋ณ€๊ฒฝํ•  ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๋ฐฐ์—ด๊ณผ ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” React ์ฒดํฌ์•„์›ƒ https://github.com/the-road-to-learn-react/use-custom-element ๋ฅผ ํ†ตํ•ด ์Šคํ…์‹ค ๋ฐ ์Šคํ† ๋ฆฌ๋ถ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ. ๋‚˜์ค‘์— ์ง์ ‘ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด Storybook/react์™€ Stencil์„ ๊ฒฐํ•ฉํ•˜๋Š” ์Šคํƒ€ํ„ฐ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/bbellmyers/stencil-storybook-starter. ์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•˜๋“œ ์ƒˆ๋กœ ๊ณ ์นจ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์Šคํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํ† ๋ฆฌ๋ถ์ด ์›น ์ปดํฌ๋„ŒํŠธ์šฉ ์Šคํ† ๋ฆฌ๋ถ์„ ๊ฐœ๋ฐœ ์ค‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์Šคํ…์‹ค๋กœ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/storybookjs/storybook/tree/next/app/web-components

@sem4phor ๊ตฌ์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์›น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ๋ถ ์„ค์น˜์—์„œ lit-html์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ERROR in ./node_modules/@storybook/web-components/dist/client/preview/render.js
Module not found: Error: Can't resolve 'lit-html' in '/Users/david/www/stencil-starter/node_modules/@storybook/web-components/dist/client/preview'
 @ ./node_modules/@storybook/web-components/dist/client/preview/render.js 20:15-34
 @ ./node_modules/@storybook/web-components/dist/client/preview/index.js
 @ ./node_modules/@storybook/web-components/dist/client/index.js
 @ ./.storybook/preview.js
 @ multi ./node_modules/@storybook/core/dist/server/common/polyfills.js ./node_modules/@storybook/core/dist/server/preview/globals.js ./.storybook/preview.js ./.storybook/generated-entry.js (webpack)-hot-middleware/client.js?reload=true&quiet=true

@dmartinjs ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์˜ˆ์ œ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” 'lit-html'์„ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Edd-Srickland ์›น ๊ตฌ์„ฑ ์š”์†Œ์šฉ ์Šคํ† ๋ฆฌ๋ถ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ 6.0.0์—์„œ ํด๋ฆฌ๋จธ์šฉ ์Šคํ† ๋ฆฌ๋ถ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ๋ถ์ด ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์›น ๊ตฌ์„ฑ ์š”์†Œ ์Šคํ† ๋ฆฌ๋ถ์€ ์Šคํ…์‹ค ์›น ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šคํ…์‹ค์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํ† ๋ฆฌ๋ถ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋Š” ํ•œ ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„์˜ ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@LarsDenBakker ๋Š” ์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด webpack ํ”Œ๋Ÿฌ๊ทธ์ธ/๋กœ๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ( ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ HMR๋กœ ๋งŒ๋“ค๊ณ  ๋™์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)

์˜ˆ, ์Šคํ…์‹ค ์ž์ฒด๊ฐ€ ๋กค์—…์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ. ์ปดํŒŒ์ผ ๋‹จ๊ณ„๋ฅผ ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์›นํŒฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‚ด๋ถ€์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๋ชจ๋ฅธ๋‹ค.

์Šคํ…์‹ค์€ Webpack์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋กค์—…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ  -watch ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ…์‹ค์—์„œ ํ•ด๋‹นํ•˜๋Š” HMR์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ…์‹ค์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์Šคํ…์‹ค์ด ๋‹ค์‹œ ๋กœ๋“œ๋˜๊ณ  ์—…๋ฐ์ดํŠธ๋˜๋ฉด Storybook์ด ๋‹ค์‹œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปค๋ฒ„๋˜๋ฏ€๋กœ ๋งค๋ฒˆ ๋นŒ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ตœ์‹  SB ๋˜๋Š” ์Šคํ…์‹ค๋กœ ์—…๋ฐ์ดํŠธํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์ง€๋งŒ ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ„์† ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”

@Edd-Srickland ์›น ๊ตฌ์„ฑ ์š”์†Œ์šฉ ์Šคํ† ๋ฆฌ๋ถ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ 6.0.0์—์„œ ํด๋ฆฌ๋จธ์šฉ ์Šคํ† ๋ฆฌ๋ถ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ๋ถ์ด ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์›นํŒฉ ์‚ฌ์šฉ๊ณผ ๋กค์—… ์‚ฌ์šฉ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์œ„์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ํ˜„์žฌ SB WC ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ Œ๋”๋ง์„ ์œ„ํ•ด ์ „์ฒด ์Šคํ…์‹ค ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋ผ์ด๋ธŒ ๋‹ค์‹œ ๋กœ๋“œ/HMR์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด HMR์˜ ๋ชจ๋“  ์žฅ์ ์ด ์Šคํ…์‹ค๋กœ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฒ„์ „์€ ํ˜„์žฌ ํด๋ฆฌ๋จธ ๋ฒ„์ „์ด ์•„๋‹Œ HTML ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋ฒ„์ „์„ ํ๊ธฐํ•˜๋ ค๋Š” ์žฅ๊ธฐ์ ์ธ ๋ชฉํ‘œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@LarsDenBakker ๋Š” ์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด webpack ํ”Œ๋Ÿฌ๊ทธ์ธ/๋กœ๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ( ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ HMR๋กœ ๋งŒ๋“ค๊ณ  ๋™์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์–ธํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํ…์‹ค์˜ ์›นํŒฉ ๋ฒ„์ „์€ ํ›จ์”ฌ ๋” ์–ด๋ ค์šด ๊ฐœ๋ฐœ ๊ฒฝ๋กœ์ด๋ฉฐ ํ•„์š” ์—†์ด ์ข…์†์„ฑ ํ’‹ํ”„๋ฆฐํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์Šคํ…์‹ค์„ ์‹œ๊ณ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. WC ๋˜๋Š” SB ์ธ์Šคํ„ด์Šค์˜ ๋ณ€๊ฒฝ. ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์Šคํ…์‹ค ์ž์ฒด๊ฐ€ ๋กค์—…์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ. ์ปดํŒŒ์ผ ๋‹จ๊ณ„๋ฅผ ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์›นํŒฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‚ด๋ถ€์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๋ชจ๋ฅธ๋‹ค.

์ด๋ฏธ ์Šคํ…์‹ค WP ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ง€์›๋˜๊ฑฐ๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์Šน์ธํ•œ ์ข…์†์„ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค.

cc @jthoms1 @adamdbradley

@dmartinjs ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์˜ˆ์ œ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” 'lit-html'์„ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@sem4phor ๊ตฌ์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์›น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ๋ถ ์„ค์น˜์—์„œ lit-html์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ERROR in ./node_modules/@storybook/web-components/dist/client/preview/render.js
Module not found: Error: Can't resolve 'lit-html' in '/Users/david/www/stencil-starter/node_modules/@storybook/web-components/dist/client/preview'
 @ ./node_modules/@storybook/web-components/dist/client/preview/render.js 20:15-34
 @ ./node_modules/@storybook/web-components/dist/client/preview/index.js
 @ ./node_modules/@storybook/web-components/dist/client/index.js
 @ ./.storybook/preview.js
 @ multi ./node_modules/@storybook/core/dist/server/common/polyfills.js ./node_modules/@storybook/core/dist/server/preview/globals.js ./.storybook/preview.js ./.storybook/generated-entry.js (webpack)-hot-middleware/client.js?reload=true&quiet=true

์ด์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์ข…์†์„ฑ์„ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @storybook/web-components์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ข…์†์„ฑ์œผ๋กœ ์ž๋™ ์„ค์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...?

@LeeBurton ์ด ํ”ผ์–ด ์ข…์†์„ฑ์ด๋ผ๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ? (์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•„๋งˆ๋„ ๊ทธ๋ž˜์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค) cc @daKmoR

@LeeBurton ์„ ํ…Œ์ŠคํŠธํ•  ๋‹น์‹œ lit-html์€ ํ”ผ์–ด ์ข…์†์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ”ผ์–ด ์ข…์†์„ฑ์„ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ •์ƒ์ž…๋‹ˆ๋‹ค. https://nodejs.org/es/blog/npm/peer-dependencies/

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— .storybook/preview.js ์—์„œ ์ด ๊ตฌ์„ฑ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ์Šคํ…์‹ค์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

import { defineCustomElements } from "../dist/esm/loader.mjs"
defineCustomElements()

configure(require.context('../src', true, /.*\.stories\.(js|mdx)$/), module);

@idmyn ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ src ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ˆ˜๋™ ํ•˜๋“œ ๋‹ค์‹œ ๋กœ๋“œ ์—†์ด๋Š” ์—ฌ์ „ํžˆ ๋ธŒ๋ผ์šฐ์ €์— ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

npm-run-all ํŒจํ‚ค์ง€์™€ ๋ณ‘๋ ฌ๋กœ start-storybook ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ํ•˜๋‚˜์˜ npm ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹œ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•œ ์ƒํƒœ์—์„œ ์Šคํ…์‹ค์˜ ๋นŒ๋“œ๋ฅผ ๋กœ์ปฌ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด main.js์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ Stencil์˜ dist ํŒŒ์ผ์„ ๋ณด๋„๋ก ์Šคํ† ๋ฆฌ๋ถ์˜ webpack ๊ตฌ์„ฑ์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

const path = require('path');
const glob = require('glob');

module.exports = {
  webpackFinal: (config) => {
    // watch all revelant files in dist folder
    const distDir = path.resolve(__dirname, '../dist');
    const files = glob.sync(`${distDir}/**/*.entry.js`, { absolute: true, ignore: ['**/*.system.entry.js'] });
    config.entry.push(...files);
    return config;
  },
};

ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ๋กœ/ํŒŒ์ผ์„ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@DesignByOnyx ๋˜๋Š” @Edd-

@Edd-Stricland์˜ ์‚ฌ๋ณธ์„ 6.0.0-๋ฒ ํƒ€๋กœ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์„ฑ๊ณต์ ์œผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์˜ˆ: readme.md)์„ ๋ฐœ๊ฒฌํ•  ๋•Œ ํ•ญ์ƒ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ @paulpelton์ž…๋‹ˆ๊นŒ?

์ง€๊ธˆ์ž…๋‹ˆ๋‹ค, ์Šค์Šค๋กœ๋ฅผ ๋„์™€์ฃผ์„ธ์š” :-)

๋‚˜๋Š” Edd์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํฌํ–ˆ์Šต๋‹ˆ๋‹ค . @Edd-Srickland, PR์„ ํ•˜๋ฉด ๋ ๊นŒ์š”? ์ข‹์€ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๋ฅผ ์ถฉ๋Œํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์ƒˆ ํ˜•์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ดํ•‘์„ ์ถ”๊ฐ€ํ•˜๊ณ  tsconfig์—์„œ ์ฐธ์กฐํ•˜์—ฌ ์Šคํ…์‹ค ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํ† ๋ฆฌ๋ฅผ ์–ป๊ณ  '๋ฉ”๋ชจ'๋ฅผ '๋ฌธ์„œ'๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์‹œ๋ฆฌ์ŠคํŠธ:

  • ๊ธ€์Ž„์š”, ํ†ตํ•ฉ์ด ์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” mdx์™€ CSF ๋ชจ๋‘์ž…๋‹ˆ๋‹ค.
  • ์ €๋Š” Storybook HTML์—์„œ Storybook Webcomponent ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์ ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.
  • ์Šคํ…์‹ค ๋ฌธ์„œ๊ฐ€ 'ํ†ตํ•ด' ๋ฉ”๋ชจ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ƒˆ ์• ๋“œ์˜จ ๋ฌธ์„œ๋กœ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • ์ด ๋ชจ๋“  ๊ฒƒ์ด ์‚ฌ์ „ ์„ค์ •์„ ํ†ตํ•ด :-)

@paulpelton ๋‚ด๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ndelangen ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ชจ์•˜์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ €๋Š” Stencil๊ณผ Storybook ๋ชจ๋‘์— ๋งค์šฐ ์ต์ˆ™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํ† ๋ก , Google ๋“ฑ์—์„œ ๋Œ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ํ•จ๊ป˜ ๋ญ‰์ณค์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šคํƒ€ํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋„ ๊ฐ€ ๋ณด์•˜๊ณ  ํฐ ์˜๊ฐ์„ ๋ฐ›์•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค(๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!).

https://github.com/elwynelwyn/stencilbook-ding

@storybook/web-components ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์ˆ˜ ์• ๋“œ์˜จ(์˜ˆ: ์ปจํŠธ๋กค, ์ž‘์—…)๊ณผ ํ•จ๊ป˜ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  ๊ฒƒ์˜ ์ตœ์‹  ๋ฒ„์ „..

์Šคํ…์‹ค ๊ฐœ๋ฐœ ์„œ๋ฒ„์™€ ์Šคํ† ๋ฆฌ๋ถ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ”„๋ ˆ์ž„ ๊ฐ„์˜ ์ถ”๊ฐ€ ํ†ตํ•ฉ(๋”ฐ๋ผ์„œ ์Šคํ…์‹ค ์˜ค๋ฅ˜ ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์Šคํ† ๋ฆฌ๋ถ์— ์ธ๋ผ์ธ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค - ๋” ๋‚˜์€ DX!)(๋””์— ๋Œ€ํ•ด์„œ๋Š” ./storybook/preview-body.html ๋ฐ ./src/index.html ).

~Stencil devserver๋ฅผ start-storybook ๋กœ ๋งค์‹œํ•˜์—ฌ ๋‹จ์ผ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์Šคํ…์‹ค์ด ๋’ค์—์„œ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.~
ํŽธ์ง‘: concurrently + wait-on ๋‹จ์ˆœํ™” - ์Šคํ…์‹ค์ด ํšŒ์ „ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ์Šคํ† ๋ฆฌ๋ถ์œผ๋กœ ์ง„ํ–‰

์Šคํ…์‹ค ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์Šคํ† ๋ฆฌ๋ถ ์Šคํ† ๋ฆฌ์— ๋Œ€ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ”„๋ ˆ์ž„(์ „์ฒด ์Šคํ† ๋ฆฌ๋ถ ์•ฑ์ด ์•„๋‹˜)์„ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ HMR์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์ƒ๋‹นํžˆ ์ข‹์Šต๋‹ˆ๋‹ค!

๋ฉ‹์ง„. ๋งํฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•—, repo๊ฐ€ โ€‹โ€‹๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ^^

์—ฌ๊ธฐ์—์„œ stencil v2 ๋ฐ @storybook/web-components v6์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์šฉ๊ตฌ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/bjankord/stencil-storybook-boilerplate

https://github.com/miriamgonp/stencil-web-components-boilerplate์˜ repo๋„ Storybook/Stencil discord ์ฑ„๋„์—์„œ

์ด ๋‘ repos๋Š” ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ๋œ๋‹ค๋ฉด ์ข‹์€ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋‘ ์ €์žฅ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ

๋‚˜๋Š” ์ ์ ˆํ•œ hmr ์†”๋ฃจ์…˜์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค ;) ๊ณง ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ ์ ˆํ•œ hmr ์†”๋ฃจ์…˜์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค ;) ๊ณง ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์—ฌ๊ธฐ์žˆ์–ด!
Stencil 2+ & Storybook 6+ (์ด์ „ ์Šคํ…์‹ค ๋ฒ„์ „๋„ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ;))
https://github.com/dutscher/stencil-storybook
์žฌ๋ฏธ์™€ ๊ฑด๋ฐฐ

ํŽธ์ง‘: gh-pages์˜ ์Šคํ† ๋ฆฌ๋ถ ํฌํ•จ https://dutscher.github.io/stencil-storybook/index.html

์ด๊ฒƒ์„ ์ง€๋‚œ ์ฃผ์— ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋น„ํŠธ(Bootstrap, scss, ๋ฐ˜์Œ๊ณ„ ๋“ฑ)๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์†Œํ•œ ์‚ฌํ•ญ(์˜ˆ: package.json ์ด๋ฆ„์ด @์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ ธ์˜จ ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)์„ ์ˆ˜์ •ํ•œ ํ›„ myorg/my-proj ํ˜•์‹) ์ •๋ง ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํ•˜๋ฃจ ์ •๋„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ HMR์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค!

@elwynelwyn ์Šคํ† ๋ฆฌ๋ถ ์ชฝ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”?

@ndelangen ์ค‘์š”ํ•œ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋ก์‹œ https://github.com/dutscher/stencil-storybook/blob/master/scripts/proxy.js
  2. main.js๋ฅผ ํ†ตํ•œ ์Šคํ…์‹ค ์ƒ์‚ฐ ์ฃผ์ž… https://github.com/dutscher/stencil-storybook/blob/master/.storybook/main.js#L30
  3. dev ๋ฐ prod๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ npm ์Šคํฌ๋ฆฝํŠธ https://github.com/dutscher/stencil-storybook/blob/master/package.json

๊ฑด๋ฐฐ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰