κ°μ₯ λ¨Όμ Reactλ₯Ό μ€ννκΈ° μν΄μλ μλ νλͺ©λ€μ΄ νμν©λλ€.
node μ€μΉ // package manageλ₯Ό μ¬μ© νκΈ° μν΄μ μ€μΉν΄μ€μΌ ν©λλ€.
// μ€μΉ λλμ§ νμΈνκΈ° μν΄ ν°λ―Έλμμ μλ λͺ
λ Ήμ΄ μ
λ ₯
$node -v
$npm i // μ€μΉ λͺ
λ Ήμ΄
$npm -v // λ²μ νμΈ λͺ
λ Ήμ΄
TypeScript μ¬μ©νλ €λ©΄ Create TypeScript project
체ν¬νκ³ μμ±νλ©΄ λ©λλ€.
μ¬λ¬ μ¬λμ΄ μμ μ ν΄λ ν μ¬λμ΄ μμ ν κ² μ²λΌ μΌκ΄μ μΈ μ½λ μ€νμΌμ μ μ§ν μ μκ² λμμ£Όλ ν΄μ΄λ€.
μ€ λ°κΏ, 곡백, λ€μ¬ μ°κΈ° κ°μ μ€νμΌμ κ΅μ ν΄ μ€λ€.
{
"bracketSpacing": true,
"printWidth": 140,
"singleQuote": true,
"trailingComma": "none",
"tabWidth": 4,
"useTabs": false
}
λ λ§μ μμ±μ μ‘μμ£Όκ³ μΆλ€λ©΄ π
https://prettier.io/docs/en/index.html
λ¬Έλ² μλ¬λ₯Ό μ‘μμ£Όκ±°λ λ μ’μ μ½λ ꡬν λ°©μμ μ¬μ©νλλ‘ ν΄μ€λ€.
.eslintrc λΌλ νμΌμ μμ±ν΄μ μ¬μ©νλ€.
{
"root": true,
"env": {
"browser": true,
"es2021": true
},
"extends": ["prettier", "plugin:react/jsx-runtime", "plugin:jsx-a11y/recommended", "plugin:react-hooks/recommended"],
"settings": {
"import/resolver": {
"node": {
"moduleDirectory": ["node_modules", "src/"]
}
}
},
"parser": "@babel/eslint-parser",
"parserOptions": {
"ecmaFeatures": {
"experimentalObjectRestSpread": true,
"impliedStrict": true
},
"ecmaVersion": 12
},
"plugins": ["prettier", "react", "react-hooks"],
"rules": {
"react/jsx-filename-extension": 0,
"no-param-reassign": 0,
"react/prop-types": 1,
"react/require-default-props": 0,
"react/no-array-index-key": 0,
"react/jsx-props-no-spreading": 0,
"react/forbid-prop-types": 0,
"import/order": 0,
"no-console": 0,
"jsx-a11y/anchor-is-valid": 0,
"prefer-destructuring": 0,
"no-shadow": 0,
"no-unused-vars": [
1,
{
"ignoreRestSiblings": false
}
],
"prettier/prettier": 0 //prettier μ λν κ²½κ³ λκΈ°
}
}
λ¨Όμ λ°λ²¨μ μ€λͺ νκΈ° μ , ν΄λ¦¬νμ λν΄μ κ°λ¨νκ² μμλ΄ μλ€.
ν΄λ¦¬νμ κ°λ°μκ° νΉμ κΈ°λ₯μ΄ μ§μλμ§ μλ λΈλΌμ°μ λ₯Ό μν΄ μ¬μ©ν μ μλ μ½λ μ‘°κ°μ΄λ νλ¬κ·ΈμΈμ΄λ€. λΈλΌμ°μ μμ μ§μνμ§ μλ κΈ°λ₯λ€μ λν νΈνμ±μ μ±μ λ£λλ€κ³ νμ¬ ν΄λ¦¬ν μ΄λΌκ³ μΉν©λλ€.
λ°λ²¨μ μ΄λ¬ν ν΄λ¦¬νμ μμ½κ² μ§μνκΈ° μν΄ babel-polyfill
κΈ°λ₯μ μ§μν©λλ€. μ¦, λ°λ²¨ ν΄λ¦¬νμ μ΅μ λ¬Έλ²μ μ¨λ μ΄μ λ²μ λΈλΌμ°μ νκ²½μμλ μ¬μ©ν μ μλλ‘ μ΅μ λ¬Έλ²μ νΉμ μμ λ²μ μ JSλ‘ λ³νν΄μ£Όλ ν΄μ΄λΌκ³ μκ°νμλ©΄ λ©λλ€.
// Babel Input: ES2015 arrow function
[1, 2, 3].map((n) => n + 1);
// Babel Output: ES5 equivalent
[1, 2, 3].map(function(n) {
return n + 1;
});]
react-hot-loader μ€μΉνκΈ° *μΌλͺ ν«λ¦¬λ‘λ λΌκ³ νλ€.
// μ€μΉ λͺ
λ Ήμ΄
$npm i react-hot-loader
// μ μ© μμ€ μ½λ
import { hot } from 'react-hot-loader';
const App = () => {
return (
<Router>
<Routes>
<Route path="/" element={<Board1 />} />
<Route path="/board2" element={<Board2 />} />
</Routes>
</Router>
);
};
export default hot(module)(App);