2024-04-01.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 5์ฃผ์ฐจ-1
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week5-1_2024-04-01
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ---- | -------------------------------------------------- | ----------- | | 5์ฃผ์ฐจ | 9์ฅ | ๋ชจ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ๋ก ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ | 529p~528p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: 9์~10์๋ฐ
๋ชจ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ๋ก ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ
Next.js๋ก ๋ฆฌ์กํธ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ
- ํ๋ํ๋ ๋ง๋ค๊ธฐ ์ฑํฐ
- create-react-app์ ์ ์ง๋ณด์๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
- 2023๋ 1์ ๋ฆฌ์กํธ ํ => ๋ณด์ผ๋ฌํ๋ ์ดํธ CLI๊ฐ ์๋๋ผ ์ฌ๋ฌ ๋ฆฌ์กํธ ๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ ์ํ๋ ๋ฐ์ฒ ํํ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ผ ๋ฐํ
create-next-app ์์ด ๊ตฌ์ถํ๊ธฐ
- tsconfig.json
{
"$schema": "https://json.schemastore.org/tsconfig", // ์๋์์ฑ
"compilerOptions": {
// "ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผํ ๋" ์ฌ์ฉํ๋ ์ต์
"target": "ES5",
// <target: ๋ณํ>
// ๋ณํ์ ๋ชฉํ๋ก ํ๋ ์ธ์ด ๋ฒ์ (ํด๋ฆฌํ๊น์ง๋ ์ง์ํ์ง ์๋๋ค.)
"lib": ["DOM", "DOM.Iterable", "ESNext"],
/* <lib: ๋ช
์ธ>
* - es5 ์ง์ ๋ชฉํ์ผ ๋:
* => Promise, Map ๊ฐ์ฒด๋ฅผ ํด๋ฆฌํํด์ ์ค๋น ํ์ด๋ ์กด์ฌ๋ฅผ ๋ชจ๋ฆ
* => esnext๋ฅผ ์ถ๊ฐํด์ ์ ๊ท ๊ธฐ๋ฅ์ ๋ํ API ์ ๋ณด๋ฅผ ํ์ธ
* => ์๋ฌ ๋ฐ์ํ์ง ์๊ฒ ํ๊ธฐ
* - DOM:
* - ํ์
์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ window, document ๋ฑ ๋ธ๋ผ์ฐ์ API ๋ช
์ธ ์ฌ์ฉ
*/
"allowJs": true,
// ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ปดํ์ผ ํ ์ง -> js์ ts๊ฐ ํผ์ฌ๋ ์ํฉ์์ ์ฌ์ฉํ๋ค ex) TS ๋ง์ด๊ทธ๋ ์ด์
"skipLibCheck": true,
// ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ d.ts(ํ์
ํ์ผ) ๊ฒ์ฌ ์ฌ๋ถ
// ์ปดํ์ผ ์๊ฐ์ด ๊ธธ์ด์ง๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊บผ๋๋ ๊ฒฝ์ฐ ๋ง์
"strict": true,
/**
* <ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ ์๊ฒฉ๋ชจ๋>
* - alwaysStrict: true
* - ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ "use strict;" ์ถ๊ฐ
* - strictNullCheck: true
* - ์๊ฒฉํ ๋ ๊ฒ์ฌ: null๊ณผ undefined ๊ตฌ๋ถ (๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ์1)
* - strictBindCallApply: true
* - call, bind, apply์ ์ ํํ ์ธ์ ์ ์์ฒญ (๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ์2)
* - strictFunctionTypes: true
* - ํจ์ ํ์
์ ๋ํ ์๊ฒฉํจ~ (์ผ๋์~)
* - strictPropertyInitialization: true
* - ํด๋์ค ๋
์ ํ๋กํผํฐ์ ๊ฐ ํ ๋น ํ์
์๊ฒฉํ๊ฒ
* - noImplicitAny: true
* - ํ์
๋ช
์ํ์ง ์์ ๋ณ์์ ์๋ฌ, false๋ฉด? any ํ ๋น๋จ
* - noImplicitThis: true
* - this๋ฅผ ์ถ๋ก ํ ์ ์๋ ์ํฉ์์ ์๋ฌ, false๋ฉด? any ํ ๋น๋จ
* - useUnknownInCatchVariable: true
* - catch๋ก ์ก์ ๊ตฌ๋ฌธ => any ๋์ unknownํ ๋น(4.0๋ฒ์ ์ดํ), ํ์
๊ฐ๋ ์ฌ์ฉ
*/
"forceConsistentCasingInFileNames": true,
// ํ์ผ ์ด๋ฆ ๋์๋ฌธ์ ๊ตฌ๋ถ ๊ฐ์
"noEmit": true,
// ์ปดํ์ผ ํ์ง ์๊ณ , ํ์
์ฒดํฌ๋ง ํ๋ค
// ์? Next.js๋ swc๊ฐ ํ์
์คํฌ๋ฆฝํธ ํ์ผ์ ์ปดํ์ผํ๋ฏ๋ก, TS๊ฐ ์ปดํ์ผํ ํ์๊ฐ ์๋ค.
"esModuleInterop": true,
// CommonJS ๋ฐฉ์์ผ๋ก ๋ณด๋ธ ๋ชจ๋์ ES ๋ชจ๋ import๋ก ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํจ
"module": "ESNext",
// ๋ชจ๋ ์์คํ
์ค์ : commonjs(require), esnext(import)
"moduleResolution": "Node",
// ๋ชจ๋ ํด์ ๋ฐฉ์: node(node_modules ๊ธฐ์ค), classic(tsconfig.json ๋๋ ํฐ๋ฆฌ ๊ธฐ์ค)
"resolveJsonModule": true,
// JSON ํ์ผ import (allowJS ์ต์
์ด ์๋์ผ๋ก ์ผ์ง๋ค..!)
"isolatedModules": true,
// import๋ export๊ฐ ์๋ค๋ฉด ๋จ์ ์คํฌ๋ฆฝํธ๋ก ์ธ์ - ๋ง์
// ์? ๋ชจ๋ ์์คํ
๊ณผ ์ฐ๊ณ๋์ง ์๊ณ ๋จ๋
์ผ๋ก ์๋ ํ์ผ์ ์์ฑ์ ๋ง๊ธฐ ์ํจ
"jsx": "preserve",
/*
* <JSX ์ปดํ์ผ ์ค์ >
* - react: React.createElement() ๊ธฐ๋ณธ๊ฐ, ~๋ฆฌ์กํธ 16๊น์ง ๊ธฐ๋ณธ ๋ณํ ๋ฐฉ์
* - react-jsx: react/jsx-runtime ๋ฆฌ์กํธ 17~
* - react-jsxdev: ๋๋ฒ๊น
์ ๋ณด ์ถ๊ฐ
* - preserve: no ๋ณํ
* - react-native: no ๋ณํ
*/
"incremental": true,
// .tsbuildinfo ํ์ผ์ ๋์คํฌ์ ์ ์ฅํ๋ค(๋ง์ง๋ง ์ปดํ์ผ)
// ๊ฐ์ฅ ๋น์ฉ์ด ์ ๊ฒ ๋๋ ๋ฐฉ์์ผ๋ก ์ปดํ์ผํด ์๋ ์
"baseUrl": "src",
// ๋ชจ๋์ ์ฐพ์ ๋ ๊ธฐ์ค โ
"paths": {
// ๊ฒฝ๋ก ๋ณ์นญ
"๐pages/*": ["pages/*"],
"๐hooks/*": ["hooks/*"],
"๐types/*": ["types/*"],
"๐components/*": ["components/*"],
"๐utils/*": ["utils/*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
// ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ ๋์์ ํฌํจ์ํฌ ํ์ผ ๋ชฉ๋ก
"exclude": ["node_modules"]
// ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ ๋์์์ ์ ์ธ์ํฌ ํ์ผ ๋ชฉ๋ก
}
- ํ์ ์ ์๊ฒฉํ๊ฒ? -> yes
- strict node๋? ํ์ ์ ์๊ฒฉํ๊ฒ ์งํค๋ ๊ฒ์ ๋์์ฃผ๊ณ , ํ์ ์์คํ ์ ์ดํดํ๋ ๋ฐ ๋๋ฌด์ ์ป์ ์ ์๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์๋๋ฉด ์ผ๋๊ธฐ
- ๊ฒฝ๋ก ๋ณ์นญ์ @๋ฅผ ์ ์ฐ๋๊ฒ... ์ข๋ค?!
- ์ค์ฝํ ํจํค์ง์ ๋๋ฆฌ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ฐ์ ๋ฐ๋ผ ์ถฉ๋ํ ์ฌ์ง๊ฐ ์๋ค <- ๋ฉ๋ํจ
- ๊ธฐ์กด ํ๋ก์ ํธ๋ ์ด๋ป๊ฒ ํ๋๋
"esModuleInterop": true
-
CommonJS ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๋ชจ๋์ ES ๋ชจ๋ ํ์์ผ๋ก importํ๋ ๊ฒ์ด ์ฉ์ดํด์ง
-
๋ชจ๋ ์์คํ
CommonJS
๋ Node.js์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ชจ๋ ์์คํ ES ๋ชจ๋
์ ECMAScript ํ์ค์ ์ ์๋ ๋ชจ๋ ์์คํ
-
CommonJS ํ์ ๋ชจ๋
๊ณผesModuleInterop
์์// exports module.exports = { add: (a, b) => a + b, subtract: (a, b) => a - b, }; // "esModuleInterop": false import * as math from "./math"; console.log(math.add(5, 3)); // 8 // "esModuleInterop": true import math, { add, subtract } from "./math"; console.log(math.add(5, 3)); // 8 console.log(add(5, 3)); // 8
"jsx" ์ปดํ์ผ ์ค์
export const Shrimp = () => <span>๐ฆ</span>;
- react: React.createElement() ๊ธฐ๋ณธ๊ฐ, ~๋ฆฌ์กํธ 16๊น์ง ๊ธฐ๋ณธ ๋ณํ ๋ฐฉ์
export const Shrimp = () => React.createElement("span", null, "๐ฆ");
- react-jsx: react/jsx-runtime ๋ฆฌ์กํธ 17~
import { jsx as _jsx } from "react/jsx-runtime"; export const Shrimp = () => _jsx("span", { children: "๐ฆ" });
- react-jsxdev: ๋๋ฒ๊น
์ ๋ณด ์ถ๊ฐ
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime"; const _jsxFileName = "file:///input.tsx"; export const Shrimp = () => _jsxDev( "span", { children: "๐ฆ" }, void 0, false, { fileName: _jsxFileName, lineNumber: 1, columnNumber: 27, }, this );
- preserve: no ๋ณํ, swc๊ฐ JSX๋ฅผ ๋ณํํ๋ฏ๋ก Next.js์์ preserve
export const Shrimp = () => <span>๐ฆ</span>;
- react-native: no ๋ณํ (RN์ฉ)
export const Shrimp = () => <span>๐ฆ</span>;