2022-04 
๋งํฌ & ์ฝ์๊ฑฐ๋ฆฌ
React v18.0
React v18์ด ์ง๋ 3/29์ผ ์ ์์ผ๋ก ๋ฆด๋ฆฌ์ค ๋์๋ค. ์ฃผ์ํ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- Automatic Batching
- Transitions
- ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด ๋ ๋๋ง API
- ์ ๊ท Hooks (useId, useTransition, useDeferredValue, useSyncExternalStore, useInsertionEffect)
๊ด์ฌ์ ๋ชจ์๋ 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๋ถ๋ถ์ ํด๋ฆญํด์ผ ํ๋ค.