JS 강의 아냐. Vite 열기 전에 React 가 쓰는 모던 JS 의 그 슬라이스가 손에 잡혀 있는지 점검이야.
React 가 가장 의존하는 슬라이스
TypeScript 로 쓰는 React 19 는 2015년 jQuery 튜토리얼의 JS 랑 거의 안 닮았어. 이 퀘스트에서 쓸 거의 모든 줄이 아래 기능 중 하나는 건드려. 이미 모던 JS 쓰고 있었다면 이 레슨은 승리 랩이야. 한동안 멀리 있었다면 빈 자리들은 숙제로 챙겨 — 뒤 레슨들은 다 가정하고 가.
Destructuring + spread
모든 컴포넌트에서 const { children, className, ...rest } = props 패턴을 본다. rest-spread 는 타입 잡힌 React 컴포넌트가 모르는 props 까지 안쪽 엘리먼트로 전달하는 방식이야 — 하나하나 나열할 필요 없어. 배열 destructuring 도 있어 (const [count, setCount] = useState(0) 가 그거 + 반환된 튜플).
Arrow function + 암묵적 반환
Arrow function 은 자기 this 가 없어 — 둘러싼 scope 의 this 를 잡아. 그래서 React 이벤트 핸들러를 인라인 arrow 로 써도 bind() 없이 동작하는 거야. 암묵적 반환 ((x) => x * 2) 이 .map(item => <Row {...item} />) 패턴의 기반.
Template literal + tagged template
백틱으로 값 보간 + 여러 줄 가능. Tagged template (template literal 로 호출되는 함수) 이 styled-components 나 Track 4 에서 짤 cn 헬퍼들의 동력이야.
Promise, async/await, fetch
모든 data hook, 모든 Server Action, 모든 use() 호출이 Promise 위에 앉아 있어. async function 은 Promise chain 의 sugar. await 는 async 함수 안 (또는 ES module 최상위) 에서만 동작. fetch() 는 Response 로 resolve 되는 Promise 반환 — 그리고 response.json() 도 또 Promise 반환. await (await fetch(url)).json() 같은 더블 await 패턴이 자주 나와서 어느새 안 어색해져.
Optional chaining + nullish coalescing
user?.profile?.name 은 어느 링크에서든 null/undefined 면 short-circuit. value ?? "default" 는 null/undefined 일 때만 fallback (|| 는 0, "", false 까지 fallback 발동). 손에 익으면 방어용 if 사다리 안 쓰게 돼.
ES module
Vite 프로젝트의 모든 파일은 ES module. import/export 는 sugar 가 아냐 — 브라우저랑 Node 둘 다 실제로 돌리는 모듈 시스템 자체야. 모던 JS 코드에 require() 보이면 레거시 유지보수 중인 거.