웹 서비스의 성능을 논할 때 가장 중요하게 다뤄야 할 지표 중 하나가 바로 JS 실행시간(JS execution time)이다.
브라우저는 우리가 작성한 JavaScript를 파싱 → 컴파일 → 실행하는 복잡한 단계를 거치는데, 이 과정이 길어질수록 사용자 경험은 느려지고 인터랙션은 끊기기 시작한다.
이 도구는 프로젝트의 JS 번들 크기를 시각화해주는 대표적인 분석 툴이다.
실제로 웹 서비스 성능 문제의 상당수는 “번들이 너무 크다”로부터 시작된다.
이를 해결하려면 무엇이 큰지 먼저 알아야 한다.
npm install --save-dev webpack-bundle-analyzer
// webpack.config.js
const BundleAnalyzerPlugin =
require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
module.exports = {
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: "server",
openAnalyzer: true,
}),
],
};


이 화면을 통해 다음과 같은 의사결정을 할 수 있다.
// Before
import HeavyModal from "./HeavyModal";
// After
const HeavyModal = React.lazy(() => import("./HeavyModal"));
코드 분할을 통해 최초 렌더링에 필요한 JS 크기를 큰 폭으로 줄일 수 있다.
JS 실행시간 최적화라고 해서 JS만 줄이면 되는 것이 아니다.
CSS도 브라우저의 렌더링 성능에 큰 영향을 준다.
불필요한 CSS는 JS처럼 파싱하고 적용하는 데 시간이 소요되기 때문이다.
Tailwind, Next.js, CRA 등 많은 프레임워크가 기본적으로 지원하지만 직접 PurgeCSS를 적용할 수도 있다.
npm install @fullhuman/postcss-purgecss
// postcss.config.js
module.exports = {
plugins: [
require("@fullhuman/postcss-purgecss")({
content: ["./src/**/*.jsx", "./public/index.html"],
defaultExtractor: (content) => content.match(/[\w-/:]+(?<!:)/g) || [],
}),
],
};
Critical CSS는 “초기 렌더링에 필요한 최소한의 CSS만 inline으로 넣는 방법”이다.
Next.js는 이를 자동으로 처리해주지만, 직접 적용하려면:
<style>
/* critical CSS inserted here */
</style>
<link rel="stylesheet" href="main.css" />
이렇게 하면 초기 렌더링 속도가 크게 향상된다.
React + Webpack 환경에서 CSS도 JS처럼 Split 가능하다.
// webpack.config.js
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
}
파일이 분리되면 JS 실행시간도 줄고 렌더링 지연도 감소한다.


위처럼 CSS blocking time이 줄어들면 JS도 함께 빠르게 실행된다.
React 팀이 공개한 React Compiler는 현재(2025년 기준) 가장 효율적인 렌더링 최적화 도구다.
즉, 기존에는 개발자가 직접 최적화를 해줘야 했던 부분을 자동화해준다.
// next.config.js
module.exports = {
reactCompiler: true,
};
혹은 React 19 환경에서:
"use client";
import { compiler } from "react-compiler";


React Compiler가 활성화되면 다음과 같은 효과가 있다:
특히 많은 상태와 props가 오가는 대규모 SPA에서 체감 속도 차이가 크다.