naver/fe-news ๋‰ด์Šค๋ ˆํ„ฐ ๋ทฐ์–ด (๋น„๊ณต์‹)

๋ชฉ์ฐจ
๋ชฉ์ฐจ

    2022-04

    ๋งํฌ & ์ฝ์„๊ฑฐ๋ฆฌ

    React v18.0

    React v18์ด ์ง€๋‚œ 3/29์ผ ์ •์‹์œผ๋กœ ๋ฆด๋ฆฌ์Šค ๋˜์—ˆ๋‹ค. ์ฃผ์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    ๊ด€์‹ฌ์„ ๋ชจ์•˜๋˜ Server Components๋Š” ์•„์ง ๊ฐœ๋ฐœ์ค‘(์‹คํ—˜์ ) ์ƒํƒœ๋กœ, ์ฐจ๊ธฐ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค v18.x๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฒ„์ „์„ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๊ณ  ํ•œ๋‹ค.

    [์ฐธ๊ณ ] ๋‹ค์Œ ๊ธ€์€ v18 alpha ๋ฒ„์ „ ๊ธฐ์ค€์ด๋‚˜, ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    A New Year, A New MDN

    ์ตœ๊ทผ MDN ์›น์‚ฌ์ดํŠธ๊ฐ€ ๊ฐœํŽธ๋˜์—ˆ๋‹ค. MDN์€ ์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋งค์ผ ๋“ค์–ด๊ฐ€๋Š” ์›น์‚ฌ์ดํŠธ๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ ๊ฒƒ์ด๋‹ค.

    MDN์€ 16๋…„ ๋™์•ˆ 45,000๋ช… ์ด์ƒ์˜ ๊ธฐ์—ฌ์ž๋“ค๊ณผ ๋งŽ์€ ๋ณ€ํ™”๋ฅผ ๊ฒช์œผ๋ฉด์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์žˆ์–ด์„œ ๋‹ค์†Œ ์ผ๊ด€์„ฑ์„ ์žƒ์—ˆ๋‹ค๊ณ  ํ•ด๋„ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

    ์ด๋ฒˆ ๊ฐœํŽธ์€ 2021๋…„ ์ค‘์ˆœ๋ถ€ํ„ฐ ์ž‘์—…์ด ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ ์ „์ฒด์ ์œผ๋กœ ์ผ๊ด€๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๊ณ  44,000๊ฐœ์˜ ๊ธ€์„ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    [์ฐธ๊ณ ] ์ง€๋‚œ FE News '21/7์›” ์†Œ์‹์„ ํ†ตํ•ด ๊ณต์œ ๋˜์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์œ ๋ฃŒ ์„œ๋น„์Šค์ธ MDN Plus๋„ ์ •์‹ ๊ณต๊ฐœ๋˜์—ˆ๋‹ค.

    A Proposal For Type Syntax in JavaScript

    ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ(MS)์—์„œ JavaScript์—์„œ ํƒ€์ž… ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” 1๋‹จ๊ณ„ ์ œ์•ˆ์„œ๋ฅผ TC39์— ์ œ์ถœํ–ˆ๋‹ค.

    MS ํŒ€์—์„œ ํŒŒ์•…ํ•œ JavaScript ์ƒํƒœ๊ณ„์˜ ์ตœ๊ทผ ํŠธ๋ Œ๋“œ ์ค‘ ํ•˜๋‚˜๋Š” ๋น ๋ฅธ ์ดํ„ฐ๋ ˆ์ด์…˜ ์ฃผ๊ธฐ์™€ ๋นŒ๋“œ ๋‹จ๊ณ„์˜ ๊ฐ„์†Œํ™”์— ๋Œ€ํ•œ ์ˆ˜์š”์˜€๋‹ค. ๋” ๋น ๋ฅด๊ณ  ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ํŠธ๋ Œ๋“œ ์†์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ ๊ณผ์ •์ด ์ข‹์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ํ•ด๋‹น ์ œ์•ˆ์„œ๋ฅผ ์ œ์ถœํ–ˆ๋‹ค.

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

    [์ฐธ๊ณ ] ๋น ๋ฅด๊ฒŒ ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฒˆ์—ญ๊ธ€์„ ์ฐธ๊ณ ํ•˜์ž.

    Explain the First 10 Lines of Twitter's Source Code to Me

    ์ด ๊ธ€์€ ํŠธ์œ„ํ„ฐ HTML ์†Œ์Šค์ฝ”๋“œ์˜ ์ƒ์œ„ 10๊ฐœ ๋ผ์ธ์„ ๋ถ„์„ํ•ด์„œ ์„ค๋ช…ํ•˜๋Š” ๊ธ€์ด๋‹ค. ์ €์ž๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ดˆ ์ง€์‹์˜ ๊นŠ์ด๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐ๋ทฐ์—์„œ ํ•ด๋‹น ์งˆ๋ฌธ์„ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ๋‹ค. (์ธํ„ฐ๋ทฐ๋กœ์„œ ์ข‹์€ ์งˆ๋ฌธ์ธ์ง€๋Š” ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ธ๋“ฏํ•˜๋‹ค.)

    html๊ณผ meta ํƒœ๊ทธ์˜ ์—ฌ๋Ÿฌ ์†์„ฑ์— ๊ด€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํ”Œ๋žซํผ ๊ฐ„์˜ ์ผ๊ด€์„ฑ๊ณผ SEO๋ฅผ ์œ„ํ•ด์„œ ํ•œ ๋ฒˆ์ฏค ์ฝ์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

    Five Things Youย Don'tย Need JavaScript for

    JavaScript๋กœ ๋งŽ์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ƒํ™ฉ๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋” ์žˆ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” ๊ตณ์ด JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  HTML๊ณผ CSS๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” 5๊ฐ€์ง€ ์˜ˆ์‹œ(์‚ฌ์ด๋“œ๋ฐ”, ์•„์ฝ”๋””์–ธ ๋ฉ”๋‰ด, ๋‹คํฌ๋ชจ๋“œ ๋“ฑ)๋ฅผ Svelte ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ณด์—ฌ์ค€๋‹ค.

    ๐Ÿ‡บ๐Ÿ‡ฆ Leaflet Project Appeals to JS Developers for Ukraine

    Leaflet์€ ์šฐํฌ๋ผ์ด๋‚˜์ธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์œ ๋ช…ํ•œ ์ง€๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

    Leaflet ํŒ€์€ Leaflet ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ์ตœ๊ทผ ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋Š” ์ „์Ÿ๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค.

    The Most Modern JavaScript I Know (in One Script)

    ์ด ๊ธ€์—์„œ๋Š” ์งง์€ ์ฝ”๋“œ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ชจ๋˜ JavaScript ๊ฐœ๋…์„ ํฌํ•จํ•œ๋‹ค. ์งง์€ ๊ธ€๋กœ ๊ฐ€๋ณ๊ฒŒ ์ฝ์–ด๋ณด๋ฉฐ ๋ชจ๋˜ JavaScript ๊ฐœ๋…์„ ํ›‘์„ ์ˆ˜ ์žˆ๋‹ค.

    Preemptive Memoization In React Is Probably Not Evil (Yet)

    React์—์„œ ๊ฐ’์— ๋Œ€ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€์ฒด๋กœ useMemo ๋˜๋Š” useCallback hook์„ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ•˜๋ฉฐ, ๋ณดํ†ต ๋ฐ˜๋ณต์  ์ˆ˜ํ–‰์— ๋”ฐ๋ฅธ ๊ณ„์‚ฐ ๊ฐ’์„ ์œ„ํ•œ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ์žฌ ๋ Œ๋”๋ง์— ๋”ฐ๋ผ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์•ˆ์ •ํ™”๋ฅผ ์œ„ํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

    ์ด ๊ธ€์€ ๋‘ ๋ฒˆ์งธ ๋ชฉ์ ์— ์ง‘์ค‘ํ•ด ์žฌ ๋ Œ๋”๋ง ์‹œ, React์˜ semi-functional ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ๊ณผ impure ํ•œ JavaScript ์–ธ์–ด์˜ ๋ถˆ์ผ์น˜์— ๋”ฐ๋ฅธ ๊ฐ์ฒด์˜ ์•ˆ์ •์„ฑ ์ธก๋ฉด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

    [์ฐธ๊ณ ] ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์„ ์ œ์  ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๊ธฐ๋ฒ•์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์‚ฌ์šฉ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‹ค์Œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

    ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ Javascript (์•ฝ๊ฐ„์˜ ์—ญ์‚ฌ๋ฅผ ๊ณ๋“ค์ธ...)

    ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ผญ ์ •๋‹ต์ผ๊นŒ?

    ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋„ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋„ ์•„๋‹ˆ์ง€๋งŒ, ๋˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์ด๊ธฐ๋„ ํ•˜๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๊ธฐ๋„ ํ•œ JavaScript๋กœ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์•ผ ํ• ๊นŒ?

    ์ด ๊ธ€์€ ๊ฐ์ฒด์ง€ํ–ฅ์ด ๊ฐ–๋Š” ํŠน์ง•์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ๋“ฑ์žฅํ–ˆ๋Š”์ง€ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•œ๋‹ค. ๋™์‹œ์— JavaScript๋Š” ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ‘œ๋ฐฉํ–ˆ๋Š”์ง€ ๋น„๊ตํ•˜๋ฉฐ, ๊ฒฐ๊ตญ์—” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๊ด€์ ์ด์ž ๋ฐฉ๋ฒ•๋ก ์ผ ๋ฟ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์—ฌ๋Ÿฌ ์žฅ์ ์„ ์ทจํ•˜๋ฉด์„œ Javascript์˜ ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ข‹์€ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์ด ๋” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์ž„์„ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    Creating Native Web Components

    Minze๋Š” React, Vue.js, Angular์™€ ๊ฐ™์ด ๋ณต์žกํ•œ UI๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ SPA๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๊ณ  ์บก์Аํ™”๋˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” JavaScript ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” Minze๋ฅผ ์‚ฌ์šฉํ•ด ์•„์ฝ”๋””์–ธ, ์Šค์œ„์น˜, ์นด๋“œ ๋“ฑ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณธ๋‹ค.

    Building a loading bar component

    GUI Challenges๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋จผ์ € ์ž‘์„ฑํ•ด ๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋ฐฉ๋ฒ•๋„ ๊ณต์œ ํ•œ๋‹ค.

    ์ด๋ฒˆ์—๋Š” ๋กœ๋”ฉ ๋ฐ” ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์›น ์ ‘๊ทผ์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ณ ๋ คํ•œ ์ ๋“ค์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

    RegexPlay

    ์ž์‹ ์˜ ์ •๊ทœ ํ‘œํ˜„์‹ ์‹ค๋ ฅ์ด ์–ด๋А ์ •๋„์ธ์ง€ ๊ถ๊ธˆํ•˜์ง€ ์•Š์€๊ฐ€? ์ •๊ทœ ํ‘œํ˜„์‹์€ ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋‹ค ๋ณด๋‹ˆ ์ƒ์†Œํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

    RegexPlay์—์„œ ์ •๊ทœ ํ‘œํ˜„์‹ ํ€ด์ฆˆ๋ฅผ ํ’€๊ณ , ์ž์‹ ์˜ ์ ์ˆ˜์™€ ๋ฐฑ๋ถ„์œ„๋ฅผ ํ™•์ธํ•ด ๋ณด์ž.

    ์ฝ”๋“œ์™€ ๋„๊ตฌ

    Reveal.js: An HTML Presentation Framework

    Reveal.js๋Š” HTML์„ ์‚ฌ์šฉํ•ด ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

    CSS๋กœ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์˜ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , Reveal.js์—์„œ ์ œ๊ณตํ•˜๋Š” JavaScript API๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ์•ก์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    PSD: A Zero-Dependency Photoshop Parser

    ๋„ค์ด๋ฒ„ ์›นํˆฐ์—์„œ ๊ฐœ๋ฐœํ•œ ํฌํ† ์ƒต ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

    ํฌํ† ์ƒต ํŒŒ์ผ ํ™•์žฅ์ž์ธ PSD ํ˜น์€ PSB ํŒŒ์ผ์„ ์ง€์›ํ•˜๋ฉฐ ๊ฐ ๋ ˆ์ด์–ด์˜ ์ •๋ณด(์‚ฌ์ด์ฆˆ, ์˜คํ”„์…‹, ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    Introducing Ladle

    Ladle์€ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜จ์ „ํžˆ ๊ณ ๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋„๊ตฌ๋กœ, Storybook์˜ Component Style Format์„ ์ง€์›ํ•˜๋ฉฐ, ๋ณ„๋„์˜ ์ˆ˜์ • ์—†์ด ๊ธฐ์กด Storybook์„ ๋Œ€์ฒด(drop-in replacement) ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

    Uber ๊ฐœ๋ฐœ์ž ํ”Œ๋žซํผ ์†Œ์†์˜ Vojtech Miksu๊ฐ€ ๊ฐœ๋ฐœํ•œ Ladle์€ vite๋ฅผ ์‚ฌ์šฉํ•ด ๋นŒ๋“œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฒˆ๋“ค๋ง ๋  ํ•„์š” ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ESM์œผ๋กœ ์„œ๋น™๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

    Ink: React for interactive command-line apps

    Ink๋Š” React๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ CLI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. React๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด Ink๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ CLI๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    ๋˜ํ•œ, ํ•ด๋‹น ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์ธํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Ink์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ์œ ํ‹ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•ด ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

    • create-ink-app - Ink ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ CLI
    • ink-testing-library - Ink ํ…Œ์ŠคํŒ… ์œ ํ‹ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ink-spinner - Ink Spinner ์ปดํฌ๋„ŒํŠธ
    • ink-text-input - Ink Text Input ์ปดํฌ๋„ŒํŠธ

    ๋‹ค์Œ ์ฝ”๋“œ์™€ ๋ฐ๋ชจ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฐ„๋‹จํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    import React, { useState, useEffect } from "react";
    import { render, Text } from "ink";
    
    const Counter = () => {
      const [counter, setCounter] = useState(0);
    
      useEffect(() => {
        const timer = setInterval(() => {
          setCounter((previousCounter) => previousCounter + 1);
        }, 100);
    
        return () => {
          clearInterval(timer);
        };
      }, []);
    
      return <Text color="green">{counter} tests passed</Text>;
    };
    
    render(<Counter />);
    

    User Inyerface

    ๋ฒจ๊ธฐ์— ๋””์ง€ํ„ธ ์ œํ’ˆ ์—์ด์ „์‹œ ํšŒ์‚ฌ์ธ BAGAAR๊ฐ€ ๊ฐœ๋ฐœํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์ฒดํ—˜(?) ๊ฒŒ์ž„์œผ๋กœ, ์™œ ์ข‹์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•œ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์—ญ์„ค์ ์ด๊ฒŒ๋„ ๊ฐ€์žฅ ์ตœ์•…์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ๋œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ฒดํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

    ๋ฌด์‚ฌํžˆ(?) ํšŒ์›๊ฐ€์ž…์„ ๋„์ „ํ•ด ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

    [Tip] ์ฒ˜์Œ ์‹œ์ž‘์„ ์œ„ํ•ด ํ—ค๋งฌ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ œ์ผ ํ•˜๋‹จ์˜ HERE ๋ถ€๋ถ„์„ ํด๋ฆญํ•ด์•ผ ํ•œ๋‹ค.