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

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

    2020-11

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

    Safari deopt with a large ESBuild bundle

    ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Go๋กœ ์ž‘์„ฑ๋œ ๋ฒˆ๋“ค๋Ÿฌ์ธ esbuild ํ”„๋กœ์ ํŠธ ์ด์Šˆ๋ฅผ ํ†ตํ•ด, Safari์—์„œ ์ปค๋‹ค๋ž€ ํฌ๊ธฐ์˜ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ํƒ€ ๋ธŒ๋ผ์šฐ์ € ๋Œ€๋น„ 6~8x ๋ฐฐ ์„ฑ๋Šฅ์ด ๋А๋ ค์ง€๋Š” ํ˜„์ƒ์— ๋Œ€ํ•ด ์žฌํ˜„ ์ผ€์ด์Šค๋“ค๊ณผ ํ•จ๊ป˜ ๋ฌธ์˜ํ•˜๋Š” ๋‚ด์šฉ์˜ ๊ธ€์ด๋‹ค.

    esbuild ํ”„๋กœ์ ํŠธ ๋ฉ”์ธํ„ฐ๋„ˆ ์ค‘ ํ•œ ๋ช…์ธ, Evan Wallace๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ let/const ๋Œ€์‹  var๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ , ๊ด€๋ จ ๋‚ด์šฉ์€ JavaScriptCore์˜ ๋ฒ„๊ทธ๋กœ ๋ฆฌํฌํŒ… ๋˜์—ˆ๋‹ค.

    MDN Browser Compatibility Report 2020

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

    ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ๋น„๋‹จ IE๋Š” ๊ตญ๋‚ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด์™ธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋„ ๊ฐ€์žฅ ๊ณจ์นซ๊ฑฐ๋ฆฌ ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    How CommonJS is making your bundles larger

    ์™œ CommonJS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํ•„์š” ์ด์ƒ์œผ๋กœ ํฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ธ€๋กœ ์ธ๊ธฐ ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ธ Webpack์—์„œ ModuleConcatenationPlugin์„ ํ†ตํ•ด ๋ชจ๋“ˆ์ด ๋ฒˆ๋“ค๋ง ๋˜๋Š” ๊ณผ์ •์„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์†Œ๊ฐœํ•œ๋‹ค.

    ๊ฒฐ๋ก ์ ์œผ๋ก  ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์„ฑ๊ณต์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  CommonJS ๋Œ€์‹  ESM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž„์„ ์–˜๊ธฐํ•œ๋‹ค.

    [์ฐธ๊ณ ] is-esm ํ”„๋กœ์ ํŠธ๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ESM ๋ชจ๋“ˆ์ธ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

    Understanding client-side JavaScript frameworks

    Mozilla ์žฌ๋‹จ์ด ์šด์˜ํ•˜๋Š” MDN ๋ฌธ์„œ ์‚ฌ์ดํŠธ๋Š” ์‚ฌ์‹ค์ƒ ์›น ๊ธฐ์ˆ ๋“ค์˜ "๊ณต์‹" ๋ฌธ์„œ์™€ ๋‹ค๋ฆ„์—†๋Š” defacto ์‚ฌ์ดํŠธ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    MDN์€ ํ‘œ์ค€ ๊ธฐ์ˆ ๋“ค์„ ์ฃผ๋กœ ๋‹ค๋ฃจ์ง€๋งŒ, ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์— ๋Œ€ํ•œ ๋‚ด์šฉ๋„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

    Faster Web App Delivery with PRPL

    PRPL(Push, Render, Pre-cache, Lazy-load) ํŒจํ„ด์€ Polymer ํŒ€์ด 2016๋…„ ์†Œ๊ฐœํ–ˆ๋˜ ๊ฐœ๋…์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐํ™”์™€ ์ œ๊ณต์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

    ์ด ๊ธ€์—์„  PRPL ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ฐ€๋ณ๊ฒŒ ์†Œ๊ฐœํ•˜๋ฉฐ, 2017๋…„๋ถ€ํ„ฐ PRPL์„ ์ ์šฉํ•ด ์„œ๋น„์Šคํ•˜๊ณ  ์žˆ๋Š” ํŠธ์œ„ํ„ฐ์˜ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ์ง€ํ–ฅ์ ์ธ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ํŒจํ„ด์„ ์†Œ๊ฐœํ•œ๋‹ค.

    React Summit Remote Edition 2020

    ์ง€๋‚œ 5์›” ์ง„ํ–‰๋๋˜ React Summit Remote Edition 2020 ์˜จ๋ผ์ธ ์ฝ˜ํผ๋Ÿฐ์Šค ์„ธ์…˜๋“ค์— ๋Œ€ํ•œ ์žฌ์ƒ๋ชฉ๋ก์œผ๋กœ, Next.js ๊ฐœ๋ฐœ์ž์ธ Guillermo Rauch, React Testing Library ๊ฐœ๋ฐœ์ž์ธ Kent C. Dodds ๋“ฑ์ด ์—ฐ์‚ฌ๋กœ ์ฐธ์—ฌํ•œ ์„ธ์…˜๋“ค์„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    Svelte Summit 2020

    ์ง€๋‚œ 10์›” 18์ผ ์ง„ํ–‰๋œ Svelte ์˜จ๋ผ์ธ ์ฝ˜ํผ๋Ÿฐ์Šค๋กœ, ์ด 18๊ฐœ์˜ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋กœ ๊ตฌ์„ฑ๋œ ์„ธ์…˜๋“ค์„ ํ™•์ธํ•ด ๋ณผ์ˆ˜ ์žˆ๋‹ค.

    Two years of micro-frontends: A retrospective

    Create React App๊ณผ Stroybook ๋ฉ”์ธํ„ฐ๋„ˆ๋กœ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋Š” Brody McKee์˜ ๊ธ€๋กœ, ์ง€๋‚œ 2๋…„๊ฐ„ ๋งˆ์ดํฌ๋กœ ํ”„๋ŸฐํŠธ์—”๋“œ ๋„์ž…์— ๋Œ€ํ•œ ์†ŒํšŒ๋ฅผ ๋ฐํžˆ๋Š” ๊ธ€๋กœ ์‹ค ์„œ๋น„์Šค ๋„์ž…์„ ํ†ตํ•œ ์žฅ๋‹จ์ ์„ ๊ณต์œ ํ•œ๋‹ค.

    Whats's New in Webpack 5

    ์ง€๋‚œ 10์›” Webpack 4๊ฐ€ ๋ฆด๋ฆฌ์Šค๋œ ์ง€ 2๋…„ ๋งŒ์— v5๊ฐ€ ์ถœ์‹œ๋˜์—ˆ๋‹ค. v5์—์„œ๋Š” ์ด์ „ ๋ฒ„์ „์— ๋น„ํ•ด ๋นŒ๋“œ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋˜์—ˆ์œผ๋ฉฐ, ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋„ ๊ฐ์†Œํ–ˆ๋‹ค.

    v5์—์„œ ์ฃผ๋ชฉํ•ด ๋ณผ ๋งŒํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ Module Federation ๊ธฐ๋Šฅ์œผ๋กœ, ๋‹ค์ˆ˜์˜ Webpack ๋นŒ๋“œ๊ฐ€ ํ•จ๊ป˜ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ํฐ ์ œ์•ฝ ์—†์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

    ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋ฉ”์ด์ € ๋ฒ„์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์–ด์ฉŒ๋ฉด ๊ท€์ฐฎ๊ณ  ์–ด๋ ค์šฐ๋ฉฐ ์†์ด ๋งŽ์ด ๊ฐ€๋Š” ์ž‘์—…์ผ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋” ์พŒ์ ํ•˜๊ณ  ์ƒ์‚ฐ์ ์ธ ๋นŒ๋“œ ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•œ ์ž‘์—…์ด๊ธฐ๋„ ํ•˜๋‹ค. ์•ž์œผ๋กœ์˜ 2๋…„์„ ์œ„ํ•ด ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ฐจ๊ทผ์ฐจ๊ทผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ?

    ๋ณด๋‹ค ๋” ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    Next.js 10

    React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Next.js์˜ ์ƒˆ๋กœ์šด ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค์ธ Next.js 10์ด ๊ณต๊ฐœ๋˜์—ˆ๋‹ค.

    ๋นŒํŠธ์ธ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ ์ธก์ •์„ ์œ„ํ•œ Analytics, ์ด์ปค๋จธ์Šค ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ Commerce ์Šคํƒ€ํ„ฐํ‚ท, ์ตœ์‹  React 17 ์ง€์› ๋“ฑ์ด ํฌํ•จ๋˜์—ˆ๋‹ค.

    Next.js CONF
    ์ง€๋‚œ 10์›” 27์ผ, Next.js์˜ ์ฒซ ์˜จ๋ผ์ธ ์ฝ˜ํผ๋Ÿฐ์Šค๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ์ด 4๊ฐœ ํŠธ๋ž™์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” Next.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ถ„์•ผ์˜ ๊ธฐ์—…๋“ค ์—ฐ์‚ฌ๋“ค์ด ์ฐธ์—ฌํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ๋ก€๋“ค์„ ๊ณต์œ ํ•œ๋‹ค.

    Results of Authoring a JS Library with Rust and Wasm

    ์Šค์›จ๋ด ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์‚ฌ์ธ Paradox Development Studios์—์„œ ๊ฐœ๋ฐœ๋œ ๊ฒŒ์ž„ ํŒŒ์ผ๋“ค์˜ plaintext๋ฅผ ํŒŒ์‹ฑ ํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Jomini.js ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋˜ ์ˆœ์ˆ˜ JavaScript ํŒŒ์„œ๋ฅผ Rust๋กœ ์ž‘์„ฑ๋œ wasm ๋ชจ๋“ˆ๋กœ์˜ ์ „ํ™˜ ๊ณผ์ •์„ ๋‹ค๋ฃฌ๋‹ค.

    ์ „ํ™˜์„ ํ†ตํ•ด ๋” ๋‚˜์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ๊ฒฝํ—˜์  ์ธก๋ฉด์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    What happened to Immutable.JS? And how can we react?

    Immutable(๋ถˆ๋ณ€์„ฑ) ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋Š” Immutable.js, immer ๋“ฑ์„ ๊ผฝ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Immutable.js๋Š” ์•ฝ 2๋…„ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ publish ๋œ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š”๊ฐ€?

    ์ด ๊ธ€์—์„œ๋Š” Immutable.js๊ฐ€ ํ˜„์žฌ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ค ๋Œ€์•ˆ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

    Svelte for Sites, React for Apps

    ์›น์‚ฌ์ดํŠธ๋Š” ์ฃผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์ œํ•œ์ ์ธ ์ธํ„ฐ๋ ‰์…˜์„ ํฌํ•จํ•˜๋ฉฐ, ์ œํ•œ์ ์ธ ์ƒํ™ฉ(๋‚ฎ์€ ์„ฑ๋Šฅ์˜ CPU, ์ œํ•œ์  ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ๋“ฑ)์—์„œ๋„ ์†Œ๋น„๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    ๋ฐ˜๋ฉด, ์›น์•ฑ์€ ์ฃผ๋กœ ์ธํ„ฐ๋ ‰์…˜์„ ํ†ตํ•œ ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด๊ฑฐ์šด ์ž์›๋“ค์„ ํฌํ•จํ•˜๋‚˜ 2MB ์ •๋„์˜ JS ์›น์•ฑ์˜ ํฌ๊ธฐ๋Š” 200MB ์šฉ๋Ÿ‰์˜ ๋ชจ๋ฐ”์ผ ์•ฑ๊ณผ ๋น„๊ต ์‹œ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋  ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” ์›น์‚ฌ์ดํŠธ์™€ ์›น์•ฑ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์˜ ๊ธฐ์ˆ ์  ํŠน์„ฑ๋“ค์„ ํ†ตํ•ด ์™œ ์›น์‚ฌ์ดํŠธ๋Š” Svelte๊ฐ€ ๋” ์ ํ•ฉํ•˜๊ณ , ๊ทธ๋ฆฌ๊ณ  React๋Š” ์›น์•ฑ์— ๋” ์ ํ•ฉํ•œ์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    Introducing: The Async Cookie Store API

    Chrome 87+๋ถ€ํ„ฐ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๊ธฐ์กด์˜ document.cookie์˜ ์ƒˆ๋กœ์šด ๊ฐœ์„  API์ธ Cookie Store API๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ๊ธ€๋กœ, Service Worker์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์„ค๋ช…ํ•œ๋‹ค.

    // ๊ธฐ์กด ๋ฐฉ์‹
    document.cookie.split(";").forEach(v => ...);
    
    // Cookie Sotre API
    await cookieStore.get("์ฟ ํ‚ค์ด๋ฆ„");
    

    30 Days Of React

    30์ผ์˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋งค์ผ ๋”ฐ๋ผ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” Step by step React ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด React๋ฅผ ๋งˆ์Šคํ„ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋กœ์ ํŠธ๋‹ค.

    ๊ผญ ์ผ์ •์— ๋งž์ถฐ ํ•™์Šตํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋ชฉ์ฐจ๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” ๊ฐ๊ฐ์˜ ๊ฐœ๋…๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฝ์–ด๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ React์˜ ์ฃผ์š” ๊ฐœ๋…๋“ค์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค.

    Build an Income Tracker in ReactJS ~ useState, useEffect, useRef

    ํ† ์ด ํ”„๋กœ์ ํŠธ์ธ "Income Tracker" ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„์„ฑ๊นŒ์ง€ ๋”ฐ๋ผ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŠœํ† ๋ฆฌ์–ผ ๋™์˜์ƒ์œผ๋กœ, React์˜ ๊ธฐ๋ณธ์  ๊ตฌ์„ฑ์š”์†Œ์™€ ํ•จ๊ป˜ ๋‹ค์–‘ํ•œ Hooks(useState, useRef, useEffect) ๋“ฑ์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ๋„ ํ•จ๊ป˜ ๋ฐฐ์›Œ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ: https://github.com/TylerPottsDev/income-tracker-rjs

    Beginner's Series - Intro to JavaScript (Node.js)

    MS์—์„œ ๋งŒ๋“  Node.js์—์„œ ๋™์ž‘ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ดˆ์‹ฌ์ž ๋Œ€์ƒ JavaScript ํŠœํ† ๋ฆฌ์–ผ๋กœ, ์ด๋ก ์ ์ธ ๊ฒƒ๋ณด๋‹จ ๋ฌธ๋ฒ•์— ๋ณด๋‹ค ์ง‘์ค‘ํ•œ๋‹ค.

    ๋„๊ตฌ

    Volta

    Node.js ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋„๊ตฌ๋กœ๋Š” nvm๊ณผ n์ด ์žˆ์ง€๋งŒ, ๋ช‡๊ฐ€์ง€ ์ด์Šˆ๋“ค(Windows ๋ฏธ์ง€์›, ์„ฑ๋Šฅ, ์ง๊ด€์ ์ด์ง€ ์•Š์€ ์„ค์ •๋ฐฉ๋ฒ• ๋“ฑ)์ด ์กด์žฌํ•œ๋‹ค.

    Rust๋กœ ๊ฐœ๋ฐœ๋œ Volta๋Š” Node.js์™ธ, npm, yarn ๋“ฑ FE ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ํˆด์ฒด์ธ ๋„๊ตฌ๋“ค์„ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ๋ณ„ ๋‹ค๋ฅธ ๋ฒ„์ „ ์‚ฌ์šฉ ๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

    ๋Œ€๋‹ค์ˆ˜์˜ Unix(MacOS) ์‹œ์Šคํ…œ์—์„  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๊ณ , Windows๋Š” ๋‹ค์Œ์˜ ์„ค์น˜ํŒŒ์ผ์„ ๋ฐ›์•„ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

    # Unix ํ™˜๊ฒฝ์—์„œ ์„ค์น˜
    curl https://get.volta.sh | bash
    
    volta install node
    volta install node@12
    

    ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ Node.js(๋˜๋Š” ๋‹ค๋ฅธ ํˆด์ฒด์ธ) ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์ „ํ™˜๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, package.json ํŒŒ์ผ์˜ engines ํ•„๋“œ ๋˜๋Š” volta pin ํŒจํ‚ค์ง€๋ช…@๋ฒ„์ „ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    // "volta pin node@10.15.3" ๋ช…๋ น์–ด๋Š” package.json ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด ๊ด€๋ฆฌํ•œ๋‹ค.
    "volta": {
      "node": "10.15.3",
      "yarn": "1.14.0"
    }
    

    ๋˜ํ•œ ๋‹ค์–‘ํ•œ CLI ๋„๊ตฌ๋“ค์— ๋Œ€ํ•œ ๋ฒ„์ „ ์ „ํ™˜ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ typescript ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉ(devDependency๋‚˜ dependency๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ)ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด commend line์—์„œ ํ•ด๋‹น ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    cd /dev/project-using-typescript-2.9.2
    tsc --version # 2.9.2
    
    cd /dev/project-using-typescript-3.4.5
    tsc --version # 3.4.5
    

    Verdaccio

    Verdaccio๋Š” ๋ฌด์„ค์ • ๋กœ์ปฌ ํ”„๋ผ์ด๋น— npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋กœ, ์ž์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋ณ„๋„ ๋ฐ์ด๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ• ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋˜ํ•œ ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋“ค(ex. npmjs.org)์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ๊ธฐ๋Šฅ๋„ ์ œ๊ณต๋œ๋‹ค.

    Reactime

    Chrome ํ™•์žฅ ๊ธฐ๋Šฅ์œผ๋กœ, React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•ด Time Travel Debugging์„ ํ†ตํ•ด ํŠน์ • ์ƒํƒœ ์ด๋™์„ ํ†ตํ•œ ๋””๋ฒ„๊น…์„ ๋„์™€์ค€๋‹ค.

    chrome ์›น ์Šคํ† ์–ด์—์„œ ์„ค์น˜ํ•˜๊ธฐ

    ํŽ˜์ด์Šค๋ถ์˜ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Recoil์„ ํฌํ•จ, Context API, ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.

    ConsoleChat.io

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

    ์•„์ง ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ• ๋“ฑ์—์„œ ๊ฐœ์„ ๋  ์—ฌ์ง€๊ฐ€ ๋งŽ์•„ ๋ณด์ด์ง€๋งŒ, ์ฐธ์‹ ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์žฌ๋ฏธ์žˆ์–ด ๋ณด์ด๋Š” ํ”„๋กœ์ ํŠธ๋‹ค.

    Turbolinks

    Turbolinks๋Š” ๋ณ„๋„์˜ ๋ณต์žกํ•œ ํด๋ผ์ด์–ธํŠธ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  SPA์—์„œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํŽ˜์ด์ง€๋“ค๋กœ์˜ ๋น ๋ฅธ ์ด๋™(๋ Œ๋”๋ง)์„ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค.

    ๋™์ผ ๋„๋ฉ”์ธ ๋‚ด์˜ ๋ชจ๋“  <a href> ํด๋ฆญ์„ ์ธํ„ฐ์…‰ํŠธํ•˜๊ณ  History API๋กœ ๊ธฐ์กด link๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ํ›„, XHR์„ ํ†ตํ•ด ๋งํฌ ๋Œ€์ƒ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค. ์ดํ›„ <body> ์˜์—ญ์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€์˜ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ , <head>๋Š” ๋จธ์ง€ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•œ๋‹ค.

    HTML5 History API์™€ requestAnimationFrame์ด ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ผ๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.