해당 프로젝트는 "OpenSea Clone Project"로 간단한 기능구현과 스타일일링 되었습니다.
Client
Server
Database
Deploy
"dependencies": {
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^6.3.0",
"react-scripts": "4.0.3",
"web3": "^1.7.3"
},
"devDependencies": {
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"prettier": "^2.6.2"
}
프로젝트를 함께 개발하다보면 각기 다른 환경과 코딩 습관을 가지고 있기 때문에 협업을 위해서 eslint와 prettier를 사용하였다.
esLint는 주로 에러가 나는 코드를 찾아주고 규칙에 따라 코드를 일괄되게 사용할 수 있도록 해준다. prettier은 코드가 가독성 좋게 보여질 수 있도록 강제적으로 코드를 변경한다.
이 프로젝트에서는 Create-react-app을 사용했기 때문에 이미 eslint가 설치되어있다.
$ npm i -D prettier
$ npm i -D eslint-config-prettier eslint-plugin-prettier
.eslintrc.js
module.exports = {
env: {
browser: true,
node: true,
},
plugins: ['prettier'],
extends: ['react-app', 'eslint:recommended', 'plugin:prettier/recommended'],
rules: {
'prettier/prettier': 'error',
},
};
.prettierrc
{
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}
VSCode 설정(윈도우, 리눅스에서는 Ctrl + , 맥에서는 Cmd + ,)으로 들어간다.
User와 Workspace 항목있는데 User는 VSCode 자체 설정으로 모든 프로젝트에 적용이 되고, Workspace는 현재 프로젝트에서만 설정이 적용되며, .vscode/settings.json
에 설정 항목이 저장된다.
{
// Set the default
"editor.formatOnSave": false, // true : 저장시 포맷이 자동으로 변경
// Enable per-language
"[javascript]": {
"editor.formatOnSave": true
},
"editor.codeActionsOnSave": {
// For ESLint
"source.fixAll.eslint": true
}
}
Ref
ESLint 규칙
Prettier 옵션
ESLint, Prettier 적용하기
create-react-app
으로 기본 환경을 셋팅했다.
이 과정에서 create-react-app
이 React 버전이 18로 업그레이드 되면서 webpack5를 적용하게 되어서 다른 패키지들과 호환이 안되는 이슈가 발생했다.
이를 해결하는 방안으로 2가지를 생각했다.
방법 1
Webpack5를 그대로 유지하면서 호환이 안되는 것들을 호환이 가능하도록 해주는 패키지들(polyfill)을 설치해서 셋팅한다.
//polyfill
"assert": "^2.0.0",
"crypto": "^1.0.1",
"crypto-browserify": "^3.12.0",
"http": "0.0.1-security",
"https": "^1.0.0",
"https-browserify": "^1.0.0",
"os-browserify": "^0.3.0",
"stream": "0.0.2",
"stream-http": "^3.2.0",
"url": "^0.11.0"
방법 2
react-scripts 버젼을 5.0.0에서 4.0.3으로 하고 react(v17.0.2), react-dom(17.0.2) 버젼을 낮추어 셋팅한다.
선택된 방법
안정성을 생각해서 "방법2"를 선택했다. webpack5 호환이 안되는 패키지가 많으면 그만큼 많은 폴리필 패키지를 설치해야하기 때문에 기능도 무거워지고 사용하지 못하는것들도 있지 않으까 하는 생각에 이전에 사용하던 버젼으로 선택하게 되었다.
사실 webpack.config.js를 사용해서 구현도 가능하지만 제한된 시간에 구현이 어려울꺼 같아서 선택하지 않았지만 추후에 구성해봐야겠다.
셋팅 방법
node-modules와 package-lock.json 파일 삭제 후 아래 처럼 파일 코드를 변경한다.
// 변경 전
[
"dependencies": {
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^12.1.4",
"@testing-library/user-event": "^13.5.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-router-dom": "^6.3.0",
"react-scripts": "5.0.0",
"web-vitals": "^2.1.4",
"web3": "^1.7.3"
},
// 변경 후
"dependencies": {
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^6.3.0",
"react-scripts": "4.0.3",
"web-vitals": "^2.1.4",
"web3": "^1.7.3"
},
// 변경 전
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// 변경 후
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();