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

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

    2024-04

    ๐Ÿ“š ๋งํฌ & ์ฝ์„ ๊ฑฐ๋ฆฌ

    The quiet, pervasive devaluation of frontend

    ์ €์ž๋Š” Front-end ์ถ”์„ธ๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๊ฐ์†Œํ•˜๋ฉฐ, ๋ชจ๋“  ๊ณณ์—์„œ ์ค‘์š”์„ฑ์ด ์ตœ์†Œํ™”๋˜๊ฑฐ๋‚˜ ๊ณผ์ œ ์ˆ˜์ค€์ด ๋‚ฎ์•„์ง€๊ณ  ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

    ๋‹ค์–‘ํ•œ ์ธก๋ฉด์—์„œ Front-end๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ์ธ์‹๊ณผ ๊ณผ์ •๋“ค์„ ํ†ตํ•ด ๋А๋‚€ ์ ์„ ๋‹ค๋ฃจ๋ฉฐ, ๋ช‡ ๋‚ด์šฉ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ์šฐ์„  ์–ธ์–ด์  ์ธก๋ฉด์—์„œ Front-end ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ธ CSS๋Š” ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ฑฐ๋‚˜, ์ง€์ €๋ถ„ํ•˜๋ฉฐ, ๋ณต์žกํ•˜๋ฉฐ ์•…๋ชฝ ๊ฐ™๋‹ค๊ณ  ์–˜๊ธฐํ•œ๋‹ค. HTML๋„ ์œ ์‚ฌํ•œ ์ทจ๊ธ‰์„ ๋ฐ›๊ธฐ๋„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์— ๋Œ€ํ•œ ์˜๋ฏธ๋Š”, ์ด๋“ค์€ "์ง„์งœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋‹ค."๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ ์ด๋‹ค.
    • Front-end ๊ฒฐ๊ณผ๋ฌผ์€ ์–ด๋А ์ •๋„ ์˜ˆ์ˆ ์ ์ด๋ฉฐ, ์˜ˆ์ˆ ์ ์ธ ๊ฒƒ๋“ค์€ ๋‹จ์ˆœํ•˜๊ณ  ์žฌ๋ฏธ์žˆ์–ด ๋ณด์ธ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ๋น„๊ทน์ ์œผ๋กœ ํ‰๊ฐ€ ์ ˆํ•˜๋œ ์˜ค๋žœ ์—ญ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • Front-end ๋„๊ตฌ๋“ค์€ ๋งˆ์น˜ Front-end๋ฅผ ์•„๋ฌด๋„ ํ•˜๊ณ  ์‹ถ์–ด ํ•˜์ง€ ์•Š๋Š” ์ผ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์Šค์Šค๋กœ๋ฅผ ํ™๋ณดํ•˜๋ฉฐ, ์•„๋ฌด๋„ ํ•„์š”ํ•œ ๊ฒƒ ์ด์ƒ์œผ๋กœ ์‹ ๊ฒฝ ์จ์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

    How npm install scripts can be weaponized: A real-world example of a harmful npm package

    ์–ด๋–ป๊ฒŒ NPM์˜ preinstall๊ณผ postinstall ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€์— ์•…์„ฑ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

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

    ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•˜๋Š” 3๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • Package takeover
      • ์ €์žฅ์†Œ ๋˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ํŒจํ‚ค์ง€ ์ง์ ‘ ๋ฐฐํฌ ๊ถŒํ•œ์„ ์–ป๋Š” ๊ณต๊ฒฉ
    • Typosquatting
      • ์ธ๊ธฐ ์žˆ๋Š” ํŒจํ‚ค์ง€์™€ ์œ ์‚ฌํ•œ ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์•…์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ์œ ๋„ (ex. nextt ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด next ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋„๋ก ์œ ๋„)
    • Dependency confusion
      • ๊ธฐ์—…/์กฐ์ง ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ์˜์กด(๊ณต๊ฒฉ ๋Œ€์ƒ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€ ์ง€์‹์ด ํ•„์š”) ํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ฒ„์ „๋ณด๋‹ค ๋†’์€ ๋ฒ„์ „์„ ๊ฐ–๋Š” ๋™์ผ ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€๋ฅผ ๊ณต๊ฐœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ฐฐํฌํ•ด ์„ค์น˜๋˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ณต๊ฒฉ

    ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํŒจํ‚ค์ง€ ์„ค์น˜ ์‹œ --ignore-scripts ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด pre/postinstall ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

    [์ฐธ๊ณ ] ์˜คํ”ˆ์†Œ์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋“ค์˜ ์‚ฌ์šฉ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ, ๋ณด์•ˆ ๋˜ํ•œ ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ๋‹ค. ๋ฏธ๊ตญ์˜ ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ์„ ๋‹ด๋‹นํ•˜๋Š” CISA๋Š” ์ค‘์š” ์ธํ”„๋ผ ๋ณดํ˜ธ๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ๊ณ„ํš์„ ๋ฐœํ‘œํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

    Node.js TSC Confirms: No Intention to Remove npm from Distribution

    Node.js TSC(๊ธฐ์ˆ  ์šด์˜ ์œ„์›ํšŒ)๋Š” ๋‹ค์–‘ํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋“ค์„ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Corepack์˜ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”(์ •ํ™•ํžˆ๋Š” package.json์˜ packageManager ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ)์— ๋Œ€ํ•œ ์—ด๋ค ๋…ผ์˜๊ฐ€ ์ด๋ค„์กŒ์—ˆ๋‹ค.

    Corepack์ด ํ™œ์„ฑํ™”๋œ๋‹ค๋ฉด, ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ์ ์œผ๋ก  Node.js ๋ฐฐํฌ์— NPM์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์•ˆ๋„ ๊ฐ™์ด ๊ฒ€ํ† ๊ฐ€ ์ด๋ค„์กŒ๋‹ค. ๋…ผ์˜ ๋์— TSC ๋ฉค๋ฒ„๋“ค์€ NPM์„ ์ œ๊ฑฐํ•  ์˜๋„๊ฐ€ ์—†์Œ์„ ํ•ฉ์˜ํ•˜๊ณ  ์ด๋ฅผ ๋ฌธ์„œ์ƒ์œผ๋กœ๋„ ๋ช…ํ™•ํžˆ ํ–ˆ๋‹ค.

    Garbage Collection in V8

    V8 ์—”์ง„์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๊ณผ์ •์„ ์ž์„ธํžˆ ๋‹ค๋ฃจ๋Š” ๊ธ€๋กœ, Minor/Major GC์˜ ๊ฐœ๋…๊ณผ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ํ• ๋‹น๋˜๊ณ  ์ถ”์ ๋˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

    ๋น„์›Œ์ง„ ์ดํ›„ ๋นˆ ๊ณต๊ฐ„์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ๋“ฑ์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport

    ์˜ค๋Š˜๋‚  ์‹ค์‹œ๊ฐ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์€ ํ•„์ˆ˜์ ์ด๋‹ค. ๊ณผ๊ฑฐ Long polling์ด ์œ ์ผํ•œ ์˜ต์…˜์ด์—ˆ์ง€๋งŒ, WebSocket์ด ์ด๋ฅผ ๊ณ„์Šนํ–ˆ๊ณ , ๋‹ค์‹œ Server-Sent-Events๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ–ˆ๋‹ค.

    ์ด์ œ WebTransport ํ”„๋กœํ† ์ฝœ(HTTP/3 ๊ธฐ๋ฐ˜)์€ ๋” ํšจ์œจ์ ์ด๊ณ , ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์„ ์ œ๊ณตํ•  ๊ฒƒ์„ ์•ฝ์†ํ•˜๊ณ  ์žˆ๋‹ค.

    ์ด ๊ธ€์€ ์ด๋“ค ๊ธฐ์ˆ ์˜ ์„ฑ๋Šฅ๊ณผ ์žฅ์  ํ•œ๊ณ„๋“ค์„ ๋น„๊ตํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์žฅ๋‹จ์ ์„ ๋‹ค๋ฃฌ๋‹ค.

    [์ฐธ๊ณ ] Using WebTransport

    a global design system

    ์ „ ์„ธ๊ณ„ ์›น ๋””์ž์ด๋„ˆ์™€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ–‰๋™์„ ์ด‰๊ตฌํ•˜๋Š” ๊ธ€์ด๋‹ค.

    ๊ฐ ๊ฐœ๋ณ„ ํ”„๋กœ๋•ํŠธ๋“ค์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌ์ถ•/์œ ์ง€์— ๋Œ€ํ•œ ๋น„์šฉ๊ณผ ๋น„ํšจ์œจ์„ฑ์œผ๋กœ ์ธํ•ด, "๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ"์„ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ๋†’์•„์ง€๊ณ , ๋ชจ๋“ˆ์‹ UI ๊ฐœ๋…์˜ ์„ฑ์ˆ™๊ณผ ๊ธฐ์ˆ ์˜ ํƒ„์ƒ์œผ๋กœ ๋ฐœ์ „ํ•ด ์™”๋‹ค.

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

    [์ฐธ๊ณ ] ๊ธ€๋กœ๋ฒŒ ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ €์ž์˜ ๋‹ค์Œ ๊ธ€์„ ์ด์–ด์„œ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    JSDoc as an alternative TypeScript syntax

    ์ง€๋‚œ 23๋…„ 5์›”, Svelte์˜ TS โ†’ JSDoc ์ „ํ™˜ ์†Œ์‹์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋– ๋“ค์ฉํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์—ˆ๋‹ค.

    ์ด ๊ธ€์€ JSDoc ์ „ํ™˜์„ ์ด‰๊ตฌํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, TypeScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ JSDoc์„ ํ™œ์šฉํ•ด ์ •์  ํƒ€์ดํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๋‹ค์–‘ํ•œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์†Œ๊ฐœํ•œ๋‹ค.

    // Type casting ์˜ˆ์ œ
    
    function example(arg: unknown) {
      const num = arg as number; // TypeScript
      const num = /** @type {number} */ arg; // JSDoc
    
      ...
    }
    

    require(esm) in Node.js

    Node.js๋Š” CJS๊ฐ€ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด์—ˆ๊ณ , ์ดํ›„ ESM ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์‹œ์ ์—์„œ ์–ด๋А ํ•œ์ชฝ์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ(CJS๋ณด๋‹ค ESM์ด๊ฒ ์ง€๋งŒ)๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ํŒจํ‚ค์ง€๋“ค๋„ conditional exports๋ฅผ ํ†ตํ•ด ๋‘ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ๋ชจ๋‘ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.

    ์ด ๊ธ€์€ ์ €์ž๊ฐ€ CJS์˜ import๋ฅผ ์œ„ํ•œ require()๋ฅผ ํ†ตํ•ด ESM ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ œ์ถœํ•œ ๊ฒฝํ—˜๊ณผ ์™œ ์ž์‹ ์˜ PR ์ „์— ์ด๋Ÿฌํ•œ ์‹œ๋„๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•œ๋‹ค.

    What's the difference between JavaScript engines and JavaScript runtimes?

    "JavaScript ์—”์ง„"๊ณผ "JavaScript ๋Ÿฐํƒ€์ž„"์€ ์œ ์‚ฌํ•ด ๋ณด์ด๋ฉฐ "JavaScript๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ"์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ํ˜ผ์šฉ๋˜์–ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋˜ํ•œ ์ข…์ข… V8, Node.js ๋“ฑ์˜ ์กฐํ•ฉ์„ ์ฐธ์กฐํ•˜์—ฌ ํ˜ผ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

    ํ•˜์ง€๋งŒ ๋ฒ”์œ„์™€ ๊ธฐ๋Šฅ ๋ฉด์—์„œ JavaScript ์—”์ง„๊ณผ ๋Ÿฐํƒ€์ž„ ์ด ๋‘˜์€ ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

    ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์˜ ํ—˜๋‚œํ•œ React ์บ˜๋ฆฐ๋” ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ ๋Œ€์ž‘์ „ (feat. Props Drilling)

    Back-end ๊ฐœ๋ฐœ์ž๊ฐ€ React ์บ˜๋ฆฐ๋” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ๊ฒฝํ—˜์„ ๋‹ค๋ฃจ๋ฉฐ, Back-end ๊ฐœ๋ฐœ ๊ด€์ ์—์„œ ๋…ํŠนํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์ ๊ณผ Props drilling ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ™๋ฒ•๋“ค์„ ์†Œ๊ฐœํ•œ๋‹ค.

    Node.js: The Documentary | An origin story

    2008๋…„๋งŒ ํ•ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ์€ JavaScript๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก ์–ธ์–ด๋กœ๋งŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ตฌ๊ธ€์˜ V8์ด ๋“ฑ์žฅํ–ˆ์„ ๋•Œ Ryan Dahl์€ non-blocking ์„œ๋ฒ„, V8๊ณผ JavaScript๋ฅผ ์—ฐ๊ฒฐํ–ˆ๊ณ  ํ•ต์‹ฌ ์š”์†Œ๋“ค์„ ๊ฒฐํ•ฉํ•ด Node.js๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ๋Š” Node.js์˜ ๊ธฐ์›๊ณผ ์ดˆ๊ธฐ ๊ธฐ์—ฌ์ž๋“ค์„ ๋งŒ๋‚˜๊ณ , ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์—…๊ณผ ๊ทธ ๋ฐœ์ „์„ ์ด‰์ง„ํ•˜๋Š” ํ—Œ์‹ ์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์› ๊ฐ„์˜ ๋ณต์žกํ•œ ์—ญํ•™ ๊ด€๊ณ„๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    [์ฐธ๊ณ ] 23๋…„ 5์›” ์†Œ์‹์—์„œ ์†Œ๊ฐœํ–ˆ์—ˆ๋˜ Ryan Dahl์˜ ์ธํ„ฐ๋ทฐ ๋‚ด์šฉ๋„ ๊ฐ™์ด ์ฐธ๊ณ ํ•ด ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

    Dan Abramov - Bluesky, Core React Team, RSC, Strict Dom, and the more!

    React์˜ ์ฝ”์–ด ํŒ€ ๋ฉค๋ฒ„์ธ Dan Abramov์˜ ์ธํ„ฐ๋ทฐ๋กœ, ๊ทธ๋Š” 23๋…„ 8์›” Meta๋ฅผ ํ‡ด์‚ฌํ•˜๊ณ  ํƒˆ์ค‘์•™ํ™” ์†Œ์…œ ๋„คํŠธ์›Œํฌ์ธ Bluesky์— ํ•ฉ๋ฅ˜(FE News 23/10 ์†Œ์‹ ์ฐธ๊ณ )ํ–ˆ์—ˆ๋‹ค.

    ์ธํ„ฐ๋ทฐ์—์„œ๋Š” ์ƒˆ๋กœ ํ•ฉ๋ฅ˜ํ•œ ๊ณณ์—์„œ ์–ด๋–ค ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ด์•ผ๊ธฐํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ React ์ฃผ์ œ๋“ค์ธ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ์—ญ์‚ฌ, ์ƒˆ๋กœ์šด React ์ปดํŒŒ์ผ๋Ÿฌ, ๊ทธ๋ฆฌ๊ณ  React์˜ ๋ฏธ๋ž˜ ๋“ฑ์— ๋Œ€ํ•œ ์ƒ๊ฐ์„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    [์ฐธ๊ณ ] ๋‹ค์Œ ๋งํฌ์—์„  Podcast ํ˜•ํƒœ๋กœ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    • https://www.devtools.fm/episode/92

    Introducing our team, investors & moreโ€ฆ

    20๋…„ 3์›”, GitHub์˜ NPM ์ธ์ˆ˜์™€ ์ƒˆ๋กœ์šด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ธ JSR์˜ ๋“ฑ์žฅ์œผ๋กœ ์ธํ•ด ๋ณ€ํ™”๊ฐ€ ์—†์–ด ๋ณด์ด๋˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์˜์—ญ์— ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์ด ์กฐ์„ฑ๋˜์—ˆ๋‹ค.

    ์ด์ œ ๋˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง• ๋„๊ตฌ์™€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด vlt technology๊ฐ€ ์„ค๋ฆฝ๋˜์—ˆ๊ณ  NPM์„ ๋งŒ๋“ค์—ˆ๋˜ Issac Schlueter๊ฐ€ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋‹ค. ์ดˆ๊ธฐ ๋ฉค๋ฒ„ ๊ตฌ์„ฑ๊ณผ ํˆฌ์ž์ž๋“ค์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๋ฉด์„œ, ํŒ€์˜ ๋ฏธ์…˜์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐํžˆ๊ณ  ์žˆ๋‹ค.

    ํŒจํ‚ค์ง• ์ƒํƒœ๊ณ„๋Š” ์ •์ฒด๋˜์–ด ์žˆ์–ด ํ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ์‚ฌ๋ช…์€ ํ•ญ์ƒ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์œผ๋ฉฐ, ๋‹ค์‹œ ํ•œ๋ฒˆ ํ•จ๊ป˜ ์ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

    ๋‹น๊ทผํŽ˜์ด FE, 4๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋ฉฐ ๋‚˜๋ˆˆ ๋Œ€ํ™”๋“ค

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

    ์ด์— ๋‹น๊ทผ ํŽ˜์ด Front-end ๊ฐœ๋ฐœ์ž ๋„ค ๋ช…์ด ๋ชจ์—ฌ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋กœ ํ†ตํ•ฉํ•ด ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•  ๋ฐฉ์•ˆ์„ ๋…ผ์˜ํ–ˆ๋‹ค. ์ด ๊ธ€์€ ๊ทธ ๋…ผ์˜ ๊ณผ์ •๊ณผ ๊ฒฐ์ •์„ ๊ณต์œ ํ•œ๋‹ค. ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„ํš ์ค‘์ด๋ผ๋ฉด ํด๋” ๊ตฌ์กฐ์™€ ๊ทธ๋ผ์šด๋“œ๋ฃฐ์„ ์ฐธ๊ณ ํ•  ๋งŒํ•˜๋‹ค.

    ํ”Œ๋žซํผ ํŒ€ ์—†๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ํšŒ๊ณ 

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

    ์ด ๊ธ€์€ Mantine์„ ์„ ์ • ํ›„, ์กฐ์ง ๋‚ด ๋‹ค์–‘ํ•œ ์ดํ•ด๊ด€๊ณ„์ž๋“ค๊ณผ์˜ ํ˜‘์˜์™€ ๊ตฌ์ถ• ๊ณผ์ •์—์„œ์˜ 2๋…„์—ฌ๊ฐ„์˜ ๊ฒฝํ—˜์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

    How to be a -10x Engineer

    ๋›ฐ์–ด๋‚œ ์„ฑ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” +10๋ฐฐ์˜ ์—”์ง€๋‹ˆ์–ด๋Š” ์‹ ํ™”์™€ ๊ฐ™์„์ง€ ๋ชฐ๋ผ๋„, ๊ทธ ๋ฐ˜๋Œ€์˜ -10๋ฐฐ ์—”์ง€๋‹ˆ์–ด๋Š” ์กด์žฌํ•œ๋‹ค.
    ๊ธ€์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒํ™ฉ๋“ค์„ ํ†ตํ•ด ๋ฐ”๋กœ ์ฃผ๋‹น 400์‹œ๊ฐ„์˜ ์—”์ง€๋‹ˆ์–ด๋ง ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์†Œ๊ฐœํ•œ๋‹ค.

    In Loving Memory of Square Checkbox

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

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

    ๐Ÿ•น ํŠœํ† ๋ฆฌ์–ผ

    Automate Package Scaffolding in NPM/Yarn/PNPM Monorepo Workspaces

    NPM/Yarn/PNPM Workspace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์„ค์ •ํ•œ ํ›„, ์ฒซ ๋ฒˆ์งธ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— ํ•ด์•ผ ํ•  ์ž‘์—…์œผ๋กœ๋Š” ์ด ํŒจํ‚ค์ง€์˜ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.

    ์ด ๊ฐ€์ด๋“œ๋Š” ๊ธฐ์กด Workspace์—์„œ Nx๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒˆ ํŒจํ‚ค์ง€ ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ๋ฉฐ, ๋ชจ๋…ธ๋ ˆํฌ ๋‚ด์—์„œ "ํˆด๋ง ํŒจํ‚ค์ง€"(๋˜๋Š” Nx ํ”Œ๋Ÿฌ๊ทธ์ธ)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž์„ธํ•œ ๋‹จ๊ณ„์™€ Nx devkit์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด TypeScript ํŒจํ‚ค์ง€ ์Šค์ผ€ํด๋”ฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

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

    WinterJS 1.0

    ๋˜ ๋‹ค๋ฅธ JavaScript ๋Ÿฐํƒ€์ž„์ธ WinterJS๊ฐ€ ์ถœ์‹œ๋˜์—ˆ๋‹ค. Rust๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, SpiderMonkey ์—”์ง„์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋กœ์จ ์ƒํƒœ๊ณ„์—๋Š” V8, JavaScriptCore, ๊ทธ๋ฆฌ๊ณ  SpiderMonkey๊นŒ์ง€ ์ฃผ์š”ํ•œ ์—”์ง„๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๋Ÿฐํƒ€์ž„์„ ํ•„์š”์— ๋งž๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

    WinterJS๋Š” ์ดˆ๋‹น 150k ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ๊ฒฝ์Ÿ ๋Ÿฐํƒ€์ž„๋“ค ๋ณด๋‹ค ๋†’์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

    [์ฐธ๊ณ ] ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ

    Million Lint is in public beta

    Million Lint(ESLint์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์— ์ดˆ์ ์„ ๋งž์ถ˜)๋Š” React ์›น์‚ฌ์ดํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ•ด ์ฃผ๋Š” VSCode ์ต์Šคํ…์…˜์œผ๋กœ, ๋А๋ฆฐ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์„ ์ œ๊ณตํ•œ๋‹ค.

    ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ฐพ๊ธฐ ์œ„ํ•ด React Devtools ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, flamegraph๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ ์ง€์ ์„ ๋ฐ”๋กœ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ๋ณต์žก์„ฑ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค. Million Lint๋Š” linter์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์„ฑ๋Šฅ์  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์  ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ค€๋‹ค.

    ํ˜„์žฌ๋Š” ์ดˆ๊ธฐ ์‹คํ—˜์  ๋‹จ๊ณ„ ์ƒํƒœ๋กœ ๋ถˆํ•„์š”ํ•œ ์žฌ ๋ Œ๋”๋ง์„ ๊ฒ€์ถœํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์œผ๋ฉฐ, ํ–ฅํ›„ ์ƒ์šฉ ์„œ๋น„์Šค์ธ Lint++์„ ์ถœ์‹œํ•  ๊ณ„ํš์ด๋ผ๊ณ  ํ•œ๋‹ค.

    Brick Break Anywhere

    Chrome ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์›ํ•˜๋Š” ์›น ํŽ˜์ด์ง€์—์„œ ๋ฒฝ๋Œ ๊นจ๊ธฐ ๊ฒŒ์ž„์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

    [์ฐธ๊ณ ] ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ๋‹ค์Œ ๋ฐœํ‘œ ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

    Tinylibs

    ์ž‘์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ชจ์€ ํ”„๋กœ์ ํŠธ๋กœ, ๋‹ค์Œ ํŒจํ‚ค์ง€๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    • tinyspy: ์•ฝ 10KB ํฌ๊ธฐ์˜ ํ…Œ์ŠคํŠธ ์ŠคํŒŒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Nano Spy ํฌํฌ)
    • tinyspy: Node.js worker pool (piscina ํฌํฌ)
    • tinybench: ๋ฒค์น˜๋งˆํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • tinyrainbow: ํ„ฐ๋ฏธ๋„ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— ๋‹ค์ฑ„๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • tinylet: Web Worker ํ—ฌํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • tinyhightlight JS/TS/JSX/TSX ๋ฌธ๋ฒ• ํ•˜์ด๋ผ์ดํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (@babel/highlight ํฌํฌ)

    monolith

    ์›นํŽ˜์ด์ง€๋ฅผ ๋‹จ์ผ HTML ํŒŒ์ผ๋กœ ์ €์žฅํ•ด ์ฃผ๋Š” CLI ๋„๊ตฌ๋กœ CSS, ์ด๋ฏธ์ง€, JavaScript ๋“ฑ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฌถ์–ด์ค€๋‹ค. ๋ชจ๋“  ์—์…‹๋“ค์„ dataURLs๋กœ ์ธ๋ผ์ธํ™”ํ•˜๊ณ , ์˜จ๋ผ์ธ์—์„œ ๋ณด๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ Œ๋”๋ง ๋˜๊ฒŒ ํ•œ๋‹ค.

    [์ฐธ๊ณ ] Monolith wasm ํฌํŠธ๋ฅผ ํ™œ์šฉํ•œ Chrome ์ต์Šคํ…์…˜๋„ ์ œ๊ณต๋˜๋‚˜, ํ…Œ์ŠคํŠธํ•ด ๋ณธ ๊ฒฐ๊ณผ ์—์…‹๋“ค์ด ๋ชจ๋‘ ์ธ๋ผ์ธํ™”๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ์—ˆ๋‹ค.