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

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

    2022-02

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

    What You Need to Know About the New Era of Internet Web 3.0 As a Frontend Developer

    Web 3.0์€ ๋ฌด์—‡์ธ๊ฐ€? ์˜จ๋ผ์ธ์—์„œ ์ˆ˜๋งŽ์€ ์ •์˜๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฌด์—‡๋„ ์ •ํ™•ํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์„ค๋ช…๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ ์ž์ฒด์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Web 3.0์€ ๋ฉ”ํƒ€๋ฒ„์Šค, ๋ธ”๋ก์ฒด์ธ, ์•”ํ˜ธํ™”ํ, NFT ๋“ฑ๊ณผ ์—ฐ๊ด€๋œ๋‹ค.

    Front-end ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ• ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Web 1.0 โ†’ 2.0์œผ๋กœ์˜ ์ง„ํ™”์— ๋”ฐ๋ผ Front-end ๊ธฐ์ˆ  ์˜์—ญ์˜ ์ •์˜๊ฐ€ ๋ช…ํ™•ํ•ด์ง„ ๊ฒƒ์ฒ˜๋Ÿผ, Web 3.0์€ ๋˜ ๋‹ค๋ฅธ ๋ณ€ํ™˜์ ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ์•„์ง์€ ์‹œ๊ธฐ ์ƒ์กฐ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์™œ ์˜จ๋ผ์ธ์—์„œ ์ดํ† ๋ก Web 3.0์— ๋Œ€ํ•œ ๋งŽ์€ ์ด์•ผ๊ธฐ๊ฐ€ ์˜ค๊ฐ€๋Š”์ง€ ๊ด€์‹ฌ์„ ๋‘๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์  ๊ด€์ ์—์„œ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

    [์ฐธ๊ณ ] Web 3.0์— ๋Œ€ํ•ด ์ข€ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค์Œ ๋งํฌ๋“ค์„ ์ฐธ๊ณ ํ•˜๋ผ.

    Dependency Risk and Funding

    ํ•œ๊ธ€ ๋ฒˆ์—ญ: ์˜์กด์„ฑ ์œ„ํ—˜์„ฑ๊ณผ ํŽ€๋”ฉ

    '22/1์›” ์ดˆ, ์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋“ค์ธ colors.js์™€ faker.js(FE News '20/12์›” ์†Œ์‹์„ ํ†ตํ•ด ์†Œ๊ฐœ)๋ฅผ ๊ฐœ๋ฐœํ–ˆ๋˜ Marak์€ ๊ฐ๊ฐ ์‹ ๊ทœ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ•˜๋ฉด์„œ colors.js v1.4.1์— ๋ฌดํ•œ ๋ฃจํ”„ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , faker.js v6.6.6์€ ๋น„์–ด์žˆ๋Š” ๋ชจ๋“ˆ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๋”๋ถˆ์–ด ์ €์žฅ์†Œ์˜ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์›Œ๋ฒ„๋ฆฌ๋Š” ์ผ๋ จ์˜ ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค.

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

    ์ธ๊ธฐ ์žˆ๋Š” ํŒจํ‚ค์ง€๋“ค์€ NPM ์ƒํƒœ๊ณ„์˜ ์ด๊ณณ์ €๊ณณ์„ ์ง€ํƒฑํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๋งŒํผ ์ทจ์•ฝํ•œ ๊ฒƒ๋„ ์‚ฌ์‹ค์ด๋‹ค. ์ด๋ฅผ ๋‹จ์ˆœํ•œ ํ•ดํ”„๋‹์œผ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ง€์† ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ณ„๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์šฐ๋ฆฌ ๋ชจ๋‘ ์ง„์ง€ํ•˜๊ฒŒ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ?

    [์ฐธ๊ณ ] faker.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด. fork ํ”„๋กœ์ ํŠธ์ธ Faker ๋˜๋Š” ์œ ์‚ฌํ•œ falso ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

    Discontinued Long Term Support for AngularJS

    AngularJS LTS ์ง€์›์ด ๊ธฐ ์˜ˆ๊ณ ๋˜์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด โ€™21/12/31์ผ์„ ๊ธฐ์ ์œผ๋กœ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ์ด๋กœ์จ JavaScript ์ƒํƒœ๊ณ„์— ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ์ƒˆ๋กœ์šด ์‹œ๋Œ€๋ฅผ ์—ด์—ˆ๋˜ AngularJS๋Š” ๊ทธ ์—ญํ• ์„ ๋‹คํ•˜๊ณ  ๋งˆ์นจํ‘œ๋ฅผ ์ฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

    ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์—ฌ์ •

    ์นด์นด์˜ค ์Šคํƒ€์ผ(๊ตฌ ์ง€๊ทธ์žฌ๊ทธ) ๊ฐœ๋ฐœํŒ€์—์„œ React ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Jotai๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ์„ ๋‹ค๋ฃจ๋Š” ์ฒซ ๋ฒˆ์งธ ์‹œ๋ฆฌ์ฆˆ ๊ธ€๋กœ, ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Mithril, MobX, useReducer ๋“ฑ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ตœ์ข…์ ์œผ๋กœ ์™œ Jotai์— ์ด๋ฅด๊ฒŒ ๋˜์—ˆ๋Š”์ง€๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

    Jotai๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๋ฐํžˆ๊ณ  ์žˆ๋‹ค.

    • ํฐ state๋ฅผ ์ •์˜ํ•˜๋Š” ๋Œ€์‹ , ๊ฐœ๋ณ„ ์ƒํƒœ(atom)๋ฅผ ์ •์˜ํ•ด์„œ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ
    • ๊ฐœ๋…์ด ๋‹จ์ˆœํ•˜๊ณ  ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค๋Š” ๊ฒƒ

    From Jest to Vitest - Migration and Benchmark

    Vitest๋Š” Vite ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒํƒœ๋กœ, stable ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜์ง„ ์•Š์€ ์ƒํƒœ๋‹ค. Vite์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, Jest ํ˜ธํ™˜ API์™€ ๋นŒํŠธ์ธ Chai, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋“ฑ์ด ์ง€์›๋œ๋‹ค.

    Jest์™€ ๋น„๊ต ์‹œ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅผ๊นŒ? ๊ธ€์˜ ์ €์ž๋Š” Jest๋กœ ์ž‘์„ฑ๋œ 37๊ฐœ ํ…Œ์ŠคํŠธ(4๊ฐœ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ Jest โ†’ Vitest๋กœ์˜ ์ „ํ™˜ ๊ณผ์ •๊ณผ ํ•จ๊ป˜ ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

    ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Framework | Initial run | Watch run :--: | :--: | :--: Jest | 6.50s | 5.5s Vitest | 5.30s | 1.25s

    ์Šคํ† ๋ฆฌ๋ถ์œผ๋กœ ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

    Storybook 6.4์— ์ถ”๊ฐ€๋œ Interactive stories๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ์ธํ„ฐ๋ž™์…˜์„ ์ž๋™์œผ๋กœ ์žฌ์ƒํ•˜๊ณ , E2E ๋„๊ตฌ์™€ ๊ฒฐํ•ฉํ•œ Storybook์œผ๋กœ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

    How we migrated 541 components from Styled Components to Emotion with zero bugs

    Storybook ๊ฐœ๋ฐœํŒ€์—์„œ 5๊ฐœ์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค์—์„œ Styled Components๋กœ ์ž‘์„ฑ๋œ 541๊ฐœ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ UI ์Šคํƒ€์ผ์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ Emotion์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ๊ฒฝํ—˜์„ ์†Œ๊ฐœํ•˜๋Š” ๊ธ€์ด๋‹ค.

    Storybook ํŒ€์€ Storybook๊ณผ Chromatic ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ์ธํ•ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์Šคํƒ€์ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. Storybook์€ Emotion์„, ๊ทธ๋ฆฌ๊ณ  Chromatic์€ Styled Components๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

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

    How we reduced our nodejs monorepo build time by 70%

    24๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์•ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” Yarn workspaces์™€ Lerna๋กœ ๊ตฌ์„ฑ๋œ monorepo ํ™˜๊ฒฝ์—์„œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ธ pNpm๊ณผ Monorepo ๋นŒ๋“œ ๊ด€๋ฆฌ ๋„๊ตฌ์ธ Nx๋ฅผ ์‚ฌ์šฉํ•ด, ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๊ธฐ์กด๋ณด๋‹ค 70% ๊ฐ์†Œ์‹œํ‚จ ๊ฒฝํ—˜์„ ์†Œ๊ฐœํ•œ๋‹ค.

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

    2021's JavaScript Rising Stars

    2021๋…„ 1๋…„๊ฐ„ ์ฆ๊ฐ€ํ•œ Github ๋ณ„ ์ˆซ์ž์— ์˜ํ•œ ์ˆœ์œ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ์ดํŠธ์ด๋‹ค. 2021๋…„ ํ•œ ํ•ด ๋™์•ˆ์˜ JavaScript ๊ฐœ๋ฐœ์ž์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    2016๋…„๋ถ€ํ„ฐ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋‹ˆ ์—ฐ๋„๋ณ„๋„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋„ ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    MONADS

    You Don't Know JS๋ผ๋Š” ์œ ๋ช…ํ•œ ์ฑ…์˜ ์ €์ž Kyle์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ Monad๋ฅผ ์†Œ๊ฐœํ•œ ์“ด ๊ธ€์ด๋‹ค. JavaScript๋กœ ์˜ˆ์‹œ ์ฝ”๋“œ๊ฐ€ ์งœ์—ฌ์žˆ์–ด Front-end ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ข€ ๋” ์นœ์ˆ™ํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    DEVS ANSWER: Kent C. Dodds

    Front-end ๊ฐœ๋ฐœ๊ณผ React ์ƒํƒœ๊ณ„์—์„œ ์–ด๋А ์ •๋„์˜ ์‹œ๊ฐ„์„ ๋ณด๋‚ธ ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด, Kent C. Dodds์˜ ๋ช…์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค.

    ์ด ์˜์ƒ์€ ๊ธฐ์ˆ ์ ์ธ ๋‚ด์šฉ๋ณด๋‹ค๋Š” '์ตœ์‹  ๊ธฐ์ˆ  ์Šต๋“์„ ์œ„ํ•œ ์ข‹์€ ๋ฐฉ๋ฒ•', '๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ' ๋“ฑ์— ๋Œ€ํ•œ ์งˆ๋ฌธ๋“ค์„ ํ†ตํ•œ ๋‹ต๋ณ€์„ ํ†ตํ•ด Kent C. Dodds์˜ ์ƒ๊ฐ์„ ์—ฟ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    React ๋ฆฌํŒฉํ† ๋ง, 10๋…„ ๋„˜์€ ๋ฆฌ๋””๋ถ์Šค ์›น๋„ OK

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

    JavaScript์—์„œ๋„ SOLID ์›์น™์ด ํ†ตํ• ๊นŒ?

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

    ํŠœํ† ๋ฆฌ์–ผ

    10 Popular JavaScript methods implemented from scratch

    JavaScript์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” 10๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ์ง์ ‘ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋“ค์ด ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    ์ผ๋ก€๋กœ Array.prototype.map()์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    const fakeMap = function (callback) {
      const newArray = [];
    
      // 'this' refers to the array
      for (let i = 0; i < this.length; i++) {
        newArray[i] = callback(this[i], i);
      }
    
      return newArray;
    };
    Array.prototype.fakeMap = fakeMap;
    
    [1, 2, 3].fakeMap((n) => n + 1); // output [2, 3, 4]
    

    Create Your Own Live Browser Refresh In Deno

    ์ด์ œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ HMR๊ณผ ๊ฐ™์ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์นจํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์ด ๋˜์—ˆ๋‹ค. ํ˜น์‹œ ์ด ๊ณผ์ •์— ๋Œ€ํ•ด ๊ถ๊ธˆํ–ˆ๋˜ ์ ์ด ์žˆ์—ˆ๋Š”๊ฐ€?

    ์ด ํŠœํ† ๋ฆฌ์–ผ์€ Deno์—์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์นจ๋˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํ™˜๊ฒฝ ๊ฐœ๋ฐœ์„ ์†Œ๊ฐœํ•œ๋‹ค.

    structuredClone(): deeply copying objects in JavaScript

    JavaScript์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ spread ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ spread ์—ฐ์‚ฐ์ž๋Š” ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์€ ๋ณต์‚ฌํ•˜์ง€๋งŒ, ์†์„ฑ ๊ฐ’๋“ค์€ ๊ณต์œ ๋˜๋Š” ์–•์€(shallow) ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    const obj = {id: 'e1fd960b', values: ['a', 'b']};
    const clone1 = {...obj};
    
    clone1.id = 'yes';
    clone1.values.push('x');
    
    obj.id; // 'e1fd960b'
    obj.values; // ['a', 'b', 'x']
    

    ECMAScript์˜ ๊ณต์‹ ๋ช…์„ธ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ(ํฌํ•จ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ง„ํ–‰), ๋Œ€๋‹ค์ˆ˜์˜ ํ”Œ๋žซํผ(Chrome 98, Safari 137 (TP), Firefox 94, Node.js 17, Deno 1.14)๋“ค์ด ์ง€์›ํ•˜๋Š” ์ „์—ญ ๋ฉ”์„œ๋“œ์ธ structuredClone()์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ๊นŠ์€(deep) ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    const obj = {id: 'e1fd960b', values: ['a', 'b']};
    const clone2 = structuredClone(obj);  // ๊นŠ์€ obj ๊ฐ์ฒด์˜ ๋ณต์‚ฌ
    

    Make an OS with ReactJS & Next.js

    ๋ฐ์Šคํฌํ†ฑ ํ™˜๊ฒฝ์„ React์™€ Next.js๋ฅผ ์‚ฌ์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌํ˜„ํ•œ daedalOS ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์„ ๋ผ์ด๋ธŒ ์ฝ”๋”ฉ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์™„์„ฑํ•ด ๊ฐ€๋Š” ๊ณผ์ •์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

    PptxGenJS

    MS PowerPoint, Apple Keynote์™€ ํ˜ธํ™˜๋˜๋Š” OOXML(Open Office XML) ํฌ๋งท์˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

    import pptxgen from "pptxgenjs";
    
    // 1. Create a new Presentation
    let pres = new pptxgen();
    
    // 2. Add a Slide
    let slide = pres.addSlide();
    
    // 3. Add one or more objects (Tables, Shapes, Images, Text and Media) to the Slide
    let textboxText = "Hello World from PptxGenJS!";
    let textboxOpts = { x: 1, y: 1, color: "363636" };
    slide.addText(textboxText, textboxOpts);
    
    // 4. Save the Presentation
    pres.writeFile();
    

    The Component Gallery

    ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋ฐœ์‹œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค๊ณผ ๋””์ž์ธ ์‹œ์Šคํ…œ๋“ค์„ ๋ชจ์•„๋†“์€ ๊ณณ์ด๋‹ค.

    CSS Layout Generator

    ๊ฐ„๋‹จํ•˜๊ฒŒ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜จ๋ผ์ธ ๋„๊ตฌ

    RxDB

    RxDB(Reactive Databse)๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ์—ฌ๊ธฐ์„œ 'Reactive'๋ž€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์งˆ์˜ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ƒํƒœ ๋ณ€ํ™”์— ๋Œ€ํ•œ ๊ตฌ๋…๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    Responsive Viewer

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

    PrinceJS

    ํŽ˜๋ฅด์‹œ์•„ ์™•์ž๋ผ๋Š” PC ๊ฒŒ์ž„ ์ดˆ์ฐฝ๊ธฐ(90๋Œ€ ์ดˆ)์— ์ธ๊ธฐ๋ฅผ ๋–จ์ณค๋˜ ๊ฒŒ์ž„์„ JavaScript๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. PC ๊ฒŒ์ž„ ์ถ”์–ต๊ณผ ํ•จ๊ป˜ JavaScript์˜ ์ „ํŒŒ๋ ฅ์„ ํ•จ๊ป˜ ๋А๊ปด๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

    [์ฐธ๊ณ ] ์› ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์ธ ์กฐ๋˜ ๋งคํฌ๋„ˆ๊ฐ€ ํŽ˜๋ฅด์‹œ์•„ ์™•์ž๋ฅผ ํฌํ•จ, ์ž์‹ ์ด ๊ฐœ๋ฐœํ–ˆ๋˜ ๊ฒŒ์ž„๋“ค์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ผ์ง€๋ฅผ ์ผ๊ธฐ ํ˜•์‹์œผ๋กœ ๊ธฐ๋กํ•œ ์ฑ…์„ ๋ฐœ๊ฐ„ํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

    fx

    CLI์—์„œ JSON ๊ฐ์ฒด๋ฅผ ์†์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ

    Epub.js

    ์ „์ž์ฑ… ํฌ๋งท์ธ ePub ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

    ์ƒ˜ํ”Œ ๋ฌธ์„œ: Moby-Dick