1. 配置初始化
- 核心操作:
- 解析
webpack.config.js配置文件 - 合并命令行参数(CLI)、环境变量与默认配置
- 确定核心参数:入口(
entry)、输出路径(output)、加载器(loader)、插件(plugin)
- 解析
2. 入口定位
- 核心逻辑:
- 从配置的
entry字段(如./src/main.js)开始 - 支持单入口、多入口或动态入口配置形式
- 创建初始模块实例,作为依赖分析的起点
- 从配置的
3. 模块解析与依赖图谱构建
- 核心过程:
- 依赖分析:递归解析入口文件的
import/require语句 - 路径解析:通过
enhanced-resolve库处理模块路径(如node_modules查找) - 文件识别:根据扩展名(
.js/.css/.png等)匹配对应的加载器规则 - 图谱生成:构建完整的模块依赖关系图(Dependency Graph)
- 依赖分析:递归解析入口文件的
4. 模块编译与转换
- 核心机制:
- Loader 链式处理:按
rules配置顺序执行(从右到左)// 示例:CSS 处理流程 use: ['style-loader', 'css-loader'] // 先执行 css-loader,再 style-loader - 转译操作:
- JavaScript:通过
babel-loader转译 ES6+ 语法 - CSS:通过
css-loader解析@import,style-loader注入 DOM - 图片/字体:通过
file-loader生成哈希文件名并输出
- JavaScript:通过
- Loader 链式处理:按
5. 代码优化与分块
- 核心策略:
- 代码分割:
- 按入口点自动分割
- 动态导入(
import()语法)生成异步 chunk - 提取公共依赖(
SplitChunksPlugin)
- 优化处理:
- Tree Shaking(消除未使用代码)
- 作用域提升(Scope Hoisting)
- 压缩混淆(
TerserPlugin处理 JS,CssMinimizerPlugin处理 CSS)
- 代码分割:
6. 插件系统介入
- 核心阶段:
- 编译前:环境变量注入(
DefinePlugin) - 编译中:实时进度反馈(
ProgressPlugin) - 输出前:生成 HTML 模板(
HtmlWebpackPlugin) - 优化时:压缩资源(
CompressionPlugin生成 gzip)
- 编译前:环境变量注入(
7. 资源生成与输出
- 核心输出:
- 根据
output.path(默认./dist)生成最终文件 - 文件命名策略(如
[name].[contenthash:8].js实现长效缓存) - 生成附属文件:
manifest.json(模块映射关系)- Source Map(调试源码映射)
- 根据
8. 构建反馈与调试
- 核心输出:
- 控制台显示构建错误(如模块缺失、语法错误)
- 生成
stats.json分析报告(模块体积、依赖关系) - 可视化工具(
webpack-bundle-analyzer)展示包结构
流程总结
Webpack 通过 模块化依赖分析 → 代码转译 → 分块优化 → 插件增强 → 资源输出 的完整链路,将分散的源码转换为高性能、可部署的静态资源。其核心价值在于:
- 模块化支持:统一处理 JS/CSS/图片等资源依赖
- 工程化优化:通过 Tree Shaking、Code Splitting 提升应用性能
- 扩展能力:Loader 和 Plugin 机制支持深度定制