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

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

    2023-11

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

    The State of Vite

    ์ง€๋‚œ 10์›” 5์ผ ์ง„ํ–‰๋œ ViteConf์—์„œ ๋ฐœํ‘œํ•œ ๋‚ด์šฉ์œผ๋กœ, ์žฅ๊ธฐ์ ์œผ๋กœ rollup๊ณผ esbuild๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ณ„ํš์„ ๋ฐœํ‘œํ–ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Rollup์˜ Rust ํฌํŠธ์ธ "Rolldown"์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    [์ฐธ๊ณ ] ๋‹ค์Œ์˜ ๋‚ด์šฉ๋“ค๊ณผ ๊ฐ™์ด ์ฐธ๊ณ ํ•ด ๋ณด๋ฉด ์ข‹๋‹ค.

    The State of WebAssembly 2023

    2023๋…„ ์˜๊ตญ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ปจ์„คํŒ… ํšŒ์‚ฌ Scott Logic์—์„œ WebAssembly ์กฐ์‚ฌ๋ฅผ ์‹ค์‹œํ•˜์˜€๋‹ค.

    • Rust, JavaScript์˜ ์‚ฌ์šฉ์€ ๊พธ์ค€ํžˆ ์ฆ๊ฐ€ ์ค‘์ด์ง€๋งŒ, ๋” ๋ˆˆ์— ๋„๋Š” ๊ฒƒ์€ Swift์™€ Zig์˜ ์ฑ„ํƒ๋ฅ ์ด ์ฆ๊ฐ€์ด๋‹ค.
    • WASM์„ Web์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ, Serverless์™€ Plugin ํ™˜๊ฒฝ์œผ๋กœ๋„ ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค.

    ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ์ฝ์–ด๋ณด๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

    The Saga of the Closure Compiler, and Why TypeScript Won

    ํ•œ๊ธ€ ๋ฒˆ์—ญ ํฌ์ŠคํŠธ๋กœ ํŽธํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    Google์€ ํฐ JavaScript Application์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ณผ๊ฑฐ ํƒ€์ž…์„ ์ฒดํฌํ•˜๋Š” Closure Compiler๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
    ์ข€ ๋” ์„ค๋ช…ํ•˜์ž๋ฉด, Closure Compiler๋Š” JSDoc ์Šคํƒ€์ผ์˜ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ํ†ตํ•ด ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    /**
     * @param {number} a
     * @param {number} b
     * @return {number}
     */
    function max(a, b) {
      return a > b ? a : b;
    }
    

    Clouser Compiler์™€ TypeScript์˜ ๊ฒฝ์Ÿ์—์„œ ์™œ TypeScript๊ฐ€ ์Šน๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ๋‹ค๋ฃฌ๋‹ค.

    An Interactive Intro to CRDTs

    ํ•œ๊ธ€ ๋ฒˆ์—ญ ํฌ์ŠคํŠธ๋กœ ํŽธํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    CRDT๋Š” โ€œConflict-free Replicated Data Typeโ€(์ถฉ๋Œ ๋ฐฉ์ง€ ๋ณต์ œ ๋ฐ์ดํ„ฐ ํƒ€์ž…)์˜ ์•ฝ์ž๋กœ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํ˜‘์—… ์•ฑ(Google Docs, Figma ๋“ฑ)์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์—†์ด๋„ ์ž์ฒด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฐœ๋…์ด๋‹ค.
    ์ด ๊ธ€์—์„œ๋Š” Last Write Wins Register, Last Write Wins Map์˜ ๊ฐœ๋…์„ ์•Œ์•„๋ณธ๋‹ค.
    ์ด ๊ธ€์€ ์‹œ๋ฆฌ์ฆˆ์˜ ์ฒซ ๋ฒˆ์งธ ๊ธ€๋กœ ํ˜„์žฌ๋Š” ์•„๋ž˜ ๋‘ ๊ฐœ์˜ ๊ธ€์ด ๋” ๋ฐœ๊ฐ„๋˜์—ˆ๋‹ค.

    The Internals of Deno

    Deno๋Š” ์ž˜ ์•Œ๋‹ค์‹œํ”ผ, Node.js๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ Ryan Dhal๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘๋˜์—ˆ๊ณ  ๋”๋””์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์˜์—ญ์—์„œ ์กด์žฌ๊ฐ์„ ํ‚ค์›Œ๊ฐ€๊ณ  ์žˆ๋‹ค.
    Deno์˜ ๋‚ด๋ถ€๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ? ์ด ์ฑ…์€ ์ด๋Ÿฌํ•œ ๊ถ๊ธˆ์ฆ์„ ํ•ด์†Œ์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    [์ฐธ๊ณ ] ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ์˜์ƒ๋„ Deno ๋‚ด๋ถ€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€ ๋  ์ˆ˜ ์žˆ๋‹ค.

    CommonJS์—์„œ ESM์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

    ์นด์นด์˜ค์˜ ์„œ๋น„์Šค ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๋Š” ์„œ๋น„์Šค(lighthouse ๊ธฐ๋ฐ˜)์˜ ESM ์ „ํ™˜์„ ๋‹ค๋ฃจ๋Š” ๊ธ€๋กœ, lighthouse์˜ CJS -> ESM ์ „ํ™˜์— ๋”ฐ๋ผ ์„œ๋น„์Šค๋„ ESM ์œผ๋กœ ์ „ํ™˜ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
    CommonJS ํ™˜๊ฒฝ์—์„œ ์šด์˜ํ•˜๋˜ ์„œ๋น„์Šค๋ฅผ ESM ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃจ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ๋‹ค์–‘ํ•œ ํŒ๋“ค์„ ์ œ๊ณตํ•ด ์ค€๋‹ค.

    HTTP/3 Performance for JS Developers

    HTTP/3๋Š” โ€™22/6์›”, ํ‘œ์ค€ํ™”๋œ ์ด๋ž˜, ๋น ๋ฅด๊ฒŒ ์ฑ„ํƒ๋˜๊ณ  ์žˆ์œผ๋ฉฐ HTTP/1์„ ๋„˜์–ด์„ฐ๋‹ค. FE ๊ด€์ ์—์„œ ์ด๋Ÿฌํ•œ ํ”„๋กœํ† ์ฝœ์˜ ๋ณ€ํ™”์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ?

    ์ฒซ ๋„คํŠธ์›Œํฌ ์™•๋ณต(Round Trip)์— ๋Œ€ํ•œ JS ๋กœ๋”ฉ ์ตœ์ ํ™”, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋Œ€๋น„, JS ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์„ ์†Œ๊ฐœํ•œ๋‹ค. ๋˜ํ•œ ํ”„๋กœํ† ์ฝœ๊ณผ fetch()์˜ ํ†ตํ•ฉ์„ ์‚ดํŽด๋ณด๊ณ , ๊ณง ์ถœ์‹œ๋  WebTransport์— ๋Œ€ํ•ด์„œ๋„ ์ด์•ผ๊ธฐํ•œ๋‹ค.

    [์ฐธ๊ณ ] HTTP/3์˜ ์ฑ„ํƒ๋ฅ ์€ ๋น ๋ฅด๊ฒŒ ์ƒ์Šนํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด 21~23๋…„๊ฐ„ HTTP ๋ฒ„์ „์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ๋Ÿ‰ ์ง€ํ‘œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    300ms Faster: Reducing Wikipedia's Total Blocking Time

    Wikipedia ๋ชจ๋ฐ”์ผ ์‚ฌ์ดํŠธ์˜ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ–ˆ๋Š”์ง€ ์†Œ๊ฐœํ•˜๋Š” ๊ธ€์ด๋‹ค.
    ์ฒ˜์Œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ 600ms ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” JS ์ž‘์—…์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋‘ ๋‹จ๊ณ„์— ๊ฑฐ์ณ ๊ฐœ์„ ํ•˜์˜€๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋กœ๋”ฉ ์‹œ๊ฐ„(TBT, Total Blocking Time)์„ 300ms ์ •๋„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    The Negative Impact of Mobile-First Web Design on Desktop

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

    ์„ธ๊ณ„์ ์ธ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์ปจ์„คํŒ… ํšŒ์‚ฌ์ธ ๋‹์Šจ ๋…ธ๋งŒ์—์„œ ์ž‘์„ฑํ•œ ์ด ๊ธ€์€ ์˜ค๋Š˜๋‚ ์˜ ๋ชจ๋ฐ”์ผ ํผ์ŠคํŠธ ์›น๋””์ž์ธ์˜ ์‚ฌ์šฉ์„ฑ์ด ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ „๋‹ฌํ•ด ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” '์ฝ˜ํ…์ธ  ๋ถ„์‚ฐ'์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃฌ๋‹ค.

    Next.js 14

    Next.js 14๋ฒ„์ „์ด ๊ณต๊ฐœ๋˜์—ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • Server Actions (Stable)
      • 13 ๋ฒ„์ „์—์„œ ์‹คํ—˜์ ์œผ๋กœ ๊ณต๊ฐœ๋œ Server Actions๊ฐ€ 14๋ฒ„์ „์—์„œ Stable๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
    • turbopack (unstable)
      • 53% ๋น ๋ฅธ ๊ฐœ๋ฐœ(๋กœ์ปฌ) ์„œ๋ฒ„ ์‹œ์ž‘, 94% ๋นจ๋ผ์ง„ ์ฝ”๋“œ ๋ฐ˜์˜
      • next dev --turbo ๋ช…๋ น์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      • ํ„ฐ๋ณดํŒฉ์€ ์•„์ง 90%์˜ next dev integeration test๋งŒ ํ†ต๊ณผํ•œ ์ƒํƒœ์ด๋ฉฐ, ์ถ”ํ›„ 100% ํ†ต๊ณผ ์‹œ stable๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ด๋‹ค.
    • Partial Prerendering (Preview)
      • ๊ธฐ๋ณธ ์‘๋‹ต ๋ฐ์ดํ„ฐ์™€ ์ŠคํŠธ๋ฆฌ๋ฐ ๋™์  ์ปจํ…์ธ  ์ „๋‹ฌ ๊ธฐ๋Šฅ์„ React ์˜ Suspend ๊ธฐ๋ฐ˜ ์œ„์—์„œ ๊ตฌํ˜„.
    • Metadata Improvements
      • server component์—์„œ viewport object์™€ generateViewport function์„ exportํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋‹ค๋ฅธ ๊ธฐ์กด์˜ metadata ์˜ต์…˜์€ ์œ ์ง€๋œ๋‹ค.

    The Future of CSS: Easy Light-Dark Mode Color Switching withย light-dark()

    ๋ผ์ดํŠธ ๋ชจ๋“œ ๋˜๋Š” ๋‹คํฌ ๋ชจ๋“œ ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ prefers-color-scheme ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    :root {
      --text-color: #333; /* Value for Light Mode */
    }
    
    @media (prefers-color-scheme: dark) {
      :root {
        --text-color: #ccc; /* Value for Dark Mode */
      }
    }
    

    ์ด ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด CSS Color Module Level 5์— ์ƒˆ๋กœ์šด light-dark()๋ผ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐ€์ง€ ์ƒ‰์ƒ ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›๊ณ , ์‚ฌ์šฉ ์ค‘์ธ ์ƒ‰ ๊ตฌ์„ฑํ‘œ์— ๋”ฐ๋ผ ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋‘ ๋ฒˆ์งธ ์ƒ‰์ƒ ๊ฐ’์„ ํ™œ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

    :root {
      /* light-dark() ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด color-scheme ์„ ์–ธ์ด ํ•„์š”ํ•˜๋‹ค. */
      color-scheme: light dark;
    }
    
    :root {
      /* In Light Mode = return 1st value. In Dark Mode = return 2nd value. */
      --text-color: light-dark(#333, #ccc); 
    }
    
    

    ์•„์ง์€ Firefox 120+์—์„œ๋งŒ ์ง€์›๋œ๋‹ค.

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

    Making Sense of React Server Components

    ํ•œ๊ธ€ ๋ฒˆ์—ญ ํฌ์ŠคํŠธ๋กœ ํŽธํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    ์ง€๋‚œ 2020๋…„ 12์›” React Server Components๊ฐ€ ์†Œ๊ฐœ๋œ ์ดํ›„๋กœ ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ๋“ค์€ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•œ๋‹ค.
    ์ด ๊ธ€์€ ๊ทธ๋Ÿฐ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ธํฌ๊ทธ๋ž˜ํ”ฝ์„ ํ†ตํ•ด ์ข€ ๋” ์‰ฝ๊ฒŒ ์„ค๋ช…์„ ์‹œ๋„ํ•œ๋‹ค.

    Back/forward cache

    ์ง€๋‚œ 9์›” Yahoo! JAPAN์—์„œ bf Cache ์ ์šฉ์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์„ฑ๊ณผ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค๊ณ  ์†Œ๊ฐœํ–ˆ์—ˆ๋‹ค.
    ์ด ๊ธ€์€ ์‹ค์ œ๋กœ bfCache๋ฅผ ์ ํ•ฉ์„ฑ์„ ํ™•์ธํ•˜๋Š” ํŒ๊ณผ ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์„ ์•Œ๋ ค์ค€๋‹ค.

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

    React Agent

    ReactAgent๋Š” GPT-4 ์–ธ์–ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ์—์„œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ์‹คํ—˜์ ์ธ ์—์ด์ „ํŠธ๋กœ ์ž์‹ ์„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค.

    React, TailwindCSS, Typescript, Radix UI, Shandcn UI ๋ฐ OpenAI API๋ฅผ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    Lit React 1.0

    import React from 'react';
    import {createComponent} from '@lit/react';
    import {MyElement} from './my-element.js';
    
    export const MyElementComponent = createComponent({
      tagName: 'my-element',
      elementClass: MyElement,
      react: React,
      events: {
        onactivate: 'activate',
        onchange: 'change',
      },
    });
    

    ๊ตฌ๊ธ€์˜ Web Components Framework Lit์ด v3.0์„ ๋ฆด๋ฆฌ์Šคํ–ˆ๋‹ค.

    ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ค‘ ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ๋ณ€ํ™”๋Š” @lit/react์ด๋‹ค. @lit/react๋Š” Web Components๋ฅผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ž˜ํ•‘ํ•˜๋ฉฐ ์ƒ๊ธฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค€๋‹ค.

    patch-package

    ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์‹ ์†ํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

    BlockNote

    Notion์ฒ˜๋Ÿผ ๋ธ”๋ก ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ Text Editor์ด๋‹ค.
    ๋ฐ๋ชจ ํŽ˜์ด์ง€์—์„œ ํ…Œ์ŠคํŠธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.