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)
How is
setImmediate()
different fromsetTimeout(() => {}, 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