μ°λ¦¬ν(NDD)μ Nextκ° μλ SPA μλΉμ€λ₯Ό λ§λ€κ²μ΄λ©°, νΉν CRAμμ΄ react μλΉμ€λ₯Ό ꡬμ±ν΄λ³΄λ €κ³ ν©λλ€.
μ§λ μκ°μ μ°λ¦¬κ° μ¬μ©ν κΈ°μ λ€μ λν΄μ μ§§κ² λλ§ λ Όμν ν κ²°λ‘ μ λ΄λ¦΄ μ μμμ΅λλ€. μ°λ¦¬ν(NDD)μ Nextκ° μλ SPA μλΉμ€λ₯Ό λ§λ€κ²μ΄λ©°, νΉν CRAμμ΄ react μλΉμ€λ₯Ό ꡬμ±ν΄λ³΄λ €κ³ ν©λλ€. λ³Έ κ²μκΈμ babel κ³Ό webpackμ μ§μ€νμ¬ μμ±λμμ΅λλ€.
νλ μμν¬λ λ€μνκ³ νΈλ¦¬ν κΈ°λ₯μ μ 곡ν©λλ€. λΉμ°ν μ¬λ¬ μ λ₯ν κ°λ°μλ€μ κ°λ°λ‘ μ΄λ£¨μ΄μ‘κΈ° λλ¬Έμ΄μ§λ§, μ¬λ¬κ°μ§λ‘ μννλ€λ μκ°μ΄ λ€μμ΅λλ€.
- νλ μμν¬λ₯Ό μ¬μ©νλ©΄ νΈλ¦¬ν κΈ°λ₯λ€μ΄ μ΄λ»κ² μ 곡λλμ§ λͺ¨λ¦ λλ€.
- νλ μμν¬λ₯Ό μ¬μ©νκΈ° μ "λΆνΈν¨"μ μκ³ μμ΄μΌ νλ€κ³ μκ°ν©λλ€.
μμ κ°μ μκ°λ€μ ν΅ν΄ μ λ μ μ νλ μμν¬λ₯Ό μ¬μ©νμ§ λ§μμΌ κ² λ€λ μκ°μ΄ λ€μμ΅λλ€. μ μ΄λ λΆνΈν¨ μ λͺ¨λ₯΄λ μνμμ νλ μμν¬λ‘ λ¨κΈ°κ°μ νΈλ¦¬ν¨μ μ°ΎκΈ°λ λͺ¨μλλ€λ μκ°μ΄ λ€μμ΅λλ€.
무μλ³΄λ€ μ°λ¦° νλ‘μ νΈλ₯Ό μ§ννλ©΄μ "μ±μ₯" μ μ΄μ μ λμμ΅λλ€. λ¨κΈ°κ° νλ‘μ νΈλ₯Ό μμ±νλκ²μ΄ λͺ©νκ° μλ, μκ°μ΄ μ€λ 걸리λλΌλ μλ―Έ μλ νμ΅μ ν¨κ» μ§ννκ³ μΆμμ΅λλ€.
λΆμ€νΈμΊ νμμ μ 곡ν κ·Έλ£Ήνλ‘μ νΈ κ°μ΄λλΌμΈ
νμ§λ§ λΆμ€νΈμΊ ν μΈ‘μμλ Webpackμ λν μ ν μ μΆμ²νμ§ μμλλ°μ. κ·Έλλ κΌ μ§νν΄λ³΄κ³ μΆμμ΅λλ€. λ νλ μμν¬λ₯Ό μ¬μ©νλ©°, λΆμ‘±ν¨μ λλΌλ λΆλΆμ μ΄λ² κΈ°νμ μ±μ°κ³ μΆμμ΅λλ€.
λ°λΌμ μ΄κΈ° νλ‘μ νΈ μ ν μ νμν κ²μ 리μ€νΈμ νκ² λμμ΅λλ€.
- React κΈ°λ° νλ‘μ νΈ μ ν μ΄ κ°λ₯ν΄μΌνλ€.
- TS λ¬Έλ²μ μ¬μ©κ°λ₯ν΄μΌνλ€.
- Emotionμ css-props λ¬Έλ²μ΄ μ¬μ©κ°λ₯ν΄μΌ νλ€.
- eslint λ prettier λ± μ½λ ν¬λ©§ν μ΄ κ°λ₯ν΄μΌνλ€.
npx create-react-app [νλ‘μ νΈ λͺ
]
λ€μκ³Ό κ°μ λͺ λ Ήμ΄λ‘ μλμ κ°μ κ²°κ³Όλ¬Όμ΄ μμ±λ©λλ€.
https://create-react-app.dev/docs/getting-started
my-app
βββ README.md
βββ node_modules
βββ package.json
βββ .gitignore
βββ public
β βββ favicon.ico
β βββ index.html
β βββ logo192.png
β βββ logo512.png
β βββ manifest.json
β βββ robots.txt
βββ src
βββ App.css
βββ App.js
βββ App.test.js
βββ index.css
βββ index.js
βββ logo.svg
βββ serviceWorker.js
βββ setupTests.js
μ΄ μ½λ μ΄λμλ μμΌλ‘ μ€λͺ ν webpack, babel λ±λ± λ²λ€λ§κ³Ό μ»΄νμΌμ μ§νν μ ν μ΄ λ³΄μ΄μ§ μμ΅λλ€.
κ·Έ μ΄μ λ Create React App (CRA)μ μ¬μ©νμ¬ React νλ‘μ νΈλ₯Ό μμ±νλ©΄, Webpack, Babel, ESLint λ±μ μ€μ μ΄ λ΄λΆμ μΌλ‘ μ¨κ²¨μ Έ μκΈ° λλ¬Έμ λλ€. μ΄λ° λ°©μμ "Zero-Configuration" λλ "No-Config" λ°©μμ΄λΌκ³ ν©λλ€. CRAλ μ΄λ¬ν λꡬλ€μ 미리 ꡬμ±νμ¬ μ 곡νκΈ° λλ¬Έμ, μ¬μ©μλ 볡μ‘ν μ€μ κ³Όμ μμ΄λ λ°λ‘ React μ ν리μΌμ΄μ μ κ°λ°νκΈ° μμν μ μμ΅λλ€.
λ¬Όλ‘ μ κ·Όμ μμ λͺ»νλκ²μ μλλλ€. npm run eject
μ κ°μ λͺ
λ Ήμ΄λ₯Ό μ¬μ©νλ©΄, μ¨κ²¨μ§ webpack, babelλ±μ μ κ·Όν μ μμ΅λλ€.
μμμ κ°λ¨νκ² μ€λͺ μ λλ Έμμ΅λλ€λ§, reactλ μ¬λ¬κ°μ§ λꡬλ₯Ό ν΅ν΄μ λΈλΌμ°μ κ° μ½μ μ μλλ‘ "λ³ν" ν΄μ£Όλ κ³Όμ μ΄ νμν©λλ€. λ¨νΈμ μΌλ‘ Reactμ JSXλΌλ XMLκ³Ό μ μ¬ν λ¬Έλ²μ μ¬μ©ν©λλ€. λΈλΌμ°μ λ JSXλ₯Ό μ΄ν΄νμ§ λͺ»νκΈ° λλ¬Έμ, Babelμ JSXλ₯Ό λΈλΌμ°μ κ° μ΄ν΄ν μ μλ μΌλ° JavaScript ν¨μ νΈμΆλ‘ λ³νν©λλ€.
λ¬Όλ‘ μ΄λ React μλ§ νμ λλ μ΄μΌκΈ°λ μλλλ€. es6μ λͺ¨λ μμ€ν κ³Ό κ°μ μ΅μ λ¬Έλ²λ€μλν΄μλ λΈλΌμ°μ κ° μ΄ν΄ν μ μλ μ½λλ‘ λ³ννλ κ³Όμ μ΄ νμν©λλ€.
λ€μκ³Ό κ°μ΄ μμ½ν μ μμκ² κ°μ΅λλ€.
Node.jsλ κΈ°λ³Έμ μΌλ‘ μ΅μ JavaScript λ¬Έλ²μ μΌλΆλ₯Ό μ§μνμ§ μμ΅λλ€. μλ₯Ό λ€μ΄, Reactμμ λ§μ΄ μ¬μ©λλ JSX λ¬Έλ²μ΄λ ES6μ import/export λ¬Έλ² λ±μ΄ κ·Έλ μ΅λλ€. μ΄λ¬ν λ¬Έλ²μ Node.jsκ° μ΄ν΄ν μ μλλ‘ λ³νν΄μΌ νλλ°, μ¬κΈ°μ Babelμ΄ νμν©λλ€.
Babelμ μ΅μ JavaScript λ¬Έλ²μ Node.jsκ° μ΄ν΄ν μ μλ μ΄μ λ²μ μ JavaScriptλ‘ λ³νν΄μ£Όλ λꡬμ λλ€. μ΄λ₯Ό ν΅ν΄ μ°λ¦¬λ React μ±μμ μ΅μ λ¬Έλ²μ μμ λ‘κ² μ¬μ©ν μ μκ² λ©λλ€.
React μ±μ μ¬λ¬ JavaScript νμΌλ‘ ꡬμ±λμ΄ μμ΅λλ€. μ΄ νμΌλ€μ μΉ λΈλΌμ°μ κ° μ΄ν΄ν μ μλλ‘ νλμ νμΌλ‘ ν©μΉλ κ³Όμ μ΄ νμν©λλ€. μ΄ κ³Όμ μ 'λΉλ(build)'λΌκ³ ν©λλ€. Webpackμ μ΄λ¬ν λΉλ κ³Όμ μ κ΄λ¦¬νλ λꡬλ‘, κ°λ° μ€μ μ€μκ°μΌλ‘ νμΌμ ν©μΉκ³ νμν λ³νμ μνν©λλ€. λν, κ°λ° μλ²λ₯Ό μ 곡νμ¬ μ€μκ°μΌλ‘ μ±μ ν μ€νΈνκ³ νμΈν μ μκ² ν΄μ€λλ€.
Babelμ μλ°μ€ν¬λ¦½νΈ μ»΄νμΌλ¬λ‘, μ£Όλ‘ μ΅μ λ²μ μ μλ°μ€ν¬λ¦½νΈ(ES6 μ΄μ) μ½λλ₯Ό μ€λλ μλ°μ€ν¬λ¦½νΈ λ²μ μΌλ‘ λ³ννλ λ° μ¬μ©λ©λλ€. μ΄λ° λ³ν κ³Όμ μ ν΅ν΄, μ΅μ μλ°μ€ν¬λ¦½νΈ λ¬Έλ²μ μ¬μ©νμ¬ μμ±λ μ½λλ₯Ό μ€λλ λΈλΌμ°μ λ νκ²½μμλ μ€νν μ μκ² ν©λλ€. Babelμ μ£Όμ νΉμ§κ³Ό κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€:
μ½λ λ³ν(Transpilation): Babelμ μ΅μ μλ°μ€ν¬λ¦½νΈ λ¬Έλ²(μ: νμ΄ν ν¨μ, ν΄λμ€, ν νλ¦Ώ λ¬Έμμ΄ λ±)μ ꡬ λ²μ μ μλ°μ€ν¬λ¦½νΈ μ½λλ‘ λ³νν©λλ€. μ΄λ ꡬν λΈλΌμ°μ λ νκ²½μμλ μ΅μ μλ°μ€ν¬λ¦½νΈ κΈ°λ₯μ μ¬μ©ν μ μκ² ν΄μ€λλ€.
λΈλΌμ°μ νΈνμ±: λ€μν λΈλΌμ°μ μμ μλ°μ€ν¬λ¦½νΈ μ½λκ° μΌκ΄λκ² μλνλλ‘ λμμ€λλ€. μ΄λ₯Ό μν΄ Babelμ νΉμ λΈλΌμ°μ μμ νμν νΉμ λ³νλ§μ μ μ©ν μ μλ 'ν리μ (presets)'κ³Ό 'νλ¬κ·ΈμΈ(plugins)'μ μ 곡ν©λλ€.
JSX λ° React μ§μ: Babelμ React κ°λ°μ νμμ μ λλ€. Reactμμ μ¬μ©λλ JSX λ¬Έλ²μ κΈ°λ³Έμ μΌλ‘ μλ°μ€ν¬λ¦½νΈμ λ΄μ₯λμ΄ μμ§ μμΌλ―λ‘, Babelμ μ¬μ©νμ¬ JSXλ₯Ό μΌλ° μλ°μ€ν¬λ¦½νΈ μ½λλ‘ λ³νν΄μΌ ν©λλ€.
νλ¬κ·ΈμΈ λ° νμ₯μ±: Babelμ λ€μν νλ¬κ·ΈμΈμ ν΅ν΄ νμ₯ κ°λ₯ν©λλ€. κ°λ°μλ νμμ λ°λΌ μΆκ°μ μΈ κΈ°λ₯μ Babelμ νλ¬κ·ΈμΈμΌλ‘ μΆκ°νμ¬ μ¬μ©ν μ μμ΅λλ€.
ES6 μ΄μμ κΈ°λ₯ μ§μ: Babelμ ES6, ES7 λ±μ μλ‘μ΄ μλ°μ€ν¬λ¦½νΈ λ²μ μμ λμ λ κΈ°λ₯λ€μ μ€λλ μλ°μ€ν¬λ¦½νΈ λ²μ μΌλ‘ λ³ννμ¬, μ΄μ λ²μ μ μλ°μ€ν¬λ¦½νΈ μμ§μμλ ν΄λΉ κΈ°λ₯λ€μ μ¬μ©ν μ μλλ‘ μ§μν©λλ€.
// .babelrc
{
"presets": [
"@babel/preset-env",
[
"@babel/preset-react",
{ "runtime": "automatic", "importSource": "@emotion/react" }
],
"@babel/preset-typescript"
],
"plugins": ["@emotion/babel-plugin"],
"targets": "> 0.5%, not dead"
}
νμ€μ© μ€λͺ μ μΆκ°ν΄λ³΄κ² μ΅λλ€. Presetsμ νΉμ ν λͺ©μ μ΄λ νκ²½μ λ§μΆ°μ§ μΌλ ¨μ Babel νλ¬κ·ΈμΈλ€μ λ¬Άμμ λλ€. κ° ν리μ μ μμ£Ό μ¬μ©λλ νΉμ μ€μ μ΄λ νκ²½μ μ΅μ νλ Babel νλ¬κ·ΈμΈμ μ‘°ν©μ ν¬ν¨ν©λλ€. μ¬κΈ°μ μ¬μ©λλ presetsλ λ€μκ³Ό κ°μ΅λλ€.
@babel/preset-envλ κ°λ°μκ° μ§μ ν λμ νκ²½(λΈλΌμ°μ , Node.js λ±)μ λ°λΌ νμν JavaScript λ³νμ μλμΌλ‘ μ μ©ν©λλ€. μλ₯Ό λ€μ΄, μ€λλ λΈλΌμ°μ μμ μ€νλλ μ½λλ₯Ό κ°λ°νλ€λ©΄, μ΄ ν리μ μ ES6 μ΄μμ JavaScript λ¬Έλ²μ μ€λλ JavaScript λ¬Έλ²μΌλ‘ λ³ννμ¬ νΈνμ±μ 보μ₯ν©λλ€.
"ν΄λ¦¬ν(polyfill)"μ μ μ©νλ€λ κ²μ νΉμ κΈ°λ₯μ΄λ APIκ° μ§μλμ§ μλ λΈλΌμ°μ λ νκ²½μμλ κ·Έ κΈ°λ₯μ μ¬μ©ν μ μλλ‘ νλ μ½λ λλ λꡬλ₯Ό μ 곡νλ€λ μλ―Έμ λλ€. Babelκ³Ό κ°μ λꡬλ₯Ό μ¬μ©ν λ, ν΄λ¦¬νμ μλμΌλ‘ μ μ©λ μ μμ΅λλ€. μλ₯Ό λ€μ΄, @babel/preset-envλ νμν ν΄λ¦¬νμ νλ‘μ νΈμ λμ νκ²½μ λ§μΆ° μλμΌλ‘ ν¬ν¨μν΅λλ€. μ΄λ κ°λ°μκ° λ³λλ‘ κ° λΈλΌμ°μ μ νΈνμ±μ 체ν¬νκ³ νμν ν΄λ¦¬νμ μλμΌλ‘ μΆκ°νλ μκ³ λ₯Ό λμ΄μ€λλ€.
["@babel/preset-react",{ "runtime": "automatic", "importSource": "@emotion/react" }]
Babelμ μ¬μ©νμ¬ TypeScript μ½λλ₯Ό μΌλ° JavaScriptλ‘ λ³ννκΈ° μν Babel ν리μ μ λλ€. TypeScriptλ JavaScriptμ νμ μ μΆκ°ν νμ₯ μΈμ΄λ‘, λ μμ μ μ΄κ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λ μμ±μ κ°λ₯νκ² ν©λλ€. κ·Έλ¬λ λΈλΌμ°μ λ μΌλ°μ μΈ JavaScript νκ²½μμ μ§μ μ€νλ μ μκΈ° λλ¬Έμ, TypeScript μ½λλ₯Ό μΌλ° JavaScript μ½λλ‘ λ³ννλ κ³Όμ μ΄ νμν©λλ€. μ΄λ @babel/preset-typescriptκ° μ¬μ©λ©λλ€.
emotionμμ μ 곡νλ babel-plugin μ λλ€. μ¬λ¬κ°μ§ νΈμ κΈ°λ₯μ μ 곡ν©λλ€. νμμ μ΄μ§ μμ΅λλ€. μ΄ νλ¬κ·ΈμΈμ Emotion μ€νμΌ μ½λμ μ±λ₯μ μ΅μ ν νλ κΈ°λ₯μ μνν©λλ€. μλ₯Ό λ€μ΄, μ€νμΌμ΄ μ»΄νμΌ νμμ μ μ μΌλ‘ κ²°μ λ μ μλ€λ©΄, λ°νμ μ€λ²ν€λλ₯Ό μ€μ΄κΈ° μν΄ μ΄λ₯Ό 미리 κ³μ°ν©λλ€.
ν΄λΉ μ€μ μ babelμ΄ μ§μν μ μλ λΈλΌμ°μ μ λ²μμ λν 쑰건μ λͺ μν©λλ€. μμ λ¬Έλ§₯μ λ€μκ³Ό κ°μ μλ―Έλ₯Ό κ°μ§λλ€. "> 0.5%": μ μΈκ³ μ¬μ©μμ 0.5% μ΄μμ΄ μ¬μ©νλ λΈλΌμ°μ λ²μ μ λμμΌλ‘ ν©λλ€. μ¦, μ 체 μΈν°λ· μ¬μ©μμ μλΉ λΆλΆμ΄ μ¬μ©νλ λΈλΌμ°μ λ²μ μ λν΄ μ½λλ₯Ό μ΅μ ννκ³ λ³νν©λλ€.
"not dead": 'μ£½μ' λΈλΌμ°μ λ μ μΈν©λλ€. μ¬κΈ°μ 'μ£½μ' λΈλΌμ°μ λ 곡μμ μΈ μ§μμ΄ μ’ λ£λ λΈλΌμ°μ λ₯Ό μλ―Έν©λλ€. μλ₯Ό λ€μ΄, 보μ μ λ°μ΄νΈλ κΈ°μ μ§μμ΄ λ μ΄μ μ 곡λμ§ μλ λΈλΌμ°μ λ μ΄ λ²μ£Όμ μν©λλ€.
μ΄ λ°μλ Source Maps (sourceMaps),Ignore / Only (ignore, only),Environment (env),Comments (comments),Compact (compact) λ±λ±μ μμ±μ΄ μμ§λ§, μ’ λ νλ‘μ νΈκ° μ±μν΄ μ§ μ΄νμ νμμ±μ΄ λλλλ€λ©΄ λμ ν μμ μ λλ€.
webpackμ λͺ¨λ μ€μ μ λ€λ£¨κΈ° 보λ¨, babelκ³Ό μ°κ²°λλ λΆλΆμ μ€μ¬μΌλ‘ λλ¨Έμ§ λΆλΆλ€μ μλμ μΌλ‘ μκ² λ€λ€λ³΄κ² μ΅λλ€.
μΉ μ ν리μΌμ΄μ μ μλ§μ JavaScript νμΌ, CSS, μ΄λ―Έμ§ λ±μΌλ‘ ꡬμ±λ©λλ€. Webpackμ μ΄λ¬ν λ€μν μμλ€μ λͺ¨μμ λΈλΌμ°μ κ° μ΄ν΄ν μ μλ νλ λλ μ¬λ¬ κ°μ νμΌ(λ²λ€)λ‘ κ²°ν©ν©λλ€. μ΄ κ³Όμ μ μΉμ¬μ΄νΈμ λ‘λ© μκ°μ μ€μ΄κ³ μ±λ₯μ ν₯μμν€λ λ° λμμ΄ λ©λλ€. Webpackμ λ€μν νμ μ νμΌλ€μ μ²λ¦¬ν μ μλ λ‘λ μμ€ν μ μ 곡ν©λλ€. μλ₯Ό λ€μ΄, CSS, μ΄λ―Έμ§ νμΌ, HTML λ±μ JavaScript λͺ¨λλ‘ λ³νν μ μμ΅λλ€. λν, νλ¬κ·ΈμΈμ ν΅ν΄ λ²λ€λ§ νλ‘μΈμ€μ 컀μ€ν μμ μ μΆκ°ν μ μμ΅λλ€.
μ²μ²ν webpackμ ꡬ쑰μ λ°©μμ λν΄μ κ°λ¨ν μ€λͺ μ ν΄λ³΄κ² μ΅λλ€.
νλ‘μ νΈ λ΄λΆμ λͺ¨λ μ½κΈ° κ³Όμ μ΄ μμλλ μμΉλ₯Ό μλ―Έν©λλ€. μΌλ°μ μΌλ‘ /src μ index.ts νΉμ index.tsxλ₯Ό μμλλ μμΉλ‘ μ μ ν©λλ€.
νλ‘μ νΈ λ΄λΆμ λͺ¨λ νμΌλ€μ λ²λ€λ κ²°κ³Όλ¬Όμ λ°ννλ νμΌμ λλ€.
//webpack.config.json
...
output: {
publicPath: '/',
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js', // μμλ‘ μ¬μ©λλ κ²°κ³Ό νμΌμ
λλ€. hashκ°μΌλ‘ λ³κ²½μμ μ
λλ€.
clean: true,
},
...
λν distν΄λ λ΄λΆμ bundle.js λΏ μλλΌ index.htmlμ΄ ν¬ν¨λμ΄ μλλ°, μ΄λ output optionμ΄ μλ pluginμμ μ²λ¦¬ν΄μ€λλ€.
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html',
}),
ν΄λΉ λ°©μμ ν΅ν΄μ index.htmlμ΄ distνμΌ λ΄λΆμ μ μΈλ©λλ€. μ΄λ index.htmlμ΄ μμ±λλ μμΉλ output μ΅μ μ pathκ·μΉμ λ°λ¦ λλ€.
module: {
rules: [
{
test: /\.(ts|tsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
....
]
λ€μκ³Ό κ°μ΄ μ μΈνμ¬ babelrcμ μμ±ν λ΄μ©μ λ°νμΌλ‘ μ»΄νμΌμν¨ ν λ²λ€λ§ μν¬ μ μμ΅λλ€. babelμ κ΄λ ¨λ μ΅μ μ μλ¨μ babelrcμμ μ²λ¦¬λμκΈ° λλ¬Έμ, μ¬ μ μΈνμ§ μμ΅λλ€. (νμ§λ§ ν΄λΉ prμ μ¬λ¦΄ λΉμμλ μ΄ λ¬Έμ λ₯Ό κΉ¨λ«μ§ λͺ»νκ³ μ€λ³΅μ μΈ λμ΄ μμ΅λλ€. μ΄ λ¬Έμ μ μ²λ¦¬λ₯Ό μν΄ λ°±λ‘κ·Έμ κΈ°μ ν prμλ μΆκ°μ μΌλ‘ κΈ°λ‘μ λ¨κ²¨λμμ΅λλ€.)
μΆκ°μ μΌλ‘ tsconfigμ μ°κ²°νμ¬ alias μ€μ , devServer κ΄λ ¨μ€μ μ΄ μμ΅λλ€
μ¬μ€ λλ¨Έμ§λ ν¬κ² μ΄λ ΅μ§ μμ μ΅μ μ΄μμ΅λλ€.
// .prettierrc.json
{
"tabWidth": 2,
"printWidth": 80,
"singleQuote": true,
"endOfLine": "auto",
"arrowParens": "always",
"trailingComma": "es5"
}
// tsμ react, css-props κΈ°μ€ νμν μ΅μ
λ§μ μ°Ύμ μ¬μ©νμ΅λλ€.
{
"root": false,
"parser": "@typescript-eslint/parser",
"env": {
"browser": true,
"node": true
},
"ignorePatterns": ["webpack.config.js"],
"parserOptions": {
"project": ["./FE/tsconfig.json"] // μ§νμ€μΈ νλ‘μ νΈκ° λͺ¨λ
Έλ ν¬λ‘ ꡬμ±λμ΄ λ€μκ³Ό κ°μ μ΅μ
μ μ£Όμ΄μΌ νμ΅λλ€.
},
"plugins": ["@typescript-eslint", "prettier", "unused-imports"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking",
"plugin:react/recommended",
"plugin:react/jsx-runtime",
"plugin:react-hooks/recommended",
"prettier"
],
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "off",
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
"vars": "all",
"varsIgnorePattern": "^_",
"args": "after-used",
"argsIgnorePattern": "^_"
}
],
"no-console": "warn",
"react/no-unknown-property": ["error", { "ignore": ["css"] }],
"react/prop-types": "off"
},
"settings": {
"react": {
"version": "detect" // μλμΌλ‘ 리μ‘νΈ λ²μ κ°μ§
}
}
}
prettierμ eslintλ λλλ‘ μ격νκ² κ²μ¬νλλ‘ μ€μ νμ΅λλ€.
μ§κΈκΉμ§ CRA μμ΄ νλ‘μ νΈ μ ν μ λν΄μ μ§νν΄ λ³΄μμ΅λλ€. ν΄λΉ μ½λλ₯Ό μμ±ν PRμ΄λ©°,
μμ§ μμμ λΆκ³Όνμ§λ§, νλ‘μ νΈλ₯Ό μ§ννλ©° webapckμ λν΄μ λ κΉμ νμ΅μ΄ κ°λ₯νλ©΄ μ’κ² μ΅λλ€.