2023. 7. 18. 13:57ㆍReact
이번에 회사에서 개발 중인 웹 서비스를 Next 13으로 마이그레이션하여 이 경험을 블로그에 공유해보고자 한다.
cli를 활용하여 업그레이드하기
먼저 최신 버전을 설치하여 준다.
npm install next@latest react@latest react-dom@latest
npm install -D eslint-config-next@latest
Next 13으로 업그레이드 해주는 명령어와 ESLint 업그레이드 명령어이다.
나는 ESLint도 사용 중에 있기에 같이 업그레이드 해주었다.
Codemods 를 이용하여 새로운 버전 적용하기
Image
next 13 으로 넘어오며 기존 next/image가 next/legacy/image로 변경되었고, next/future/image가 next/image로 변경되었다.
image 관련 codemod는 두가지가 있다.
기존 next/image 를 next/legacy/image 로 변경해준다. 경로만 바꿔주기에 기존과 동일한 동작을 유지한다.
npx @next/codemod@latest next-image-to-legacy-image .
위 명령어를 실행하여 적용시켜주었다.
인라인 스타일을 추가하고, 사용하지 않는 props를 제거한다. 실행할 경우 선행으로 1번이 실행되어야 한다.
npx @next/codemod@latest next-image-experimental .
위 명령어를 실행하여 적용시켜주었다.
세부 변경사항은 다음과 같다.
- layout prop을 제거하고 style을 추가한다.
- objectFit prop을 제거하고 style을 추가한다.
- objectPosition prop을 제거하고 style 을 추가한다.
- lazyBoundary prop을 제거한다.
- lazyRoot prop을 제거한다.
image 정리
next/image -> next/legacy/image
: next-image-to-legacy-image codemod으로 적용
next/future/image -> next/image
: next-image-experimental codemod으로 적용
Iink
더 이상 수동으로 <a> 태그를 자식으로 추가하지 않게끔 변경되었다.
이는 12.2에서 실험적 옵션으로 추가되었던 것이 기본값으로 변경된 것이다.
import Link from 'next/link'
// Next.js 12: `<a>` has to be nested otherwise it's excluded
<Link href="/about">
<a>About</a>
</Link>
// Next.js 13: `<Link>` always renders `<a>` under the hood
<Link href="/about">
About
</Link>
new-link codemod 를 사용하여 적용할 수 있다.
npx @next/codemod@latest new-link .
위 명령어를 실행하게 되면 기존에 있던 코드가 아래와 같이 변경된다.
<Link href="/about">
<a>About</a>
</Link>
// transforms into
<Link href="/about">
About
</Link>
<Link href="/about">
<a onClick={() => console.log('clicked')}>About</a>
</Link>
// transforms into
<Link href="/about" onClick={() => console.log('clicked')}>
About
</Link>
자동으로 변경될 수 없는 경우 해당 Link의 동작을 보장하기 위해 legacyBehavior prop가 추가된다.
나같은 경우엔, legacyBehavior를 키워드로 검색하여 테스트 후 상황에 맞게 변경하여 제거하였다.
이제 노가다만 남았다...
이제부턴 기존 pages 폴더를 app 폴더로 변경하고,
세부적으로 'use client' 를 기입하며, router를 변경했던 작업에 대한 내용이다.
1. app 디렉토리 생성
기존 pages 폴더 외에 app 폴더를 생성한다.
이 때, next.config.json을 변경해줘야한다.
const nextConfig = {
experimental: {
appDir: true,
},
}
app 디렉토리를 사용할 것이란 것을 명시해주었다.
Folder structor
app 디렉토리 내 폴더 구조 같은 경우, Next 에서 제시한 폴더 구조를 도입하였다.
Folder naming
- private folder
- route groups
을 사용하여 아래 사진과 같이 폴더 구조를 정립하게 되었다.
2. Router 변경
기존 next/router 를 next/navigation 으로 변경하였다.
그러면서 수정이 필요해진 코드들이 있었는데,
- router.query -> useSearchParams
- router.pathname -> usePathname
으로 변경되었다.
글을 마치며
이렇게 next 로 마이그레이션 하며 틀을 다시 정립하는 과정을 적어봤다.
이 외에도 api 사용 방식을 재정립하는 시간을 가졌었는데, 이는 추후에 포스팅해보도록 하겠다.
오늘도 글을 읽어주셔서 감사합니다
즐거운 코딩 되세요 :)
'React' 카테고리의 다른 글
CSR과 SSR 그리고 SPA까지 (0) | 2023.08.02 |
---|---|
Next.js에서 yarn start(or npm run start)를 하면 무슨 일이 벌어질까? (0) | 2023.07.27 |
antd DatePicker 삽질기: TypeError: t.weekday is not a function (0) | 2023.06.20 |
React, Next 환경에서 Portal 사용하기 (0) | 2023.06.13 |
React에서 모달을 Context를 이용해 전역에서 선언식으로 관리하기 (0) | 2023.06.13 |