Entry(入口)
指定应用的起点文件,比如 src/index.js。
Module(模块)
Webpack 把项目当作模块图,模块可以是 JS、CSS、图片等。
Loader(加载器)
负责模块的预处理,比如 Babel 转译、CSS 预处理,Webpack 自身只识别 JS 和 JSON,其他类型靠 Loader 转换。
Plugin(插件)
插件用来扩展 Webpack 功能,比如打包优化、资源管理等。插件通过生命周期钩子影响构建过程。
Chunk(块)
由模块组成的代码块,Webpack 通过代码分割生成多个 Chunk。
Bundle(包)
最终生成的一个或多个文件,供浏览器加载。
从 Entry 开始,构建依赖图。
递归解析模块依赖。
Loader 转换文件内容。
Plugin 钩子运行,注入功能。
Chunk 生成。
Bundle 输出
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js', // 入口
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'), // 输出目录
clean: true,
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader', // 转译ES6+
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'], // 处理CSS
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html', // 模板文件
}),
],
mode: 'development',
devtool: 'source-map', // Source Map 支持
devServer: {
static: './dist',
hot: true, // HMR支持
},
};
开发时:利用浏览器原生 ES 模块,启动快,修改文件只热更新。
构建时:用 Rollup 或 Rspack 做打包,兼顾速度与功能
使用 esbuild 预构建依赖(node_modules),极大提升启动速度。
源码不打包,按需请求原始模块,浏览器负责解析。
通过 WebSocket 实现 HMR(热模块替换)
使用 Rollup 进行生产构建,保证代码优化、Tree-shaking 和代码分割。
未来支持用 Rspack 或 Rolldown 替代 Rollup 提升性能
基于 Go 语言实现的超快编译器。
Vite 用它做依赖预构建和某些转换。
速度快,但功能和插件生态比 Rollup 差
// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm', // 输出ES模块
sourcemap: true,
},
plugins: [
resolve(), // 处理node_modules
commonjs(), // 处理CommonJS模块
babel({ babelHelpers: 'bundled', exclude: 'node_modules/**' }),
],
};
// build.js
const esbuild = require('esbuild');
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
minify: false,
sourcemap: true,
target: ['es2020'],
loader: {
'.js': 'jsx',
'.css': 'css',
},
}).catch(() => process.exit(1));
// vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
root: 'src', // 项目根目录
build: {
outDir: '../dist', // 输出目录
sourcemap: true,
},
server: {
port: 3000,
open: true,
},
});
工具 | 实现语言 | 启动速度 | 构建速度 | 插件生态 | 适用场景 |
---|---|---|---|---|---|
Webpack | JS | 较慢 | 慢 | 丰富 | 复杂大型项目 |
Rollup | JS | 中 | 较快 | 丰富 | 库打包 |
esbuild | Go | 非常快 | 非常快 | 少 | 快速原型,依赖预构建 |
Rspack | Rust | 快 | 快 | 正在完善 | Webpack 替代 |
Rolldown | Rust | 预期快 | 预期快 | 兼容 Rollup | Rollup 的 Rust 重写版 |
现代打包工具支持对图片、字体、音视频等资源进行处理:
小文件可以内联为 base64。
大文件自动拷贝到输出目录并生成带哈希的文件名,支持缓存。
Webpack 通过 asset 模块类型处理。
Vite 内置支持静态资源导入。
esbuild 也支持静态资源加载