Skip to content

webpack 整体生命周期

  • 初始化阶段:主要是加载compiler等基础对象以及plugin插件,最终找到entry入口模块
  • 构建阶段:从entry开始,
    • 调用loader加载资源
    • 转换成ast语法树
    • 递归遍历所有依赖,构建模块依赖关系图
  • 生成阶段:封装chunk模块

webpack&vite 模块的处理流程(流水线)

  • webpack (解析转换依赖优化生成)
  • Entry → Resolve → Load → Transform → Parse → Optimize → Generate → Output
  • vite
  • 开发:Entry → Native ESM → Transform on demand → HMR
  • 生产:Entry → Rollup bundling → Transform → Optimize → Output

HMR

  • webpack:
    • 先打包,构建一套自己的依赖系统
    • 然后遍历更新的模块及其依赖,列一个变更清单,针对每一个变更发送最新的请求。
  • vite
    • esm原生支持import,所以不用打包。
    • 就启动一个websocket,通过esm故而无需打包,按需取用。文件有变更就通过import按照时间戳去请求最新的文件,然后自己按需编译就行。

loader

只负责加载,一般都是loader进行Transform工作

插件 plugin

涉及全生命周期

包括:

md
| 插件名称                      | 用途                          | 示例配置                          |
|-----------------------------|-----------------------------|---------------------------------|
| `HtmlWebpackPlugin`         | 生成HTML入口文件                | ```new HtmlWebpackPlugin({ template: './src/index.html' })``` |
| `MiniCssExtractPlugin`      | 提取CSS到独立文件                | ```new MiniCssExtractPlugin()``` |
| `DefinePlugin`              | 定义全局常量                     | ```new webpack.DefinePlugin({ PRODUCTION: JSON.stringify(true) })``` |
| `CopyWebpackPlugin`         | 复制静态资源                     | ```new CopyWebpackPlugin({ patterns: [{ from: 'public' }] })``` |
| `SplitChunksPlugin`         | 代码分割优化                     | 通过`optimization.splitChunks`配置 |
| `TerserWebpackPlugin`       | JS代码压缩                      | 通过`optimization.minimizer`配置 |

**典型场景**
```js
// 生产环境配置示例
plugins: [
  new HtmlWebpackPlugin(),
  new MiniCssExtractPlugin({
    filename: '[name].[contenthash].css'
  }),
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify('production')
  })
]
md
| 插件名称                      | 用途                          | 示例配置                          |
|-----------------------------|-----------------------------|---------------------------------|
| `@vitejs/plugin-react`      | React项目支持                  | ```react()```                   |
| `vite-plugin-pwa`           | PWA支持                      | ```VitePWA()```                 |
| `vite-plugin-svg-icons`     | SVG雪碧图优化                  | ```createSvgIconsPlugin({ iconDirs: [path.resolve(process.cwd(), 'src/icons')] })``` |
| `vite-plugin-mock`          | Mock数据服务                  | ```mock({ mockPath: 'mock' })``` |
| `vite-plugin-compression`   | Gzip/Brotli压缩              | ```compression({ algorithm: 'gzip' })``` |
| `vite-plugin-inspect`       | 调试插件中间状态                | ```inspect()```                 

**典型场景**
```js
// Vite配置示例
export default defineConfig({
  plugins: [
    react(),
    VitePWA({
      registerType: 'autoUpdate',
      manifest: {
        name: 'My App'
      }
    }),
    compression()
  ]
})
本站访客数 人次 本站总访问量