이전 게시글에서 Css-in-JS
를 서버 사이드 렌더링 시 헤더에 주입하여 미리 HTML을 마크업할 때 스타일까지 HTML 요소에 녹여내기 위해 _document.tsx
를 작성했다.
하지만!!
최초 서버 사이드 렌더링(SSR) 이후 서버를 거치지 않은 채 내부 라우팅을 이용해 클라이언트 사이드 렌더링(CSR)으로 라우팅을 하게 된다. 첫 화면 로딩시에는 SSR로 렌더링하면서 오류가 발생하지 않지만 그이후 부터는 CSR로 렌더링하면서, 서버에서의 클래스명과 클라이언트에서 클래스명이 달라져서(Prop className did not match) 오류가 발생하게 된다. 이를 해결하기 위해 next.config.json
을 작성하자.
{
"presets": [
"next/babel"
],
"plugins": [
[
"babel-plugin-styled-components",
{
"fileName": true,
"displayName": true,
"pure": true
}
]
]
}
root폴더에 .babelrc
파일을 생성하여 작성하면 다음과 같이 설정해주면 해결할 수 있다.
info - Disabled SWC as replacement for Babel because of custom Babel configuration ".babelrc" https://nextjs.org/docs/messages/swc-disabled
그럼 다음과 같은 문구를 확인할 수 있다. 해결 1처럼 작성하여 babel을 사용하여 해결할 수 있지만 babel 대신 SWC로 해결해보기로 한다.
프로젝트의 규모가 커질수록 전체 프로젝트 코드가 바벨과 같은 빌드 툴을 거쳐, 실제 프로덕션 코드로 변환되까지 시간이 기하급수적으로 늘어난다.(느낀적은 없지만..) 이후 테스트 한 번 할 때마다 빌드 때문에 막막한 시간을 해결하고자 Next.js 팀에서 12 버전부터 정식으로 도입된 Rust라는 언어로 제작된 SWC라는 툴이 있다. SWC로 구축된 새로운 컴파일러를 이용해 Next.js 프로젝트를 빌드하면, 기존과 비교했을 때 빌드 타임이 최대 5배까지 빨라진다고 한다.
.babelrc
를 제거해야 한다. 이것으로 SWC가 활성화되는 기본 요건이 완성되었다고 생각하면 된다.
// next.config.js
module.exports = {
swcMinify: true,
};
간단하게 코드 경량화 작업에 SWC를 사용하도록 next.config.js의 내용을 위처럼 작성한다.
module.exports = {
swcMinify: true,
compiler: {
// ssr, displayName true가 기본값으로 켜진다.
styledComponents: true,
},
};
styled-components를 Next.js와 함께 사용할 때는 babel-plugin-styled-components
를 설치하고 SSR을 켜줘야 하는데 이 부분을 무척 간단하게 킬 수 있도록 구현되어 있다.
npm install -g gnomon
gnomon
툴을 이용해봤다.npm run build | gnomon --type=elapsed-total
그리고 다음처럼 명령하면 빌드하는데까지 걸리는 시간을 확인할 수 있다.
.babelrc
파일이 존재하면 SWC 대신 바벨을 사용하여 빌드가 되기 때문에 이전 블로그에서 사용했던 .babelrc
를 적용하고 빌드했다.
프로젝트 초기 단계이기 때문에 대략 8초 정도 끝났다.
초기 단계임에도 불구하고 대략 6초가 걸린 것으로 2.4초 정도가 차이나는 것을 확인할 수 있다. 만약 계속해서 프로젝트를 진행하면서 규모가 커지게 되면 그 정도는 심해질거라는 것을 체감할 수 있었다.