next/font
모듈을 사용할 때, 애플리케이션의 폰트를 자동으로 최적화한다.
/app/ui
디렉터리 내에, font.ts
라는 파일을 만든다. 해당 파일을 통해, 애플리케이션 전체에서 사용될 폰트를 유지할 수 있다.
import { Inter } from "next/font/google";
{/* Inter 모듈에서, 폰트 불러오기 */}
export const inter = Inter({ subsets: ["latin"] });
/app/layout.tsx
에서, font.ts
에서 export한 inter
폰트를 body
태그에 적용한다.<body>
태그에 추가 작성된 antialiased
는 폰트를 부드럽게 만들어주는 Tailwind className이다.import "@/app/ui/global.css";
import { inter } from "./ui/font";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
{/* 여기! */}
<body className={`${inter.className} antialiased`}>{children}</body>
</html>
);
}
/public
디렉터리 내 최상위 위치에서 제공한다.public
디렉터리 내에 hero-desktop.png
와 hero-mobile.png
두 개의 이미지가 존재할 것이다. 이는 사용자의 기기가 데스크탑인지 모바일인지에 따라 토글 방식으로 표시된다./app/page.tsx
에 예시로 일반 HTML을 작성해보았을 때, 아래와 같이 이미지를 추가할 수 있다.import AcmeLogo from '@/app/ui/acme-logo';
import { ArrowRightIcon } from '@heroicons/react/24/outline';
import { lusitana } from '@/app/ui/fonts';
export default function Page() {
return (
// ...
<div className="flex items-center justify-center p-6 md:w-3/5 md:px-28 md:py-12">
{/* Add Hero Images Here */}
<img
src="/hero.png"
alt="Screenshots of the dashboard project showing desktop and mobile versions"
/>
</div>
//..
);
}
<Image>
컴포넌트는 HTML의 <img>
태그의 확장기능을 제공하며, 아래의 자동 이미지 최적화 기능을 제공한다.
/app/page.tsx
에서 일반적인 HTML의 <img>
태그로 작성했던 코드를 변경해보자.<Image>
컴포넌트를 사용한 코드이다.<Image>
컴포넌트는 이미지의 너비값과 높이값을 필수로 요구한다.import AcmeLogo from "@/app/ui/acme-logo";
import Link from "next/link";
import clsx from "clsx";
import Image from "next/image";
export default function Page() {
return (
<main className="flex min-h-screen flex-col p-6">
<div className="flex h-20 shrink-0 items-end rounded-lg bg-blue-500 p-4 md:h-52">
{/* <AcmeLogo /> */}
</div>
<div className="mt-4 flex grow flex-col gap-4 md:flex-row">
<div className="flex flex-col justify-center gap-6 rounded-lg bg-gray-50 px-6 py-10 md:w-2/5 md:px-20">
<p className={`text-xl text-gray-800 md:text-3xl md:leading-normal`}>
<strong>Welcome to Acme.</strong> This is the example for the
<a href="https://nextjs.org/learn/" className="text-blue-500">
Next.js Learn Course
</a>
, brought to you by Vercel.
</p>
<Link
href="/login"
className="flex items-center gap-5 self-start rounded-lg bg-blue-500 px-6 py-3 text-sm font-medium text-white transition-colors hover:bg-blue-400 md:text-base"
>
<span>Log in</span>
</Link>
</div>
<div className="flex items-center justify-center p-6 md:w-3/5 md:px-28 md:py-12">
{/* Add Hero Images Here */}
<Image
src="/hero-desktop.png"
{/* 레이아웃 변화 방지를 위한 너비/높이 설정 */}
width={1000}
height={760}
{/* 모바일 환경에서는 해당 이미지 hidden */}
className="hidden md:block"
alt="Screenshots of the dashboard project showing desktop and mobile versions"
/>
<Image
src="/hero-mobile.png"
width={560}
height={620}
{/* 데스크탑 환경에서는 해당 이미지 hidden */}
className="block md:hidden"
alt="Screenshot of the dashboard project showing mobile version"
/>
</div>
</div>
</main>
);
}