티스토리 뷰

Next.js는 React의 서버 사이드 렌더링(SSR)을 쉽게 하도록 도와주는 프레임워크입니다. React는 기본적으로 클라이언트 사이드 렌더링(CSR)입니다. CSR은 한 페이지만 화면에 띄웁니다. 그 후 사용자의 요청에 따라 필요한 부분만 다시 렌더링 합니다. 하지만 모든 정보를 처음에 다 불러오기 때문에 초기 로딩 시간이 길어집니다.
SSR은 서버에서 필요한 페이지를 완성한 후 이를 브라우저에 보냅니다. 처음 렌더링 된 html만 브라우저에 보내기 때문에 초기 로딩 시간이 짧습니다. 하지만 페이지를 요청할 때마다 정보를 다시 불러 와서, 사용자가 페이지를 이동하는 시간은 더 오래 걸립니다.
# 설치, 실행
npm install next
npx create-next-app
1️⃣ Router 비교
React Router
React는 React Router를 사용하여 SSR을 구현할 수 있습니다.
React Router: Declarative Routing for React
Learn once, Route Anywhere
reactrouter.com
React Router를 설치합니다.
npm install react-router-dom
페이지를 이동할 수 있게 navigation을 만들어 봅시다.
// App.js
import { Route, Router } from "react-router-dom";
import About from "./routes/About";
import Home from "./routes/Home";
function App() {
return (
<Router>
<div className="navigation">
<Link to="/">Home</Link>
<Link to="/about">About</Link>
</div>
<Route path="/" exact={true} component={Home} />
<Route path="/about" component={About} />
</Router>
);
}
export default App;
기존 html과 다른 점은 a 태그 대신 Link를 사용합니다. 주소를 href가 아니라 to로 연결합니다. 그 다음 페이지로 사용할 component를 Router 안에 Route로 넣어줍니다.
Next의 Nested Routes
Next는 pages 폴더 안에 페이지 파일을 생성하면 자동으로 route를 사용합니다. 즉 위에서 App.js의 Router를 만들지 않아도 됩니다.
// Next.js
import Link from 'next/link'
export default function App() {
return (
<>
<Link href="/">
<a>Home</a>
</Link>
<Link href="/about">
<a>About</a>
</Link>
</>
)
}
이때 to가 아니라 href를 사용하고, Link 안에 문자열이 아니라 element나 component를 넣어야 합니다.
2️⃣ Layouts
네비게이션바 처럼 여러 페이지에서 중복으로 사용되는 component를 매번 다시 써주는 건 비효율적입니다. Layout은 이런 반복적인 노동을 줄여줍니다. Layout component를 아래처럼 만듭니다.
import Navbar from './navbar'
import Footer from './footer'
export default function Layout({ children }) {
return (
<>
<Navbar />
<main>{children}</main>
<Footer />
</>
)
}
// 출처: next 공식 문서
그 다음 저 layout이 필요한 페이지를 Layout 태그로 감싸면 됩니다. 모든 페이지에 사용할 거면 _app.js에 Layout을 추가합니다. Layout이 사용된 페이지는 위의 코드처럼 Navbar, main, Footer가 공통으로 들어가게 됩니다.
import Layout from '../components/layout'
export default function MyApp({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
)
}
// 출처: next 공식 문서
3️⃣ Data Fetching
Next.js에서 데이터를 가져올 때는 getStaticProps를 사용합니다. React에서 componentDidMount로 데이터를 가져오는 과정과 비슷합니다.
export async function getStaticProps(context) {
return {
props: {}, // will be passed to the page component as props
}
}
// 출처: next 공식 문서
getStaticProps는 데이터를 가져오고 싶은 component 안에서 사용하면 됩니다.
export default function Home({ movies }) {
return (
<ul>
{movies.map((movie) => (
<li>{movie.title}</li>
))}
</ul>
)
export async function getStaticProps(context) {
const res = await fetch('https://.../movies')
const movies = await res.json()
return {
props: { movies }, // props로 movies 전달
}
}
}
4️⃣ CSS
CSS Modules
npx create-next-app을 하면 styles 폴더가 생성됩니다. 이 안에는 globals.css와 Home.module.css가 있는데요, global은 말 그대로 body, html, a 등 전체적으로 적용할 스타일이 설정되어 있습니다. Home.module은 index.js에 있는 Home에 적용되는 스타일입니다.
Next.js는 CSS Modules을 제공합니다. CSS Modules는 파일 별로 고유한 className을 사용할 수 있어서, 파일만 다르면 같은 className을 사용해도 됩니다. style이 필요한 page나 component 이름을 포함한 [name].module.css 파일을 만들고 import해서 사용합니다.
/* components/Button.modules.css */
.red {
color: white;
background-color: red;
}
// components/Button.js
// styles로 import한 css를 className으로 전달
import styles from './Button.module.css'
export function Button() {
return (
<button
type="button"
className={styles.red}
>
Destroy
</button>
)
}
styled-jsx
js 파일 안에 css를 작성하고 싶다면 React에서 사용하는 일반적인 방법이나 styled-jsx를 사용합니다.
// 일반적인 방법
export default function Example() {
return <p style={{ color: 'red' }}>Hello Next.js</p>
}
// styled-jsx
export default function Example() {
return (
<div>
<p>Hello, Next.js</p>
<style jsx>{`
p {
color: red;
}
div {
background: blue;
}
`}</style>
<style global jsx>{`
body {
background: black;
}
`}</style>
</div>
)
}
styled-components와 비슷합니다. return하는 jsx 마지막에 <styled jsx></style>로 감싸서 작성합니다. 글로벌 스타일은 <style global jsx>를 사용합니다. 더 자세한 사용법은 아래를 참고하세요↓↓
GitHub - vercel/styled-jsx: Full CSS support for JSX without compromises
Full CSS support for JSX without compromises. Contribute to vercel/styled-jsx development by creating an account on GitHub.
github.com
거의 대부분의 내용은 공식문서를 참고했습니다. 처음 사용해보는 거라 아직 혼란스러운데.. 역시 처음 시작할 땐 공식문서를 차분히 읽는 습관이 필요한 거 같습니다. 앞으로도 계속 새로운 걸 찾고 스스로 공부해야 할 테니까요😂
[참고 자료]
Getting Started | Next.js
Get started with Next.js in the official documentation, and learn more about all our features!
nextjs.org
Next.js 제대로 알고 쓰자
Next.js는 React의 SSR(Server Side Rendering)을 쉽게 구현할 수 있게 도와주는 간단한 프레임워크입니다. React도 SSR을 고려하여 설계되었기 때문에 자체적으로도 구현이 가능하긴 하지만, 개발환경을 만
medium.com
서버사이드 렌더링(ssr) & 클라이언트 사이드 렌더링(csr)
렌더링 이란 요청받은 내용을 브라우저에 화면에 표시하는 것이다.Loader 가 서버로 부터 정보들을 불러옴파싱을 통해 문서를 DOM 트리로 만든다.DOM 트리가 구축되는 동안 브라우저는 렌더 트리를
velog.io
'✍ 기록' 카테고리의 다른 글
[React.js] life-cycle 고려해서 useEffect 사용하기 (0) | 2022.07.04 |
---|---|
Spotify에서 플레이리스트 위젯 + Unsplash에서 랜덤 이미지 가져오기 (0) | 2021.12.30 |
React 개념 알기(JSX, Component, State, Props, Hook) - 원스탑 튜터링 3주차 (0) | 2021.09.16 |
코린이를 위한 개발 Tip + 웹 개발 - 원스탑 튜터링 2주차 (0) | 2021.09.09 |
DOM 사용하기 - 원스탑 튜터링 2주차 (0) | 2021.09.09 |
- Total
- Today
- Yesterday
- rn
- 프로그래머스
- 코드분석
- React
- fetch
- 문제풀이
- Unsplash
- 코어자바스크립트
- 다이나믹프로그래밍
- 비동기
- DP
- 백트래킹
- node.js
- nodeJS
- dfs
- 코테
- 알고리즘
- React-native
- React.js
- 백준
- flutter
- javascript
- Python3
- 파이썬
- python
- Spotify
- p5js
- backtracking
- 코딩테스트
- 이벤트루프
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |