아이콘과 전체적인 페이지 색감 등 테스트를 마쳤으니 바로 페이지를 완성하고싶지만,
경험상 Layout 구조를 만든 후 페이지를 구현하는 것이 재사용과 관리 측면에서 좋았어서
다음의 순서로 개발을 진행한다.
atoms: 단일 컴포넌트 (ex: 검색바, 검색 버튼)
molecules: atom의 묶음 (검색바 + 검색버튼)
organisms: molecule의 묶음 -> 구역 (검색창 구역)
templates: 컨텐츠가 채워지지 않은 skeleton
pages: 컨텐츠로 채워진 templates
하려는 것 : 우선 Basic Layout을 생성하려고 한다. Basic Layout은 랜딩페이지 및 다른 페이지에 쓰이는 기본 뼈대로, 헤더, 메뉴바, (가변 요소), 푸터 구조를 고정시켜둔다. 페이지마다 해당 레이아웃을 불러오고, 가변 요소만 다르게 하면 매번 페이지 제작시에 같은 컴포넌트를 불러와서 뼈대를 제작할 필요가 없어 재사용성을 높이고 코드 중복을 줄일 수 있다.
Layout을 제작 후, 가변 요소는 react-router-dom 패키지의 "Outlet"이라는 요소로 넣을 수 있다.
웹페이지 경로에 따른 보이는 화면 구현은 react-router-dom 패키지의 'BrowserRouter, Routes, Route'로 구현할 수 있다.
우선, react-router-dom을 설치한다.
npm i react-router-dom
//Layouts.tsx
import {Outlet} from 'react-router-dom;
import Header from 'components/molecules/Header';
import Menu from 'components/molecules/Menu';
import Footer from 'components/molecules/Footer';
export const Basic = () => {
return (
<>
<Header />
<Menu />
<Outlet /> (1)
<Footer />
</>
)
);
};
//root폴더의 index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import { ThemeProvider } from 'styled-components';
import { myTheme } from 'styles/theme/DefaultTheme';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<ThemeProvider theme={myTheme}>
<BrowserRouter> (1)
<App />
</BrowserRouter>
</ThemeProvider>
</React.StrictMode>
);
//App.tsx
import {Basic} from 'components/templates/Layouts';
import PATH from 'constants/routePath';
import LandingPage from 'pages/LandingPage';
function App() {
return (
<>
<div className='App'>
<Routes> (1)
<Route element={<Basic />}> (2)
<Route path={PATH.MAIN} element={<LandingPage />} /> (3)
</Route>
</Routes>
</div>
</>
);
}
export default App;
import Component from './Component';
가장 상위에서 import 구문을 사용해서 불러오는 방식.
앱의 빌드 타임에 '사용하지 않는 컴포넌트까지' 한꺼번에 로딩해 초기 렌더링 지연시간이 길어질 수 있다.
//App.tsx
import {Suspense, lazy} from 'react';
import { Routes, Route } from 'react-router-dom';
import { Basic } from 'components/templates/Layouts';
import PATH from 'constants/routePath';
import { LoadingBunny } from 'components/atoms/Loading';
import LandingPage from 'pages/LandingPage';를 다음과 같이 수정
const LandingPage = lazy(() => import('pages/LandingPage')); (2)
function App() {
return (
<>
<div className='App'>
<Suspense fallback={<LoadingBunny />}> (1)
<Routes>
<Route element={<Basic />}>
<Route path={PATH.MAIN} element={<LandingPage />} /> (2)
</Route>
</Routes>
</Suspense>
</div>
</>
);
}
export default App;