Learn Next.js 튜토리얼
https://nextjs.org/learn/dashboard-app/getting-started
Next.js 튜토리얼 - ch1 ~ 2. 프로젝트 기본 설정
프로젝트 받기
npm install -g pnpm // 패키지 매니저로 pnpm 설치해 사용. 더 빠르고 효율적임
npx create-next-app@latest nextjs-dashboard --example "https://github.com/vercel/next-learn/tree/main/dashboard/starter-example" --use-pnpm
// next 프로젝트 생성 명령어. --example 옵션 뒤에 기존 프로젝트의 깃허브 주소를 주어서 clone 해옴.
cd nextjs-dashboard // 생성된 프로젝트로 이동
프리티어 설정
pnpm install -D prettier prettier-plugin-tailwindcss // 프리티어, 프리티어+테일윈드 플러그인 설치
pnpm i // 프로젝트에 필요한 모든 의존성 패키지 설치
// .prettierrc
// 파일 생성 후 다음 내용을 저장.
{
"printWidth": 100,
"tabWidth": 2,
"trailingComma": "all",
"singleQuote": true,
"jsxSingleQuote": true,
"semi": false,
"plugins": ["prettier-plugin-tailwindcss"]
}
프리티어 설정은 입맛대로 할 수 있지만, 위와 같이 설정해주었다.
npx prettier . --write // 초기 한 번 적용. 이후 저장 시마다 프리티어 적용됨
package.json
다음은 package.json에 설정된 모든 의존성 이름 및 버전이다.
{
"private": true,
"scripts": {
"build": "next build",
"dev": "next dev --turbo",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@heroicons/react": "^2.1.4",
"@tailwindcss/forms": "^0.5.7",
"@vercel/postgres": "^0.8.0",
"autoprefixer": "10.4.19",
"bcrypt": "^5.1.1",
"clsx": "^2.1.1",
"next": "15.0.3-canary.7",
"next-auth": "5.0.0-beta.19",
"postcss": "8.4.38",
"react": "19.0.0-rc-cd22717c-20241013",
"react-dom": "19.0.0-rc-cd22717c-20241013",
"tailwindcss": "3.4.4",
"typescript": "5.5.2",
"use-debounce": "^10.0.4",
"zod": "^3.23.8"
},
"devDependencies": {
"@types/bcrypt": "^5.0.2",
"@types/node": "20.14.8",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
"eslint": "^9",
"eslint-config-next": "15.0.3",
"prettier": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.8"
},
"pnpm": {
"overrides": {
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
}
}
}
개발 서버 구동
pnpm dev
CSS Styling
Global Style
/app/ui 디렉토리 하위에 global.css
라는 전역 css 파일이 존재한다. 이 css는 애플리케이션 전역에 적용될 수 있다.
애플리케이션의 어떤 컴포넌트에서든 해당 파일을 import할 수 있지만, 가능한 상위 컴포넌트에서 import하는 것이 추천된다.
// /app/layout.tsx에 global css 파일 import
import '@/app/ui/global.css';
global.css 파일에는 @tailwind 지시문들이 포함되어 있다. 이를 통해 tailwind css를 전역적으로 사용할 수 있다.
@import 'tailwindcss/base'; // 테일윈드 기본 스타일
@import 'tailwindcss/components'; // 테일윈드 컴포넌트 스타일
@import 'tailwindcss/utilities'; // 테일윈드 유틸리티 클래스
CSS Module
css module을 사용하여 css 충돌을 방지하고 고유한 css 스타일을 적용할 수 있다.
css module들은 먼저 /app/ui 하위에서 파일명.module.css 라는 명명 규칙으로 만들 수 있다.
모듈 파일 내부에서 클래스명에 대한 스타일들을 설정하게 되는데, 만약 서로 다른 모듈 안에 있는 클래스명이 동일하더라도 충돌이 발생하지 않는다. 이는 css module 사용 시 모듈 내 클래스명들이 충돌을 방지하도록 자동으로 고유화되기 때문이다.
[파일명]__[클래스명]__[랜덤 해시]와 같은 식으로 고유화 되기 때문에, 스타일이 다른 컴포넌트와 겹치지 않도록 보장할 수 있다.
import AcmeLogo from '@/app/ui/acme-logo';
import { ArrowRightIcon } from '@heroicons/react/24/outline';
import Link from 'next/link';
import styles from '@/app/ui/home.module.css';
export default function Page() {
return (
<main className="flex min-h-screen flex-col p-6">
<div className={styles.shape} />
// ...
)
}
위 코드에서 '@/app/ui/home.module.css'에 있는 css module을 styles라는 이름으로 받아와서, css module 내부에 있는 스타일에 .을 사용하여 필드처럼 접근하고 있다.
clsx 라이브러리
여러 클래스를 동적으로 적용하고 싶은 경우에, clsx 라이브러리
를 사용할 수 있다.
여러 클래스명들을 콤마로 이어서 추가 가능하며, 참(자바스크립트의 not falsy value)일 경우에만 클래스명을 추가한다.
import clsx from 'clsx';
export default function InvoiceStatus({ status }: { status: string }) {
return (
<span
className={clsx(
'inline-flex items-center rounded-full px-2 py-1 text-sm',
{
'bg-gray-100 text-gray-500': status === 'pending',
'bg-green-500 text-white': status === 'paid',
},
)}
>
// ...
)}
위 코드에서는 clsx 라이브러리
를 사용해 status에 따라서 동적으로 class를 추가하고 있다.
객체 형식인 경우에는, key에 대한 value가 참일 경우 key를 적용한다.
'Next.js' 카테고리의 다른 글
Next.js 튜토리얼 - ch5. 페이지 간 네비게이팅 (1) | 2024.11.18 |
---|---|
Next.js 튜토리얼 - ch4. 레이아웃과 페이지 생성하기 (0) | 2024.11.18 |
Next.js 튜토리얼 - ch3. 폰트 및 이미지 최적화 (1) | 2024.11.18 |