❗ [Slack 클론 코딩] 을 보며 빠루게 정리 중...
사전에 제로초님께 허락 받고 포스팅함.
설정 관련은 나중에 정리
pages
└ Login
└ index.tsx
└ style.tsx
└ SignUp
└ ...
components
layouts
hooks
utils
파일 import 시 절대 경로를 사용하기 위해 미리 alias 설정 하기
import * from './layouts/App' 이걸 '@layouts/App' 이렇게 사용하도록 만들어줌
보통 '@' 나 '~' 을 붙임
webpack.config.ts :
alias: {
'@hooks': path.resolve(__dirname, 'hooks'),
'@components': path.resolve(__dirname, 'components'),
'@layouts': path.resolve(__dirname, 'layouts'),
'@pages': path.resolve(__dirname, 'pages'),
'@utils': path.resolve(__dirname, 'utils'),
'@typings': path.resolve(__dirname, 'typings'),
},
tsconfig.json :
"baseUrl": ".",
"paths": {
"@hooks/*": ["hooks/*"],
"@components/*": ["components/*"],
"@layouts/*": ["layouts/*"],
"@pages/*": ["pages/*"],
"@utils/*": ["utils/*"],
"@typings/*": ["typings/*"]
}
npm i react-router react-router-dom
npm i -D @types/react-router @types/react-router-dom // typescript 용
import { Switch, Route, Redirect} from 'react-router-dom';
clients.tsx :
import React from 'react';
import {render} from 'react-dom';
import App from './layouts/App';
import { BrowserRouter } from "react-router-dom";
render(<BrowserRouter><App /></BrowserRouter>, document.querySelector('#app'));
App.tsx :
import React from 'react';
import { Switch, Route, Redirect} from 'react-router-dom';
import Login from '@pages/Login';
import SignUp from '@pages/SignUp';
const App: FC = () => { // FC -> Functional Component
return (
<Switch>
<Redirect exact path="/" to="/login"/>
<Route path="/login" component={Login} />
<Route path="/signup" component={SignUp} />
</Switch>
);
};
export default App;
SPA 에서 사용하는 uri는 history API 를 통해 가짜 주소처럼 등록해서 사용함. 새로고침 하면 server에서 읽어들인 주소로 이동시키는데 서버는 base 주소인 "/" 밖에 없는 것! 그래서 가짜 주소 사용할 수 있게 historyApiFallback
속성을 이용한다.
webpack.config.ts :
devServer: {
historyApiFallback: true, // react router
},
SPA 의 특성 상, 코드 전체를 불러들이면 lazy-load 가 일어남. 불필요한 리소스 방지를 위해 코드를 잘게 분할하여 현재 필요로 하는 것만 불러들인다.
npm i @loadable/component
npm i --save-dev @types/loadable__component
Suspense
라는 것을 이용해 스플리팅 하는 데 용이하게 처리 (실험 단계이나 사용 잘하는 지는 의문...)loadable()
로 감싸서 적용// App.tsx
const Login = loadable(()=> import('@pages/Login'));
const SignUp = loadable(()=> import('@pages/SignUp'));
npm i @emotion/react @emotion/styled
styled.
뒤에 특정 태그 이름을 붙이면 컴포넌트 불러올 때 해당 태그로 인식하여 스타일을 입힐 수 있음.
페이지 컴포넌트와 동일한 이름으로 export 시키면 미리 style이 선언된 상태로 출력
style.tsx :
import styled from '@emotion/styled';
export const Header = styled.header` // header태그로 인식
text-align: center;
font-family: Slack-Larsseit, Helvetica Neue, Helvetica, Segoe UI, Tahoma, Arial, sans-serif;
font-weight: 700;
font-size: 48px;
line-height: 46px;
letter-spacing: -0.75px;
margin-top: 50px;
margin-bottom: 50px;
`;
export const Form = styled.form`
margin: 0 auto;
width: 400px;
max-width: 400px;
`;
export const Label = styled.label`
margin-bottom: 16px;
& > span {
display: block;
text-align: left;
padding-bottom: 8px;
font-size: 15px;
cursor: pointer;
line-height: 1.46666667;
font-weight: 700;
}
`;
// 이런식으로 불러와서 사용 ...
index.tsx :
import {Form, Label, Input, Button, LinkContainer} from "./styles";