core-of-frontend
ํด๋๋ช
์ผ๋ก CRA ํ๋ก์ ํธ๋ฅผ ์ค์นํ๋ค.
$ npx create-react-app core-of-frontend
SPA (Single Page Application) ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ์ํด์ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ค๋ค.
$ npm install react-router-dom --save
ํ๋์ index.html
ํ์ผ์ด ๋๊ธฐ ๋๋ฌธ์ css์ ์ถฉ๋์ ๋ฌธ์ ๋ ์๊ณ ์กฐ๊ธ ๋ ํธ๋ฆฌํ ํ์ฅ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ์ํด์ ์ด๋ฒ ํ๋ก์ ํธ์์๋ Sass๋ฅผ ์ด์ฉํด๋ณด๋ ค๊ณ ํ๋ค!
npm install node-sass@4.14.1 --save
git rm --cached ํ๊ณ eslintcache ํ์ผ .gitignore ์ ์์ฑํด์ฃผ๊ธฐ
.eslintcache
//.vscode --> ๋์ค์ ๋ค์์ .vscode ๋ด setting.json ํ์ผ ์์ ํ๊ณ ๋์ .gitignore์ ์ถ๊ฐํ ๊ฑฐ๋ค!
public
/ data
/ mockdata.jsonsrc
/ Components
/ Nav
/ Nav.js Nav.scsssrc
/ Components
/ Footer
/ Footer.js Footer.scsssrc
/ Images
/ pill.jpgsrc
/ Pages
/ SignUp
/ SignUp.js SignUp.scsssrc
/ Pages
/ Login
/ Login.js Login.scsssrc
/ Pages
/ Main
/ Main.js Main.scsssrc
/ Pages
/ ProductList
/ ProductList.js ProductList.scsssrc
/ Pages
/ ProductDetail
/ ProductDetail.js ProductDetail.scsssrc
/ Styles
/ common.scss reset.scssCRA
๋ก ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด ESLint๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋๋ค๊ณ ํ์ง๋ง,, ์ฒ์๋ถํฐ ๋ค์ ์งํํด๋ณด์๋ค!
ESLint
, Prettier
๋ฅผ ๊ฒ์ํด์ ๊ฐ๊ฐ ์ค์นํ๋ค.npm install -D prettier eslint-config-prettier eslint-plugin-prettier
๋ฅผ ์ด์ฉํด์ npm ํจํค์ง๋ฅผ ์ด์ฉํด์๋ ๋ ์ค์นํ๋ค,,ใ
ใ
์ด๋ ๊ฒ ์ค์ ํ๋ค๊ฐ ๋์ค์ npm run start ํ์ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. 9. ์ต์ข ์ค์ ์ฝ๋ ๋ถ๋ถ์ ํ์ธํด์ฃผ์ธ์!! .. ์ ํํ ์๋ฌ์ ์์ธ์ ์์ง ์์ง ๋ชปํด์ ์ด ๋ถ๋ถ์ ๋จ๊ฒจ๋ก๋๋ค ๐
.vscode
๋ผ๋ ํด๋๊ฐ ์์ฑ์ด ๋์๋ค. .settings.json
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.// .settings.json
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
},
"javascript.format.enable": false,
"prettier.eslintIntegration": true,
"prettier.disableLanguages": ["js"],
"eslint.alwaysShowStatus": true,
"files.autoSave": "onFocusChange"
}
.eslintrc
ํ์ผ์ ๋ง๋ค์ด์ ๋ค์ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์๋ค.// .eslintrc
{
"extends": ["react-app", "plugin:prettier/recommended"]
}
.prettierrc
ํ์ผ์ ๋ง๋ค์ด์ ๋ค์ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์๋ค. โจ ์ฃผ์์ ์ง์์ฃผ๊ธฐ!// .prettierrc
{
"tabWidth": 2, // ํญ ์ฌ์ด์ฆ 2์นธ
"endOfLine": "lf", // CRLF ๋์ LF๋ฅผ ๊ฐ์
"arrowParens": "avoid", // ํ์ดํ ํจ์ ํ๋ผ๋ฏธํฐ ์๋ฆฌ ๋ถํ์ํ ์๊ดํธ ์ ๊ฑฐ
"singleQuote": true, // ์๋ฐ์ดํ ๋์ ํ๋ฐ์ดํ ์ฌ์ฉ
}
git add .
git commit -m "Add: ์ด๊ธฐ์ธํ
์๋ฃ"
git branch -M main
โ master ๋ธ๋์น๋ฅผ main ๋ธ๋์น๋ก ๋ณ๊ฒฝgit remote add origin repo์ฃผ์
git push origin main
์ฌ๊ธฐ๊น์ง ํ๊ณ ๋์ ์ด๊ธฐ์ธํ
์ด ๋๋์ ํ๋ณตํ์ง๋ง,, npm run start
ํ๋ ์๋ฅด๋ฅด ์์์ง๋ ์๋ฌ ๐จ
์๋.. ์ด๊ฒ ๋ฌด์จ์ผ์ด์กฐ ๐ญ๐ญ๐ญ
๊ฒ์์ ํด๋ณด๋ฉด์ ์ด๊ฒ์ ๊ฒ ์ค์ ์ฝ๋๋ฅผ ๋ฐ๊ฟ๋ณด๋ compile ์๋ฌ๋ ํด๊ฒฐํ๋ค! ํ์ง๋ง ์ ํ์ด ์ด๋ค ์ฝ๋๋ก ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค,,๐
โ .eslintrc
โ ์๋ก์ด ์ค์ ์ฝ๋๋ฅผ ์
๋ ฅ! (์ฃผ์ ์ฒ๋ฆฌํ ์ฝ๋๊ฐ ํ์ฑํ ๋์ด์์๋ ์๋ฌ๊ฐ ์๊ฒผ์์ต๋๋ค.)
// {
// "extends": ["react-app", "plugin:prettier/recommended"],
// "plugins": ["prettier"],
// "rules": {
// "prettier/prettier": "error"
// }
// }
{
"plugins": ["prettier"],
"extends": [
"prettier",
"prettier/@typescript-eslint"
// "plugin:@typescript-eslint/recommended",
]
}
โก .prettierrc
โ ์๋ ์ธ๊ฐ์ง๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
{
"tabWidth": 2,
"endOfLine": "lf",
"arrowParens": "avoid",
"singleQuote": true,
"semi": true,
"trailingComma": "all",
"printWidth": 80
}
โข eslint์ prettier๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ถํ์ํ๊ฑฐ๋ ์ถฉ๋ ์ํ์ด ์๋ eslint ์ค์ ์ ํด์ ํ๋ ๋ชจ๋์ ์ค์น!
$ npm install --save-dev eslint-config-prettier
โ ์ด๋ ๊ฒ ํด์ Failed to compile. ๋ ํด๊ฒฐํด์ npm run start
ํ๋ฉด ๋ก์ปฌ์๋ฒ๋ ์ด๋ฆฌ๊ณ , ํ๊ทธ๋ฃ์ด์ ํ๋ฉด์ ๋์๋ ์ ๋ณด์์ง๋ง.. ๊ณ์ ๋ชจ๋ js ํ์ผ์์ ์ฒซ๋ฒ์งธ ์ค import ๋ถ๋ถ๋ง ๋นจ๊ฐ์ค์ด ๊ทธ์ด์ง๋ ์๋ฌ๊ฐ ๋ํ๋ฌ๋ค..๐ญ
์๋ฌ์ ํค์๋๋ 'Parsing error: The keyword 'import' is reserved eslint' ๐ฅ
.eslintrc
ํ์ผ์ "parser": "babel-eslint"
ํ ์ค ์ถ๊ฐํ๋๋ ์๋ฌ๊ฐ ํด๊ฒฐ๋์๋ค ๐
๐ค๐ป ๋ฐ์ ์ ํ npm i babel-eslint --save-dev
๋ ์ํด์คฌ๋ค!
{
"plugins": ["prettier"],
"extends": [
"prettier",
"prettier/@typescript-eslint"
],
"parser": "babel-eslint"
}
{
"tabWidth": 2,
"endOfLine": "lf",
"arrowParens": "avoid",
"singleQuote": true,
"semi": true,
"trailingComma": "all",
"printWidth": 80
}
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"javascript.format.enable": false,
"prettier.eslintIntegration": true,
"prettier.disableLanguages": ["js"],
"eslint.alwaysShowStatus": true,
"files.autoSave": "onFocusChange"
}
prettier ์ค์ ๊ณผ ์ถฉ๋๋๋ eslint ๊ท์น์ ๋นํ์ฑํํด์ฃผ๋ ๋ช ๋ น
$ npm install --save-dev eslint-config-prettier
โจ ์๋ฌ๋ฅผ ํด๊ฒฐํ๋ฉด์ ๋์๋ฐ์ ๊ณณ
์ฐ๋ฆฌ PM๋ ์์ผ๋ฉด ๋ชป์ด์
ํ์ดํ ๐ฑ