기존에 next12로 만들었던 포트폴리오 사이트를 next13으로 마이그레이션 해봤다
마이그레이션 하게 된 계기는,
연습삼아 개인 포트폴리오 프로젝트를 next13으로 마이그레이션 해보았다!
pages 디렉토리 제거하고 app 디렉토리 적용하기!
styled-components
였는데, app폴더로 마이그레이션 하니 스타일이 깨졌다.. 그래서 강제로 사용해본..컴포넌트를 더 쪼개자!
Best Practices
성능 개선 필요?!
요렇게 이미지가 길쭉하게 보여지면서 발생하는 이슈..
app/page.tsx
이전 버전의_app.tsx
역할app/layout.tsx
공통 레이아웃을 잡을 수 있으며,_document.ts
의 역할
page.tsx
: 기본적인 UI 골격을 만든다index.tsx
같은 너낌?!layout.tsx
: 재사용 가능한 기본적인 UI 골격을 만든다. 상태를 계속 기억하고 유지하는 특징이 있다template.tsx
: layout.tsx
과 비슷하지만 내부 상태를 기억하진 않는다. template.tsx
를 이용해서 계속 새로운 인스턴스를 만들순 있지만 각각의 인스턴스는 상태를 공유할 수 없다()
로 표현한 폴더명 하위에 두 개의 경로(about, blog)가 존재하는데 이는 about, blog를 marketing과 관련된 그룹으로 묶어주는 것()
로 표현한 폴더명은 컨셉적으로 하위의 경로를 그룹핑 하기 위해 만들어진 것이고 실제로 routing에는 영향을 주지 않는다()
로 표현한 폴더명은 url에 포함되지 않고 코드상으로 하위의 url을 정리하기 위한 용도로 사용된다notFound
라는 함수를 호출하면 그 경로안에 있는 not-found.tsx
의 UI를 보여준다최신 버전의 큰 차이점!!
server component
는 서버에서 실행된다node 환경
에서 제공하는 node api
사용 가능상태
관련된 것은 사용할 수 없다useState()
, useEffect()
등useEffect
등을 사용하면 에러가 발생한다'use client'
라고 명시해주면 클라이언트 컴포넌트로 작동한다useEffect
등이 필요한 컴포넌트를 만들어 해당 부분만 클라이언트 컴포넌트로 적용시키면 된다이전 회사에서 tailwind를 사용해 본 경험이 있는데 그 때의 기억은 부정적이었지만, 이번에 사용해보고 나서 긍정적인 경험으로 변했다!
이유는? 두 번 사용해보니 익숙하졌달까..!
styled-components
로 스타일링을 했었는데, next13의 app 폴더로 마이그레이션 하면서 스타일이 깨졌다..😱tailwind
로도 마이그레이션했다..styled-components
가 들어가는 모든 파일에 use client
라고 명시하면 해결되지만tailwind의 좋은 점은 기본적인 색상표, 애니메이션을 지원해준다는 것!
하지만! 커스텀이 필요할 때도 있다! 그런 경우tailwind.config.js
에 적용하고 사용하면 된다!
// tailwind.config.js 예시
/** @type {import('tailwindcss').Config} */
import defaultTheme from 'tailwindcss/defaultTheme'
module.exports = {
mode: 'jit', // calc 사용하기 위해!
content: [
'./app/**/*.{js,ts,jsx,tsx,mdx}',
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
// Or if using `src` directory:
'./src/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
extend: {
colors: { // 커스텀 색상
common: {
white: '#ffffff',
black: '#000000',
...
},
compo: {
primary: '#fbb0a3',
'primary-press': '#0AA882',
secondary: '#F7F9F8',
...
},
text: {
333: '#333333',
555: '#555555',
...
},
},
animation: { // 커스텀 애니메이션
trackingInExpand:
'trackingInExpand 0.7s cubic-bezier(0.215, 0.61, 0.355, 1) 1s both',
},
keyframes: { // 커스텀 애니메이션을 위한 keyframe
trackingInExpand: {
'0%': { letterSpacing: `-0.5em`, opacity: 0 },
'40%': { opacity: 0.6 },
'100%': { opacity: 1 },
},
},
fontFamily: { // 커스텀 폰트
blackHan: ['Black Han Sans', ...defaultTheme.fontFamily.sans],
},
},
},
plugins: [],
}
// ... 줄임
<div className="text-text-333 font-blackHan animate-trackingInExpand">
{`April's world`}
</div>
// ... 줄임