2024-03-05.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 1์ฃผ์ฐจ-2

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week1-2_2024-03-05

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์žฅ | ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ์š”์†Œ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ | 59p~92p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: 9์‹œ30๋ถ„~11์‹œ 55๋ถ„

ํด๋กœ์ €

  • ํด๋กœ์ €๊ฐ€ ๋ฆฌ์•กํŠธ์—์„œ ์ค‘์š”ํ•œ ์ด์œ  => 16.8 ์ดํ›„ ๋“ฑ์žฅํ•œ hook์˜ ๋™์ž‘ ๋•Œ๋ฌธ
    • useState => prev ๊ฐ’: closer

| ๊ตฌ๋ถ„ | ํ™˜๊ฒฝ | | ------ | -------------------------------------- | | this | ์–ด๋””์„œ ์‹คํ–‰๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ • | | closer | ์–ด๋””์„œ ์„ ์–ธ๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ •์ ์œผ๋กœ ๊ฒฐ์ • |

  • ํฅ๋ฏธ๋กœ์šด ์‚ฌ์ดํŠธ: https://ui.dev/javascript-visualizer
  • for๋ฌธ๊ณผ var๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ => ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ closer ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ
    • for๋ฌธ ๋‚ด๋ถ€์˜ setTimeout์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ IIFE๋กœ ๋ณ€๊ฒฝํ•ด์„œ, ์„ ์–ธ๋œ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€์—์„œ ์–ดํœ˜์  ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๋„๋ก ํ•จ(์–ด๋””์—? ์ธ์ˆ˜์—)
  • ํด๋กœ์ €๋Š” ๋น„์šฉ์ด๋‹ค

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ

  • ์—ญ์‚ฌ
    • ๊ณผ๊ฑฐ์— process๊ฐ€ ์กด์žฌํ–ˆ๋‹ค... ์ž‘์—… ๋‹จ์œ„...
    • ์Šค๋ ˆ๋“œ... ๋” ์ž‘์€ ์‹คํ–‰ ๋‹จ์œ„...
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” 1995๋…„ ํƒœ์–ด๋‚ฌ๋‹ค
      • ๋ธŒ๋žœ๋˜ ์•„์ดํฌ Brendan Eich๊ฐ€ LiveScript๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค
    • 10์ผ๋งŒ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฒซ ๋ฒ„์ „์ด... ๋งŒ๋“ค์–ด์กŒ๋‹ค...
  • ๋งŒ์•ฝ JS๊ฐ€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ผ๋ฉด?
    • ๋” ์กฐ์ž‘์— ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์—ˆ์Œ

์ด๋ฒคํŠธ ๋ฃจํ”„

  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ (1) call stack ๋น„์—ˆ๋Š” ์ง€ ํ™•์ธ (2) JS ์—”์ง„์œผ๋กœ execute code (3) ํƒœ์Šคํฌ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ์ž‘์—…์ด ์žˆ๋Š” ์ง€ ํ™•์ธ
  • ์ปจํ…์ŠคํŠธ๊ฐ€ ํƒœ์Šคํฌ ํ๋กœ ๋“ค์–ด๊ฐ€๋ฉด? ์Šคํƒ์—์„œ๋Š”? ์ œ๊ฑฐ๋œ๋‹ค
  • ์ด๋ฒคํŠธ ๋ฃจํ”„ TMI
    • ํƒœ์Šคํฌ ํ๋ฅผ n๊ฐœ ๊ฐ–๊ณ  ์žˆ์Œ => 1๊ฐœ๋งŒ ์žˆ๋Š” ๊ฑฐ ์•„๋‹˜
    • Queue ๊ตฌ์กฐ๊ฐ€ ์•„๋‹˜ => Set์ž„, ๊ทธ๋ฆฌ๊ณ  LIFO
    • ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ๋Š” 1๊ฐœ ๊ฐ–๊ณ  ์žˆ์Œ => ํƒœ์Šคํฌ ํ ๋ฏธ๋ค„๋ฏธ๋ค„
  • ๋žœ๋”๋ง์€ ์–ธ์ œ ์‹คํ–‰๋˜๋Š๋ƒ?
    • ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ > ๋žœ๋”๋ง > ํƒœ์Šคํฌ ํ
    • ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ ์ž‘์—…์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ๊ธฐํšŒ ์žˆ์Œ

| ์šฐ์„ ์ˆœ์œ„ | ๊ธฐ๋Šฅ | ์‚ฌ์šฉ๋˜๋Š” ํ | ์ถ”๊ฐ€ ์„ค๋ช… | | -------- | --------------------- | ------------------ | ---------------------------- | | 1 | Promise | ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ | ๋Œ€ํ‘œ์ ์ž„ | | 2 | requestAnimationFrame | ๋žœ๋”๋ง | ๋ฆฌํŽ˜์ธํŠธ ์ „์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ | | 3 | setTimeout | ํƒœ์Šคํฌ ํ | delay ๋ณด์žฅx |

requestAnimationFrame๋Š”?

  • https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame
  • requestAnimationFrame(callback): ๋‹ค์Œ Repaint ์ „์— ์œ ์ €๊ฐ€ ์„ค์ •ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
  • ์˜ˆ์ œ
const element = document.getElementById("some-element-you-want-to-animate");
let start: number, previousTimeStamp: number;
let done = false;

function step(timeStamp: number) {
  if (start === undefined) {
    start = timeStamp;
  }
  const elapsed = timeStamp - start;

  if (previousTimeStamp !== timeStamp) {
    // Math.min() is used here to make sure the element stops at exactly 200px
    const count = Math.min(0.1 * elapsed, 200);
    if (element) element.style.transform = `translateX(${count}px)`;
    if (count === 200) done = true;
  }

  if (elapsed < 2000) {
    // Stop the animation after 2 seconds
    previousTimeStamp = timeStamp;
    if (!done) {
      window.requestAnimationFrame(step);
    }
  }
}

Destructuring assignment

๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

  • ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์—์„œ ์„ ์–ธ๋ฌธ ์—†์ด ์ฆ‰์‹œ ๋ถ„ํ•ดํ•ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ• ๋‹นํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค
  • ๋ฐฐ์—ด์˜ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น: ES6
  • ๊ฐ์ฒด์˜ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น: ES 2018
  • useState๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ๋Š”?
    • ๊ฐ์ฒด ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์€ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กœ์›€
    • ๋ฐฐ์—ด ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์€ ์ž์œ ๋กญ๊ฒŒ ์ด๋ฆ„์„ ์„ ์–ธ
  • ๊ธฐ๋ณธ๊ฐ’์€? ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ ๋ฐ›์€ ๊ฐ’์ด undefined์ธ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉ
const [a = 1, b = 1, c = 1, d = 1, e = 1] = [undefined, null, 0, ""];
console.log(a, b, c, d, e); // 1, null, 0, '', 1
  • spread operator => [a, ...rest]

๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

  • case 1
  • spread operator(์ „๊ฐœ ๊ตฌ๋ฌธ): ๊ฐ์ฒด์˜ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น, ์ „๊ฐœ ๊ตฌ๋ฌธ์€ ๋ฐ”๋ฒจ ํŠธ๋žœ์ŠคํŒŒ์ผ์„ ๊ฑฐ์น˜๋ฉด ๋ฒˆ๋“ค๋ง ํฌ๊ธฐ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์ปค์ง
    • lodash.omit์ด๋‚˜ rambda.omit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ
    • ํ‚ค & ์†์„ฑ๊ฐ’ ํ™•์ธ, ์‹ฌ๋ฒŒ ์ฒดํฌ
{a, b, ...rest} = object
  • case 2
{a: first, b: second} = object
  • case 3
const key = "a";
const object = { a: 1, b: 1 };

const { [key]: a } = object;
// a = 1;
// [key] ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋ณ€์ˆ˜ ๋„ค์ด๋ฐ์ด ํ•„์š”ํ•จ
// const {[key]} = object // Uncaught SyntaxError: Unexpected token '['

english
run-to-completion /kษ™mหˆplฤ“SH(ษ™)n/

๋ฒˆ์™ธ

Node.js Worker ์™€ ๋ธŒ๋ผ์šฐ์ € Web Worker

| ํŠน์„ฑ | Node.js Worker | ๋ธŒ๋ผ์šฐ์ € Web Worker | | ------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | ํ™˜๊ฒฝ | ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋จ | ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ์‚ฌ์šฉ๋จ | | ์Šค๋ ˆ๋“œ ๋ถ„๋ฆฌ | ๋…๋ฆฝ์ ์ธ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋จ | ๋…๋ฆฝ์ ์ธ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋จ | | ํŒŒ์ผ ์ ‘๊ทผ | ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ณ„๋„์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Œ | ๋ณดํ†ต ์›น ์›Œ์ปค๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ณ„๋„์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Œ. ํ•˜์ง€๋งŒ IndexedDB ๋“ฑ์˜ ๋‹ค๋ฅธ ์›น API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ | | ๋„คํŠธ์›Œํฌ ์š”์ฒญ | HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€๋Š” ๋ณ„๋„์˜ ๋„คํŠธ์›Œํฌ ์Šคํƒ์„ ๊ฐ€์ง | ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€๋Š” ๋ณ„๋„์˜ ๋„คํŠธ์›Œํฌ ์Šคํƒ์„ ๊ฐ€์ง | | UI ์—…๋ฐ์ดํŠธ | ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ UI๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Œ | ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ UI๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Œ | | ์ข…์†์„ฑ | worker_threads ๋ชจ๋“ˆ์ด ์ œ๊ณต๋จ | ๊ธฐ๋ณธ ์ œ๊ณต๋จ | | ์“ฐ๋ ˆ๋”ฉ ๋ฐฉ์‹ | ์“ฐ๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•จ | ์ž์ฒด์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ๋ฅผ ํ•จ |

V8์™€ SpiderMonkey

| ํŠน์„ฑ | V8 | SpiderMonkey | | ----------------- | ---------------------------------------- | --------------------------------------------- | | ๊ฐœ๋ฐœ์‚ฌ | ๊ตฌ๊ธ€ | ๋ชจ์งˆ๋ผ | | ์‚ฌ์šฉ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € | ํฌ๋กฌ, ์˜คํŽ˜๋ผ ๋“ฑ | ํŒŒ์ด์–ดํญ์Šค | | ์ตœ์ดˆ ์ถœ์‹œ | 2008๋…„ | 1995๋…„ | | ์–ธ์–ด | C++ | C++ | | JIT ์ปดํŒŒ์ผ | ์ง€์› | ์ง€์› | | ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ | ์ ์‘ํ˜• ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ | ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌ | | ์ตœ์ ํ™” | ์ธ๋ผ์ธ ์บ์‹œ ๋“ฑ์˜ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์‹คํ–‰ | ํšจ์œจ์ ์ธ ํƒ€์ž… ์ถ”๋ก  ๋ฐ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์‹คํ–‰ | | ๊ฐœ๋ฐฉ์„ฑ | ์˜คํ”ˆ ์†Œ์Šค | ์˜คํ”ˆ ์†Œ์Šค |

setImmediate? (Deprecated)

image

How is setImmediate() different from setTimeout(() => {}, 0)

setImmediate(() => {
  // run something
});

(passing a 0ms timeout), and from process.nextTick()? A function passed to process.nextTick() is going to be executed on the current iteration of the event loop, after the current operation ends. This means it will always execute before setTimeout and setImmediate. A setTimeout() callback with a 0ms delay is very similar to setImmediate(). The execution order will depend on various factors, but they will be both run in the next iteration of the event loop