Skip to main content

Command Palette

Search for a command to run...

Vite에서 타입 검사가 빠진 이유는?

Updated
•2 min read•View as Markdown
Vite에서 타입 검사가 빠진 이유는?

들어가며

타입 관련 파일명을 변경한 뒤, import 구문 수정한 커밋을 누락한 채 배포했다.
"타입 에러가 발생해서 빌드가 실패했겠지?"라고 생각했는데, 예상과 다르게 배포가 문제없이 진행되었다.
"왜 타입 에러가 있었는데도 빌드와 배포가 성공한 걸까?" 🤔
이 궁금증을 해결하기 위해 CRA와 Vite의 빌드 과정을 비교해 보았다.


나의 착각 : 타입 체크는 자동으로 수행될 거야!

CRA와 같이 Vite도 프로덕션 빌드에서 타입 체크를 수행할 것이라고 생각했다. 즉, 타입 에러가 있으면 빌드가 실패할 줄 알았다.

하지만 Vite는 타입 체크를 하지 않고, 트랜스파일링(코드 변환)만 수행하기 때문에 타입 에러가 있어도 빌드가 가능하다는 걸 공식 문서를 통해서 확인할 수 있었다.

Vite는 .ts 파일에 대해서 트랜스파일링만 수행하며, 타입 검사는 IDE와 빌드 프로세스에서 수행된다고 가정합니다. Vite 공식 문서 링크

Vite는 왜 .ts 파일의 타입을 검사하지 않을까?

Vite의 목표는 빠른 실행 속도

Vite는 빠른 실행 속도를 위해서 TypeScript 코드를 빠르게 JavaScript로 변환하는 트랜스파일링만 수행하고, 시간이 많이 걸리는 타입 검사는 제외했다.

타입 검사는 왜 시간이 많이 걸릴까

TypeScript는 모듈 간 관계를 분석하기 위해서 AST(Abstract Syntax Tree, 추상 구문 트리)를 생성하여 타입을 분석한다. 파일 단위가 아니라 전체 코드를 분석해야 하기 때문에 타입 검사는 시간이 오래 걸릴 수밖에 없다.

빌드 속도 비교 : 타입 검사는 진짜 오래 걸릴까?

타입 검사가 실제로 얼마나 느린지 확인해 보고 싶어서 직접 측정해 보았다.

비교 방법

터미널에서 time 명령어를 사용하여 빌드 속도를 측정했다.

  • 타입 체크 없이 빌드 측정 : time vite build

  • 타입 체크 포함 빌드 측정 : time (tsc --noEmit && vite build)

    참고 : tsc --noEmit 이란?

    이 명령어는 타입 체크만 수행하고, 결과 파일(.js)을 생성하지 않는다.

결과 : 타입 체크 포함하면 빌드 시간 350배 증가!

Vite는 파일 단위로 빠르게 트랜스파일링하지만, 타입 체크는 전체 코드를 분석해야 해서 속도가 느리다는 걸 확인할 수 있었다.

Vite 프로젝트에서 타입 검사는 언제 해야 할까?

Vite는 타입 검사가 포함되어 있지 않지만, 우리는 언제 타입 체크를 하는 게 좋을까?

로컬 개발 환경

  • IDE(VS Code)에서 실시간 타입 체크

  • tsc --noEmit --watch로 수동 검사

CI/CD 단계에서 체크

  • PR시 자동 타입 체크 실행하여, 타입 오류 발생 시 머지되지 않도록 설정

  • Vercel 배포 시 npm run tsc --noEmit && vite build 설정

마무리 : 빠른 빌드 속도가 말해주는 것!

Vite를 사용하며, 빠른 빌드 속도가 단순한 최적화가 아니라 타입 검사를 제외한 결과라는 사실을 알게 되었다. 빠른 빌드는 기존에 수행하던 작업을 생략했기 때문에 가능했던 것이었다. 앞으로 개발 환경 세팅 도구를 확인할 때는 ‘빠르다’에서 그냥 넘어가지 말고, 그 속도가 어떻게 만들어졌는지, 어떤 작업이 포함되고 빠졌는지를 꼼꼼히 살펴봐야겠다. 그리고 빠른 속도와 안정성이라는 선택 속에서 프로젝트에 맞는 균형을 찾는 것이 중요하다는 걸 배웠다.

More from this blog

Conductor 워크스페이스마다 .env 파일 자동 복사하기

문제를 만나다 개인 프로젝트를 진행할 때 기능을 병렬로 구현하기 위해서 Conductor를 사용하고 있다. 여러 개의 워크 스페이스를 새로 만들 때마다 환경변수를 매번 수동 복사해야 하는 게 매우 귀찮았다. 워크트리 개념이 익숙하지 않아서 처음에는 워크트리 생성 시 모든 파일을 다 가져오는 줄 알았다. 워크트리의 동작 방식을 찾아보니, git에 저장된 파일만 생성된다는 걸 새로 알게 되었다. 도움 받은 블로그 글 링크 : Git에서 다수...

Dec 28, 20251 min read

[ts-challenges] Includes / Push / Unshift / Parameters

Includes 설계 의도 튜플 타입 T를 첫 번째 요소인 Head와 나머지 요소들인 Tail로 분리해서 추론한다. Head가 제네릭 U 타입과 동일하지 않으면 Includes 타입을 Tail에 대해 재귀적으로 다시 실행하면서 다음 요소 검사하기 boolean 타입의 경우, true와 false이 모두 할당가능하니까 엄격하게 동등한지 비교하기 위해서 Equal 헬퍼함수 사용 코드 type Equal<X, Y> = (<T>() => ...

May 23, 20253 min read

Untitled Publication

37 posts