-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Reqeust : tsc
is so slow
#137
Comments
2. tsc 성능 튜닝2.1. include 및 excludetsconfig.json 의 include 구문에 정규표현식의 ***와일드 카드, * *** 를 사용할 경우 심각한 성능 저하가 발생한다 라는 내용을 발견하였습니다. 해당 글의 논리는 모든 소스 파일이 어차피 src 에 있는 경우, src/* 라는 구문은 src 안의 모든 디렉토리를 중복하여 탐색하게 된다는 것이었습니다. 이 중, 이미 include 는 사용 중이어서 exclude 를 사용하였으나 큰 성능 상승은 없었습니다. "include": ["src"],
"exclude": [
"**/node_module",
".github",
".husky",
"coverage",
"dist",
"key",
"sql"
] |
2.2. incremental: truetsconfig.json 에서 Incremental Project Emit 을 이용하여 tsconfig 의 반복실행에 대한 성능 튜닝이 가능합니다. 다만, 해당 구문은 이미 적용 중인 상태이기 떄문에 해결책이 될 수 없었습니다.
|
2.3. Union 타입 보다 기본 타입 선호역시나 다음과 같이 Union 타입이 심각한 성능 저하를 일으킬 수도 있다는 부분을 찾았습니다. type CustomTokenType =
| "AccessToken"
| "RefreshToken"
| "EmailVerifyToken"
| "NicknameVerifyToken"
| "ResetPasswordToken"; 해당 구문은 컴파일 시 마다, 조건문을 비교해야 하며 이에 따라 성능 저하가 발생할 수 있는 가능성 에 대한 우려가 있었습니다. 단, 해당 조건이 12개 이상을 포함하는 Union 에 해당하는 경우라고 명시되어 있었습니다. 이를 피하기 위한 방법으로는 하위 Union 타입을 사용하는 것이 나와있었습니다. type AuthTokenType = "AccessToken" | "RefreshToken";
type VerifyTokenType = "EmailVerifyToken" | "NicknameVerifyToken";
type ResetPasswordTokenType = "ResetPasswordToken";
type CustomTokenType = AuthTokenType | VerifyTokenType | ResetPasswordTokenType ; |
2.4. 결론공식 문서 상의 모든 솔루션을 적용해보았음에도 성능 향상이 일어나지 않았습니다. |
3. tsc 안정성 튜닝
3.1. 문제점
실제로 ~/src/server.ts 를 지우더라도 ~/dist/server.js 는 사라지지 않습니다. 이 부분에서는 개인적인 판단에 의존하기 보다는 nest new app 으로 만들어진 파일들을 다소 간에 참고했습니다. 3.2. nest-cli 로 생성한 프로젝트 분석 (shell script)
"prebuild": "rimraf dist", // dist 폴더를 삭제
"build": "nest build", // node_modules/.bid/nest 를 실행 (프로젝트에 설치된) node 생태계의 cli 명령어의 경우,
위 코드에서 #!/usr/bin/env node
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const commander = require("commander");
const commands_1 = require("../commands");
const local_binaries_1 = require("../lib/utils/local-binaries");
const bootstrap = () => {
const program = commander;
program
.version(require('../package.json').version, '-v, --version', 'Output the current version.')
.usage('<command> [options]')
.helpOption('-h, --help', 'Output usage information.');
if ((0, local_binaries_1.localBinExists)()) {
const localCommandLoader = (0, local_binaries_1.loadLocalBinCommandLoader)();
localCommandLoader.load(program);
}
else {
commands_1.CommandLoader.load(program);
}
commander.parse(process.argv);
if (!process.argv.slice(2).length) {
program.outputHelp();
}
};
bootstrap(); 저희는 commander 라던가 내장 객체에 대한 이해도가 높지 않습니다. 즉, nest build 라는 명령어는 다음과 같을 것입니다.
그리고 이에 해당하는 명령어는 바로 rimraf dist
tsc 물론, 최초 호출 위치가 3.3. nest-cli 로 생성한 프로젝트 카피nest-cli 로 생성한 프로젝트에서 다음의 파일들을 cupick 에 맞게 밴치마킹하였습니다.
|
3.4. 결론결과적으로 tsconfig.json 의 튜닝은 성공했으나, 불안정성이 존재 함을 인지했습니다. 참고 문헌은 다음과 같습니다.
|
1. 제안사항
tsc 의 성능 저하가 너무 심각해져서 작업에 지장이 오고 있습니다.
평균적으로 Ctrl + S 한 번에 5~20 초가 소요되고 있습니다. 해당 과정을 하루에 100 번 이상 대기하게 될 수도 있으며, 결과적으로 500~2000초 에 해당하는 큰 시간을 소요하게 됩니다.
이 문제를 vite 와 tsc 를 동시에 사용하는 것으로 해결하려고 했으나, 해당 방식 은 다음과 같은 우려되는 부분이 있었습니다.
이에 따라서 tsc 가 실행하는 tsconfig.json 튜닝 이나 코드 튜닝 등을 통해서 성능 향상을 기대해야 할 것 같다는 생각이 들었습니다.
tsc 튜닝을 하면서 사용한 커맨드와 그 목적은 다음과 같습니다.
1.1. 환경 설정
The text was updated successfully, but these errors were encountered: