컨텐츠를 불러오는 중...
vite
가 성능이 뛰어난 이유는 무엇일까요? vite는 esbuild
, Rollup
, SWC
들의 장점들을 최대한 활용하여 등장한 번들링 툴이기 때문입니다.Eslint
, babel
, Rollup
, esbuild
등에서 실제로 이루어지고 있는 작업입니다.babel-loader
는 Babel을 사용해 코드를 파싱하여 AST를 생성하고, 변환 후 JavaScript 코드를 생성합니다. Terser는 Webpack 번들링 결과물을 최적화하기 위해 AST를 생성하고 이를 변환합니다.import
로딩을 통해 필요한 모듈을 병렬로 가져옵니다.Cache-Control
, ETag
, Last-Modified
)를 기반으로 변경되지 않은 모듈은 캐시에서 가져오므로 네트워크 요청을 줄이고 성능을 향상시킬 수 있습니다.function square(n) {
return n * n
}
// 위의 코드를 트리 구조의 데이터 스트럭쳐로 변환
{
"type": "Program",
"body": [
{
"type": "FunctionDeclaration",
"id": {
"type": "Identifier",
"name": "square"
},
"params": [
{
"type": "Identifier",
"name": "n"
}
],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "ReturnStatement",
"argument": {
"type": "BinaryExpression",
"operator": "*",
"left": {
"type": "Identifier",
"name": "n"
},
"right": {
"type": "Identifier",
"name": "n"
}
}
}
]
}
}
],
"sourceType": "module"
}
// Vite(esbuild)의 AST 처리
코드 → 바이너리 AST 생성 → 변환 → JavaScript 코드 생성
파일 시스템 감시 도구를 사용해 변경된 파일을 즉시 감지한다.
↓
변경된 모듈만 esbuild로 처리한다.
- esbuild를 사용하여 AST를 생성하고 필요한 변환을 수행한다.
↓
변경된 모듈만 브라우저에 전달한다
- 브라우저는 ESM을 사용해 변경된 모듈만 다시 요청하며, 전체 페이지를 다시 로드하지 않습니다
↓
모듈 업데이트 적용
const x = 10;
console.log(y); // ReferenceError: y is not defined
const path = require("path");
const { EsbuildPlugin } = require("esbuild-loader");
module.exports = {
entry: {
app: "./src/index.tsx",
},
output: {
module: true,
library: {
type: 'module'
}
},
experiments: {
outputModule: true
},
module: {
rules: [
{
test: /\.[jt]sx?$/,
loader: "esbuild-loader",
options: {
target: "es6",
},
exclude: /node_modules/,
},
{
test: /\.jsx?$/,
loader: "esbuild-loader",
options: {
target: "es6",
loader: "jsx",
},
exclude: /node_modules/,
},
{
test: /\.tsx?$/,
loader: "esbuild-loader",
options: {
target: "es6",
loader: "tsx",
},
exclude: /node_modules/,
}
},
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
"@components": path.resolve(__dirname, "./src/components"),
},
extensions: [".ts", ".tsx", ".js", ".jsx"],
},
output: {
filename: "[name].bundle.js",
path: path.join(__dirname, "dist"),
clean: true,
},
optimization: {
minimizer: [
new EsbuildPlugin({
target: "es6",
css: true,
}),
],
},
};