This is React-based code that can be quickly generated.
MIT License
This is React-based code that can be quickly generated.
빠르게 리액트 환경을 구축할 수 있는 템플릿입니다.
CSS in JS : styled-components를 사용하여 간편하게 컴포넌트 별로 스타일을 적용할 수 있습니다.
Redux-toolkit : 상태관리를 효율적으로 하기 위해서 Store 구조를 사용합니다. 또한 개발속도를 향상시키기 위해서, 각 Reducer들은 Slice로 작성되었습니다.
Redux-thunk : 미들웨어로 redux-thunk를 적용하였습니다.
Build: yarn build
를 통해서 작성한 코드들을 production mode로 빌드할 수 있습니다. 본 템플릿에서는 다음과 같은 과정을 빌드가 진행됩니다.
yarn install // 필요 패키지를 설치합니다.
yarn start // HMR(Hot Module Replacement)이 가능한 개발 서버를 실행합니다.(기본포트:3000)
yarn test // .test.js로 끝나는 파일을 대상으로 테스트를 진행합니다.
yarn build // 작성한 코드를 대상으로 빌드과정을 진행합니다.
Simple-React-Template
│
│ .env
│ .gitingnore
│ jsconfig.json
│ package-lock.json
│ yarn.lock
│ package.json
│
├─public
│ │ index.html
│ │ manifest.json
│ │ robots.txt
│ ├─css
│ ├─favicons
│ ├─fonts
│ ├─icons
│ └─images
│
└─src
│ App.js
│ index.js
│ serviceWorker.js
│ setupTests.js
│ testUtils.js
│
├─components
│ ├─home
│ │
│ └─modal
│ └─info
│ └─common
│ Snackbar.js
│
├─containers
│ Home.js
│ └─modal
│ index.js
│ Info.js
│ └─common
│ Snackbar.js
| Modal.js
│
├─controllers
│ fetch.js
│
├─lib
│ └─styles
│ animations.js
│ media.js
│ palette.js
│ styles.js
│ zIndex.js
│ └─utils
│ └─hooks
│ └─svg
| └─index.js
│
├─slices
│ │ index.js
│ │ modal.js
│ │ snackbar.js
│ │
│ └─__test__
│ modal.test.js
│ snackbar.test.js
│
└─pages
HomePage.js
NotFound.js
Public : 정적 자원를 저장하는 폴더입니다. 필요한 favicons 들과 이미지들이 존재합니다.
package.json : 해당 프로젝트의 이름과 버전 및 프로젝트 정보들을 수정 및 확인할 수 있습니다.
이 외에도 proxy를 설정하여 개발을 진행할 때, 개발 서버를 대상을 API를 호출할 수 있습니다.
```json
"proxy": "http://localhost:5000"
jsconfig.json : 해당 프로젝트에서의 컴파일러 옵션 등을 설정할 수 있습니다. (현재 설정은 src를 기준으로 절대경로가 설정되었습니다. 아래 스크립트와 같이 사용할 수 있습니다.)
import Component from "components/path/Component";
// src/components/path/Component
.env: 해당 프로젝트 실행에 필요한 환경변수는 해당 파일에서 추가 및 수정할 수 있습니다.
components : View를 담당하는 컴포넌트들을 저장하는 폴더입니다.
containers : View에 관련한 로직들을 담당하는 컴포넌트들을 저장하는 폴더입니다.
controllers : API들을 저장하는 폴더입니다.
lib : 프로젝트에 필요한 추가 모듈들을 저장하는 폴더입니다.
- **hooks** : 공통 hook에 대해서 모아둔 폴더입니다.
slices : Reducer들을 저장하는 폴더입니다.
pages : 각 페이지를 저장하는 폴더입니다.
** test ** : (test와 __ 사이의 공백은 없습니다.) 각 컴포넌트, 모듈의 테스트 코드를 저장하는 폴더입니다.
개발 속도를 향상시키기 위해서 필수적이라 생각하는 기능 및 파일들이 존재합니다.
Internet Explorer 브라우저일 경우에는 리다이렉트 페이지가 표시되도록 구현되어 있습니다. 만약 IE를 대상으로 구현하는 프로젝트일 경우 index.html 파일의 다음 코드를 지워주시길 바랍니다.
// index.html
<script>
if (/MSIE \d|Trident.*rv:/.test(navigator.userAgent)) {
window.location = "microsoft-edge:" + window.location;
setTimeout(function () {
window.location = "https://go.microsoft.com/fwlink/?linkid=2135547";
}, 0);
}
</script>
기존의 v1.2.3에서는 modal을 보여주는 과정에서 React Component를 넘기게 되어서 직렬화가 안 되는 문제가 있었습니다. 이번 패치에서는 해당 문제를 해결해
redux-devtool
의 시간여행 기능을 안정적으로 사용할 수 있습니다.
기본적으로 모달이 작동하는 파일이 포함되어 있습니다. 본 모달은 Redux를 사용하여 작동합니다. (해당 방식의 사용은 선택사항입니다.)
모달 reducer에는 기본적으로 다음과 같은 액션이 존재합니다.
파일은 containers/modal/Info.js
이며, 해당 모달을 부르고 싶은 컴포넌트에서 해당 파일명을 dispatch하여 사용하게 됩니다.그 후, modal module에 존재하는 pushModal
액션을 사용하여 모달을 작동시킵니다. 각 모달은 반드시 name
에 Modal Component 명을 넣어서 호출해야 합니다. 만약 name값이 존재하지 않다면 해당 모달은 정상적으로 작동하지 않을 것입니다. 아래는 모달을 호출하는 예시입니다.
// containers/modal/Info.js
export const Info = ({ PreventModalOff, ModalOff, args }) => {
...
return (
...
);
}
// containers/modal/index.js
export { Info } from "containers/modal/Info";
// components/home/Btn.js
const Btn = () => {
const dispatch = useDispatch();
const modalOn = () =>
dispatch(
pushModal({
name: "Info",
args: { title: "Simple" },
})
);
return <Button onClick={modalOn}>Simple</Button>;
};
containers/modal/index.js
에 등록된 모달 파일에서는 PreventModalOff
와 ModalOff
및 args
인자가 기본적으로 제공됩니다. PreventModalOff
함수는 onMouseDown
속성으로 모달 최상위 속성에 등록해주시길 바랍니다. ModalOff
는 선택적 사항입니다. args
는 모달을 호출하는 컴포넌트에서 모달에게 매개변수를 전달할 수 있습니다. 기본적으로 Background에 MouseDown 이벤트로 모달이 닫히도록 작동됩니다. 이 외에 버튼을 통해서 모달을 닫는 경우, 해당 함수를 사용해주시길 바랍니다.
기본적으로 사용자에게 보다 나은 Alert 표시를 위해서 Snackbar 구조가 포함되어 있습니다. 본 스낵바는 Redux를 사용하여 작동합니다. (해당 방식의 사용은 선택사항입니다.)
기본적으로 스낵바 타입은 다음과 같습니다.
스낵바를 호출하는 방식은 아래 예시를 참고하십시오.
/* This file is Sample Component to call a snackbar. */
import React from "react";
import { useDispatch } from "react-redux";
import Button from "components/path/Button";
import { newSnackbar } from "modules/snackbar";
const Btn = () => {
const dispatch = useDispatch();
const onSnackbar = () => {
dispatch(
newSnackbar({
type: "INFO",
message: "테스트 문구",
})
);
};
return <Button onClick={onSnackbar}>Snackbar</Button>;
};
export default Btn;
기본적으로 비동기 통신을 위해서 fetch API가 사용됩니다. 해당 파일에서는 API를 쉽게 사용할 수 있도록 작성되었습니다. (본 파일 사용유무는 선택사항입니다. 사용하지 않으면 지워주시길 바랍니다.)
const Fetch = (url, method, sendData, callback, failed) => { ... };
기본적으로 해당 모듈은 다음과 같은 인자를 필요로 합니다.
/board/1/post/3
POST
, GET
, DELETE
, PUT
, PATCH
등이 존재합니다.headers값의 Accept 속성에 'application/json' 을 적용하여, Backend로부터 송신되는 API별 에러 메세지를 확인할 수 있도록 하였습니다.
해당 모듈은 Promise 객체를 반환합니다. 아래와 같이 사용 가능합니다.
import Fetch from "./fetch";
Promise.all([
Fetch("/api/first", "POST", { key: "value" }),
Fetch("/api/second", "POST", { key: "value" }),
Fetch("/api/third", "POST", { key: "value" }),
]);
// or
Fetch("/api/first", "GET")
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err);
});
// or
Fetch(
"/api/first",
"POST",
{ key: "value" },
(data) => {
console.log(data);
},
(err) => {
console.log(err);
}
);
해당 기능은 보일러 플레이트라는 목적에 맞게 코드에서 제거하였습니다. 대신
Fetch
파일을 수정하여 얼마든지 추가 사용자 유효성 검증을 진행할 수 있습니다.
기본적으로 JWT Token을 받는다의 가정하에 작성되었습니다. Token을 보내는 곳은 fetch.js 파일에서 상단에 WebStorage에서 token을 가져오게 됩니다. 이 방식을 사용하려면 Client에서 받는 모든 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 합니다. 만약 그럼에도 XSS 공격에 대해서 원천 차단하기 위해서는 WebStorage에는 민감한 정보를 저장하지 않는 것이 좋습니다. 대안으로 HttpOnly
와 Secure
속성을 적용시킨 Cookie를 사용하는 것이 있습니다. 만약 Cookie 방식으로 Authorization을 진행한다면 위 fetch.js
파일에서 WebStorage와 관련된 코드를 수정하면 됩니다.
// fetch.js
const Fetch = (url, method, sendData, callback, failed) => {
const headers = {};
...
/*
write here custom header properties.
*/
...
}
피드백 및 이슈 제기 는 언제나 환영입니다. 필요한 기능이거나 불필요한 기능이라고 생각된다면, 언제든지 Issue로 남겨주시길 바랍니다.