Next.js에서는 type-checking을 지원하지 않는다?!?
2023년 03월 16일
1. Next.js에서는 type-checking을 지원하지 않는 이유
사실 next는 type-checking을 지원하지 않는다는 말은 반은 맞고 반은 틀립니다. 이게무슨 말이냐구요?
저는 여느때처럼 next를 사용해서 만든 블로그 코드들을 리팩토링하고 있었습니다. 하지만 예전부터 의문이였던 점이 있었습니다. 그점은 바로 개발자 모드(next dev)에서는 잘 작동하던 코드가 build만 하면 에러를 마구 뿜어내는 것이였죠. 그래서 이리저리 알아본결과 개발자 모드에서는 9.4버전부터 fast refresh
가 적용되면서 type-checking을 빼버렸다는 점입니다. 그렇다면 fast refresh는 무엇일까요?
1-1. fast refresh
Next.js의 fast refresh는 코드 변경 시 브라우저에서 새로고침 없이 빠르게 변경 사항을 반영할 수 있는 기능입니다. 이 기능은 개발자가 코드를 변경할 때마다 브라우저에서 전체 페이지를 다시 로드하지 않고 변경된 부분만을 업데이트하여 빠른 개발환경을 제공합니다.
이전에는 React Hot Loader
나 React Fast Refresh
와 같은 도구를 사용하여 React 애플리케이션을 빠르게 새로고침할 수 있었습니다. 하지만 Next.js 9.4 버전부터는 이러한 기능을 내장하고 있어, 별도의 설정 없이 사용할 수 있습니다.
Fast refresh는 개발자가 코드를 변경하면, 변경된 부분만을 즉시 반영하여 브라우저에서는 페이지 전체를 다시 로드하지 않습니다. 이를 통해 개발자는 빠른 피드백을 받고, 애플리케이션의 개발 속도를 향상시킬 수 있습니다. 또한, Fast refresh는 React Hooks나 함수 컴포넌트를 사용할 때도 잘 작동합니다.
결국 next는 DX를 위해서 타입 체킹을 빼버렸던거지요.(오히려 DX가 더 나빠진 느낌...)
2. type-checking을 수동으로 실행하자
next.config.js에 type-checking을 fast refresh시 수행하는 옵션이 있다면 좋겠지만 아쉽게도 존재하지 않습니다.(제가 모르는 type-checking 옵션이 있다면 댓글로 알려주세요!)
그래서 저는 type-checking을 수동으로 실행하는 가장 간단한 방법을 소개하겠습니다.
2-1. Script에 type-checking 명령어를 추가하자
tsc --noEmit --incremental --watch
명령어를 사용하면 실시간으로 ts 파일들이 수정될 때마다 해당 파일 타입체킹을 수행합니다!
"scripts": {
"dev": "next dev",
"ts": "tsc --noEmit --incremental --watch",
...
}
저는 script에 ts명령어로 설정했습니다.
그렇다면 tsc, --noEmit, --incremental, --watch 이 명령어들은 무엇일까요?
-
tsc : TypeScript 컴파일러를 실행하는 명령어입니다. 이 명령어에는 여러 옵션을 지정할 수 있습니다
-
--noEmit : JavaScript 소스 코드, 소스 맵 또는 선언과 같은 컴파일러 출력 파일을 생성하지 않습니다.
-
--incremental : 이 모드는 이전 컴파일의 정보를 기반으로 변경된 파일만 다시 컴파일하여 컴파일 시간을 단축합니다. tsconfig.tsbuildinfo라는 파일이 생성되어 이전 컴파일의 정보를 저장합니다
-
--watch : 입력 파일이나 프로젝트의 변경 사항을 감지하여 자동으로 다시 컴파일합니다. 이 옵션은 개발 중에 편리하게 사용할 수 있습니다.
즉 ts파일을 빠르게 type-checking 해준다는 뜻이죠
참고 문서
https://www.inflearn.com/blogs/2893