웹팩 빌드 속도 높이기 (feat. 타입체크와 트랜스파일링 분리)

Goody·2021년 8월 7일
4

삽질기록⛏

목록 보기
5/6
post-thumbnail

❗️ CRA 없이 리액트 + 타입스크립트 프로젝트를 만드는 경우를 염두에 두고 쓴 글입니다.
학습중인 내용이므로 틀린 부분이 있을 수 있습니다.
댓글을 통한 모든 피드백은 환영입니다!


ts-loader VS awesome-typescript-module

타입스크립트 + 리액트 프로젝트를 진행할 땐 타입스크립트를 로드해주는 모듈이 필수적입니다. 이 때 사용되는 모듈로는 ts-loader 또는 awesome-typescript-module 이 두 모듈이 대표적입니다.

두 모듈의 가장 큰 차이점은 프로젝트에서 바벨을 사용하냐, 그렇지 않느냐인데요. 바벨을 사용하는 프로젝트의 경우 awesome-typescript-module (이하 atl) 을 사용하고, 그렇지 않으면 ts-loader 를 사용한다고 합니다.

저는 타입스크립트가 트랜스파일링을 해주므로 굳이 바벨이 필요없다고 생각해 ts-loader를 선택했습니다.

문제는 atl이 바벨 지원 뿐만 아니라, 트랜스파일링과 타입체크 프로세스를 분리함으로써 빌드 속도를 높여주는 기능을 갖고 있다는 점인데요. 다행히 ts-loader 로도 두 프로세스를 분리하는 방법이 존재합니다.

//webpack.config.js

module: {
		rules: [
			{
				test: /\.tsx?$/,
				loader: "ts-loader", 
				exclude: /node_modules/,
				options: {
					transpileOnly: true, //  타입체크 없이 트랜스파일링만. (타입체크는 ForkTsCheckWebpackPlugin 에서)
				},
			},
		],
	},

ts-loader 는 타입체크 없이 트랜스파일만 하도록 옵션을 설정했습니다.


그렇다면 타입체크는 어디서 하나요?

ForkTsCheckerWebpackPlugin 라는 플러그인은 타입 체크를 트랜스파일링과 별도의 프로세스에서 진행함으로써 전체적인 빌드 속도를 빠르게 해 줍니다.

// webpack.config.js

plugins: [new ForkTsCheckerWebpackPlugin()],

컴파일 속도 비교

분리 전 :

분리 후 :

❗️ 프로젝트에 App.tsx 파일 외에 별다른 컴포넌트가 없는 상태에서의 비교입니다.


REFERENCE

ts-loader npm : https://www.npmjs.com/package/ts-loader
awesome-typescript-loader npm : https://www.npmjs.com/package/awesome-typescript-loader

13개의 댓글

comment-user-thumbnail
2021년 8월 9일

빌드 속도 까지 고려하시다니.. 매우 꿀팁이네요 !
좋은 글 감사합니다 ㅎㅎ

1개의 답글

오 확실히 빨라지네요 !! 다음에 참고해야겠어요 👍👍👍

1개의 답글
comment-user-thumbnail
2021년 8월 9일

ts-loader 를 따로 하신 이유가 있나요? 저는 babeloader 에서 ts 를 컴파일 해주거든요!
관련 링크 : https://ui.toast.com/weekly-pick/ko_20181220

1개의 답글
comment-user-thumbnail
2021년 8월 13일

구디 덕분에 ts-loader에 대해서 좀 더 잘 알게 된 것 같습니다 ㅜㅜ 웹팩 설정에 도움을 주셔서 무한한 감사 드림다...!

1개의 답글
comment-user-thumbnail
2021년 8월 13일

오 미라클코딩이 이렇게 좋은 스터디였군용ㅎㅎ 잘 보고 가요 구디!! 👏

1개의 답글
comment-user-thumbnail
2021년 8월 14일

이런 갸꿀팁이,, 감사합니다. 저런 플러그인이 있는줄도 몰랐네요.

1개의 답글