μ΄κΈ° μΈν
1. Node.js μ€μΉ
React νλ‘μ νΈλ₯Ό μμνκΈ° μ μ Node.jsκ° μ€μΉλμ΄ μμ΄μΌ ν©λλ€. Node.jsλ 곡μ μΉμ¬μ΄νΈμμ λ€μ΄λ‘λν μ μμ΅λλ€.
2. Create React App μ€μΉ
ν°λ―Έλμ μ΄κ³ λ€μ λͺ λ Ήμ΄λ₯Ό μ λ ₯νμ¬ Create React Appμ μ μμΌλ‘ μ€μΉν©λλ€. (μ΄λ―Έ μ€μΉλμ΄ μλ€λ©΄ μ΄ λ¨κ³λ 건λλΈ μ μμ΅λλ€.)
npm install -g create-react-app
3-1. μ React νλ‘μ νΈ μμ±(CRA)
νλ‘μ νΈλ₯Ό μμ±νκ³ μ νλ λλ ν λ¦¬λ‘ μ΄λν λ€μ, λ€μ λͺ λ Ήμ΄λ₯Ό μ€ννμ¬ μ React νλ‘μ νΈλ₯Ό μμ±ν©λλ€.
npx create-react-app my-app
μ¬κΈ°μ my-appμ νλ‘μ νΈμ μ΄λ¦μΌλ‘, μνλ μ΄λ¦μΌλ‘ λ³κ²½ν μ μμ΅λλ€.
3-2. μ React νλ‘μ νΈ μμ±(Vite)
4. νλ‘μ νΈ λλ ν λ¦¬λ‘ μ΄λ
μμ±λ νλ‘μ νΈ ν΄λλ‘ μ΄λν©λλ€.
cd my-app
5. κ°λ° μλ² μμ
λ€μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νμ¬ κ°λ° μλ²λ₯Ό μμν©λλ€.
npm start / npm run dev
μ΄ λͺ λ Ήμ μ€ννλ©΄ κΈ°λ³Έ λΈλΌμ°μ μμ http://localhost:3000 μ£Όμλ‘ μλμΌλ‘ μ΄λ¦¬λ©°, React μ ν리μΌμ΄μ μ λ³Ό μ μμ΅λλ€.
6. νλ‘μ νΈ κ΅¬μ‘° μ΄ν΄
my-app ν΄λ λ΄λΆλ₯Ό μ΄ν΄λ³΄λ©΄, μ£Όμ νμΌ λ° ν΄λλ λ€μκ³Ό κ°μ΅λλ€.
- public/: μ μ νμΌ(HTML, μ΄λ―Έμ§ λ±)μ μ μ₯νλ ν΄λ.
- src/: React μ»΄ν¬λνΈμ JavaScript νμΌμ μ μ₯νλ ν΄λ.
- package.json: νλ‘μ νΈμ λ©νλ°μ΄ν°μ μμ‘΄μ±μ κ΄λ¦¬νλ νμΌ.
my-app/
βββ public/
β βββ index.html
β βββ favicon.ico
β βββ manifest.json
βββ src/
β βββ assets/ # μ μ μμ
β β βββ img/
β βββ components/ # μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈ
β β βββ common/
β β β βββ Header.jsx
β β β βββ Footer.jsx
β β β βββ Layout.jsx
β β β βββ PlainLayout.jsx
β β βββ home/
β β β βββ Card.jsx
β β βββ class/
β β β βββ Card.jsx
β βββ pages/ # νμ΄μ§ μ»΄ν¬λνΈ
β β βββ home/
β β β βββ HomePage.jsx
β β βββ class/
β β β βββ ClassListPage.jsx
β β β βββ ClassDetailPage.jsx
β β βββ board/
β β β βββ BoardListPage.jsx
β β β βββ BoardDetailPage.jsx
β β β βββ BoardCreatePage.jsx
β β β βββ BoardUpdatePage.jsx
β βββ routes/ # λΌμ°ν
β β βββ route.jsx
β β βββ privateRoute.jsx
β βββ app/ # 리λμ€
β β βββ store.js
β βββ features/ # 리λμ€
β β βββ auth/
β β β βββ authSlice.js
β β βββ counter/
β β β βββ counterSlice.js
β βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β β βββ validator.js
β βββ hooks/ # 컀μ€ν
ν
β β βββ useCustomHook.js
β βββ styles/ # μ€νμΌ
β β βββ color.css
β β βββ global.css
β βββ App.jsx
β βββ main.jsx
βββ .eslintrc.cjs # ESLint μ€μ νμΌ
βββ .gitignore
βββ .prettierrc # Prettier μ€μ νμΌ
βββ index.html # μ ν리μΌμ΄μ
μ μ§μ
μ HTML νμΌ (Vite μ€μ κ΄λ ¨)
βββ yarn.lock (λλ package-lock.json) # μμ‘΄μ± νΈλ¦¬ κ³ μ νμΌ
βββ package.json # νλ‘μ νΈ λ©νλ°μ΄ν° λ° μμ‘΄μ± μ μ
βββ README.md
βββ vite.config.js # Vite μ€μ νμΌ
π μ£Όμ κ΅¬μ± μμ μ€λͺ
public/: μ μ νμΌλ€μ 보κ΄νλ ν΄λ
src/: μμ€ μ½λκ° μμΉνλ ν΄λ
- assets/: μ΄λ―Έμ§ νμΌκ³Ό κ°μ μ μ μμλ€μ 보κ΄ν©λλ€.
- components/: μ¬μ¬μ© κ°λ₯ν React μ»΄ν¬λνΈλ€μ΄ μμΉνλ©°, κ³΅ν΅ μ»΄ν¬λνΈμ νμ΄μ§λ³(λλ©μΈλ³) μ»΄ν¬λνΈλ‘ ꡬλΆλ©λλ€.
- pages/: κ°κ°μ νμ΄μ§ μ»΄ν¬λνΈλ€μ΄ μμΉνλ©°, ν, ν΄λμ€, κ²μν λ± μ¬λ¬ νμ΄μ§λ‘ λλ©λλ€.
- routes/: μ ν리μΌμ΄μ μ λΌμ°ν μ€μ νμΌλ€μ΄ μμΉν©λλ€.
- app/: 리λμ€ μ€ν μ΄ μ€μ νμΌμ΄ μμΉν©λλ€.
- features/: 리λμ€ μ¬λΌμ΄μ€λ€μ΄ μμΉν©λλ€.
- utils/: μ νΈλ¦¬ν° ν¨μλ€μ΄ μμΉν©λλ€. νλ‘μ νΈ μ μμμ μ¬μ©λλ νΉμ κΈ°λ₯ λ° μμ μ μννλλ° λμμ μ£Όλ ν¨μλ€μ΄ μμΉν©λλ€.
- hooks/: 컀μ€ν ν λ€μ΄ μμΉν©λλ€.
- styles/: μ€νμΌ νμΌλ€μ΄ μμΉν©λλ€.
- App.jsx: μ£Όμ React μ»΄ν¬λνΈλ‘, μ ν리μΌμ΄μ μ ꡬ쑰λ₯Ό μ μν©λλ€.
- main.jsx: ReactDOMμ μ¬μ©ν΄ React μ ν리μΌμ΄μ μ HTML DOMμ λ λλ§νλ νμΌμ λλ€.
π .eslintrc.cjs
Tripleμμ μ 곡νλ κΈ°λ³Έ ESLint, νλ‘ νΈμλ, Prettier μ€μ μ κΈ°λ°μΌλ‘ νλ€.μμ±λ μ€μ νμΌμ Tripleμ ν리ν°μ΄(Prettier) μ€μ μ μλμΌλ‘ μ μ©νλ€. (npm i @titicaca/eslint-config-triple)
module.exports = {
root: true, // μ΄ μ€μ νμΌμ΄ νλ‘μ νΈμ 루νΈμ μλμ§ μ¬λΆλ₯Ό λνλΈλ€.
env: {
browser: true, // λΈλΌμ°μ νκ²½μ μ€μ νλ€.
es2021: true, // ECMAScript 2021(ES12) νκ²½μ μ€μ νλ€.
},
extends: [
"eslint:recommended", // ESLintμμ κΆμ₯νλ κΈ°λ³Έ κ·μΉμ μ¬μ©νλ€.
"@titicaca/eslint-config-triple", // Tripleμ ESLint κΈ°λ³Έ μ€μ μ νμ₯ν©λλ€.
"@titicaca/eslint-config-triple/frontend", // Tripleμ νλ‘ νΈμλ μ€μ μ νμ₯ν©λλ€.
"@titicaca/eslint-config-triple/prettier", // Tripleμ Prettier μ€μ μ νμ₯ν©λλ€.
"plugin:react/recommended", // React κ΄λ ¨ κΆμ₯ κ·μΉμ μ¬μ©νλ€.
"plugin:prettier/recommended", // Prettierμ μ°λλ κ·μΉμ μ¬μ©νλ€.
"plugin:react/jsx-runtime", // μλ‘μ΄ JSX λ³νμ μ§μνλ κ·μΉμ μ¬μ©νλ€.
// 'plugin:react-hooks/recommended', // React Hooks μ¬μ©μ λν κΆμ₯ κ·μΉμ μ¬μ©νλ€.
],
ignorePatterns: ["dist", ".eslintrc.cjs", "vite.config.js"], // ESLintκ° λ¬΄μν νμΌ νΉμ λλ ν 리λ₯Ό μ€μ νλ€.
parserOptions: {
ecmaFeatures: {
jsx: true, // JSXλ₯Ό νμ±ν μ μκ² μ€μ νλ€.
},
ecmaVersion: 12, // ECMAScript 2021(λ²μ 12) λ¬Έλ²μ μ¬μ©νλ€.
sourceType: "module", // ECMAScript λͺ¨λμ μ¬μ©νλ€.
},
settings: {
react: {
version: "detect", // μ€μΉλ React λ²μ μ μλμΌλ‘ κ°μ§νλ€.
},
"import/resolver": {
node: {
extensions: [".js", ".jsx", ".ts", ".tsx"], // μ¬μ©ν νμΌ νμ₯μλ₯Ό μ€μ νλ€.
paths: ["./src"], // import κ²½λ‘μ κΈ°λ³Έ ν΄λλ₯Ό μ€μ νλ€.
},
},
},
plugins: ["react", "react-refresh"], // μ¬μ©λ ESLint νλ¬κ·ΈμΈμ μ€μ νλ€.
rules: {
"react/prop-types": "off", // PropTypesλ₯Ό μ¬μ©νμ§ μμλ κ²½κ³ λ μ€λ₯λ₯Ό λ°μμν€μ§ μλλ€.
"react/jsx-no-target-blank": "warn", // κ΄λ ¨ 보μ κ²½κ³ λ₯Ό μ μ§νλ€.
"react-refresh/only-export-components": [
"warn", // React Refreshμμ μ»΄ν¬λνΈλ§ λ΄λ³΄λ΄λλ‘ κ²½κ³ νλ€.
{
allowConstantExport: true, // μμλ‘ λ΄λ³΄λ΄λ κ²μ νμ©νλ€.
},
],
"react/react-in-jsx-scope": "off", // Reactκ° JSX λ²μ λ΄μ μμ΄μΌ νλ€λ κ·μΉμ λΉνμ±ννλ€.
"import/order": [
"error",
{
groups: [
["builtin", "external"],
"internal",
"parent",
"sibling",
"index",
],
"newlines-between": "always",
},
],
},
};
π μ μ©λ°©λ²
ESLint κ²μ¬: npm run lint:es
ESLint κ²μ¬+μλ μμ : npm run lint:es:fix
Prettier κ²μ¬: npx prettier —check .
Prettier κ²μ¬+μλ μμ : npx prettier —write .
(VSCodeμμ extensionμ μ€μΉνλ©΄ μ¦κ°μ μΌλ‘ νμΈν μ μλ€.)
7. κ°λ° μμ
μ΄μ κΈ°λ³Έ μ€μ μ΄ λͺ¨λ μλ£λμμΌλ, src/App.js νμΌμ μμ νμ¬ κ°λ°μ μμν μ μμ΅λλ€.
μ΄λ¬ν λ¨κ³λ₯Ό ν΅ν΄ React νλ‘μ νΈλ₯Ό μ½κ² μμν μ μμ΅λλ€. μΆκ°μ μΌλ‘ νμν λΌμ΄λΈλ¬λ¦¬λ λꡬλ€μ npmμ μ¬μ©νμ¬ μ€μΉν μ μμ΅λλ€.
'π»μΉ(Web)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Servlet (0) | 2024.12.01 |
---|---|
[곡ν΅νλ‘μ νΈ]5μ£Όμ°¨: React Openvidu ꡬν (0) | 2024.08.11 |
MVC, MVVM, Flux ν¨ν΄ (1) | 2024.07.15 |
[React]React Router (0) | 2024.06.28 |
νλ‘ νΈμλ μ±λ₯ μ΅μ ν (0) | 2024.04.12 |