webpack-构建流程

构建流程

  1. 初始化配置
  2. 实例化一个 Compiler 类,注册所有的插件 plugin,给对应的 Webpack 的生命周期绑定 hooks
  3. 开始编译:执行 Compiler 类的 run 方法开始构建
  4. 实例化一个 Compilation 类,Compilation 是做构建打包的事情,主要做以下几件事:
    • 查找和分析入口 entry
    • 使用 loader 处理指定文件
    • 解析文件的 AST 语法树
    • 找出文件依赖关系(arcon)
    • 递归编译依赖的模块
  5. 递归完后得到每个文件的最终结果,根据 entry 生成代码块 chunk
  6. 输出

整体流程:init >> make >> seal

webpack 5 带来了什么

  • 持久化缓存。webpack4 需要通过 cache-loader/hardSourcePlugin 来实现中间缓存,webpack5 相当于内置了这部分功能
  • 更好的 hash 算法。hash—>fullhash,比如 webpack 4 如果添加空白、注释或修改变量名是会影响 contenthash 值的计算,webpack5 则不会影响,从而能继续使用缓存,这个方式降低了缓存的失效率,间接加快了应用 rebuild 的速度
  • Asset Modules(更优雅的资源模块)。指的是图片和字体等这一类型文件模块,它们无须使用额外的预处理插件
  • 模块联邦。实现应用级的模块复用,这个是现在蛮多新兴微前端框架的基础
  • tree-shaking 改进。据说可以减少约 30%
<think>我们正在讨论的是webpack中的各种压缩插件和加载器,它们的用途和区别。用户的问题集中在compression-webpack-plugin、terser-webpack-plugin、css-minimizer-webpack-plugin、html-webpack-plugin以及image-webpack-loader之间的区别。 首先,我们需要明确每个工具的作用: 1. **compression-webpack-plugin**:这个插件用于在构建过程中生成压缩后的静态资源(如gzip或brotli格式)。它通常用于对已经构建好的文件(如JS、CSS、HTML)进行进一步压缩,以便在服务器上启用压缩传输,减少网络传输体积。 2. **terser-webpack-plugin**:这个插件用于压缩JavaScript代码。它使用Terser库来最小化和混淆JS代码。它是webpack 4和5中默认的JS压缩工具(在production模式下自动启用),但也可以通过配置进行更细致的控制。 3. **css-minimizer-webpack-plugin**:这个插件用于压缩和优化CSS代码。它使用cssnano或其他CSS处理器来去除无用的空格、注释,并且可以进一步优化CSS(比如合并相同的规则)。在webpack 5中,它用于替代之前的optimize-css-assets-webpack-plugin。 4. **html-webpack-plugin**:这个插件用于简化HTML文件的创建,特别是那些需要包含打包后的bundle(JS和CSS)的HTML文件。它也可以压缩HTML文件(通过配置选项minify),比如移除空格、注释、属性引号等。 5. **image-webpack-loader**:这是一个加载器(loader),用于压缩图片文件(如JPEG、PNG、GIF、SVG)。它可以在图片被file-loader或url-loader处理之前进行压缩,从而减少图片文件的大小。 现在,我们来详细说明它们的区别: - **作用阶段**: - `compression-webpack-plugin` 作用于构建后的文件(即生成压缩版本,如.gz文件)。 - `terser-webpack-plugin` 和 `css-minimizer-webpack-plugin` 作用于代码压缩阶段,是webpack优化(optimization)的一部分。 - `html-webpack-plugin` 主要作用是生成HTML文件,其压缩功能是可选的,作用于HTML文件生成阶段。 - `image-webpack-loader` 作用于模块转换阶段(loader阶段),对图片资源进行压缩。 - **处理内容**: - `compression-webpack-plugin`:处理任意类型的静态文件(通常是JS、CSS、HTML),生成额外的压缩文件(如.gz)。 - `terser-webpack-plugin`:只处理JavaScript代码。 - `css-minimizer-webpack-plugin`:只处理CSS代码。 - `html-webpack-plugin`:主要处理HTML文件(生成和压缩)。 - `image-webpack-loader`:处理图片文件。 - **使用目的**: - `compression-webpack-plugin`:减少网络传输大小(需要服务器配置支持发送压缩文件)。 - `terser-webpack-plugin`:减少JS文件大小,提高执行效率。 - `css-minimizer-webpack-plugin`:减少CSS文件大小。 - `html-webpack-plugin`:生成HTML文件,并可选压缩HTML。 - `image-webpack-loader`:减少图片文件大小。 - **与其他工具的协作**: - `image-webpack-loader`通常与`file-loader`或`url-loader`一起使用,先压缩图片,然后由后者处理。 - `terser-webpack-plugin`和`css-minimizer-webpack-plugin`通常在webpack的`optimization.minimizer`数组中配置,用于覆盖webpack默认的压缩行为(特别是在production模式下)。 - `compression-webpack-plugin`是作为插件(plugins)添加的,它不修改原始文件,而是生成新的压缩文件。 - **压缩方式**: - `compression-webpack-plugin`:使用gzip、brotli等算法压缩整个文件。 - 其他工具都是通过去除不必要的字符、注释、空格,进行代码混淆或图片优化来减小文件大小。 在实际项目中,这些工具可以同时使用。例如: - 使用`image-webpack-loader`压缩图片。 - 使用`terser-webpack-plugin`压缩JS- 使用`css-minimizer-webpack-plugin`压缩CSS。 - 使用`html-webpack-plugin`生成并压缩HTML。 - 最后使用`compression-webpack-plugin`为生成的静态资源(JS、CSS、HTML)创建gzip版本。 需要注意的是,`html-webpack-plugin`的压缩功能是内置的(通过minify选项),而其他压缩工具需要单独安装和配置。 根据之前的引用: - 引用[1]提到了`compression-webpack-plugin`的使用。 - 引用[2]提到了`terser-webpack-plugin`用于压缩JS,并且当使用其他压缩插件(如压缩CSS的插件)时,需要配置`terser-webpack-plugin`来覆盖默认的JS压缩。 - 引用[3]提到了`TerserWebpackPlugin`(即`terser-webpack-plugin`)和`CssMinimizerPlugin`(即`css-minimizer-webpack-plugin`)一起使用。 - 引用[4]提到了`html-webpack-plugin`可以压缩HTML。 - 引用[5]没有直接相关,但提到了CSS分离的问题。 因此,我们可以这样总结: ### webpack中各类压缩工具的区别 在webpack构建流程中,不同类型资源的压缩由不同的插件或加载器完成,它们分别作用于不同的环节: #### 1. 文件类型与对应工具 | 文件类型 | 压缩工具 | 作用阶段 | |-----------------|-----------------------------------|------------------| | JavaScript | `terser-webpack-plugin` | 优化(optimization)阶段 | | CSS | `css-minimizer-webpack-plugin` | 优化阶段 | | HTML | `html-webpack-plugin` (minify选项)| 生成HTML阶段 | | 图片 | `image-webpack-loader` | 模块加载(loader)阶段 | | 静态资源(通用) | `compression-webpack-plugin` | 构建完成后 | #### 2. 详细说明 **JavaScript压缩 - terser-webpack-plugin** - 使用Terser库压缩JS代码,移除空格、注释、缩短变量名等[^2][^3]。 - 配置在`optimization.minimizer`中覆盖默认压缩行为[^2]。 - 支持多进程并行压缩提升速度[^3]。 **CSS压缩 - css-minimizer-webpack-plugin** - 基于cssnano压缩CSS,移除注释、空格、优化规则[^2][^3]。 - 同样配置在`optimization.minimizer`数组中。 - 注意:使用后会覆盖webpack默认的JS压缩,需同时配置`terser-webpack-plugin`[^2]。 **HTML压缩 - html-webpack-plugin** - 通过`minify`选项启用HTML压缩(如移除空格、属性引号等)[^4]。 - 不依赖额外插件,内置使用`html-minifier-terser`。 **图片压缩 - image-webpack-loader** - 在图片资源被处理前进行压缩(支持JPEG/PNG/GIF等)[^5]。 - 作为loader配置在模块规则中,需搭配`file-loader`或`url-loader`使用。 **网络传输压缩 - compression-webpack-plugin** - **与其他压缩工具本质区别**:生成额外的压缩文件(如.gz),不修改原始文件[^1]。 - 作用于构建完成后,为静态资源生成压缩版本,需服务器配合支持。 - 可配置多种算法(gzip/brotli)和压缩阈值。 #### 3. 典型配置示例 ```javascript // webpack.config.js const TerserPlugin = require('terser-webpack-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CompressionPlugin = require('compression-webpack-plugin'); module.exports = { // ...其他配置 module: { rules: [ { test: /\.(png|jpe?g|gif|svg)$/, use: [ 'file-loader', { loader: 'image-webpack-loader', options: { mozjpeg: { quality: 50 } } } ] } ] }, plugins: [ new HtmlWebpackPlugin({ minify: { // HTML压缩配置 collapseWhitespace: true, removeComments: true } }), new CompressionPlugin({ // gzip压缩 algorithm: 'gzip', test: /\.(js|css|html)$/ }) ], optimization: { minimizer: [ new TerserPlugin({ // JS压缩 parallel: true }), new CssMinimizerPlugin() // CSS压缩 ] } }; ``` #### 4. 选择建议 - 所有资源都应进行**内容级压缩**(JS/CSS/HTML/图片)以减小文件体积。 - 生产环境额外启用 **`compression-webpack-plugin`** 提升网络传输效率(需服务端支持)。 - 开发环境可禁用图片压缩等耗时操作以提升构建速度。 §§相关问题§§ 1. 如何验证`compression-webpack-plugin`生成的gzip文件是否有效? 2. `css-minimizer-webpack-plugin`和`optimize-css-assets-webpack-plugin`有何区别? 3.webpack配置中同时使用多个压缩工具会有什么性能影响? </think>### Webpack 压缩工具详解及区别 在 Webpack 打包流程中,各类压缩工具针对不同资源进行优化。下表总结了核心差异: | **工具名称** | **压缩对象** | **工作原理** | **输出结果** | **典型配置位置** | |-------------------------------|---------------------|------------------------------------------------|------------------------------|--------------------------| | `compression-webpack-plugin` | 已构建的静态资源文件 | 生成额外的压缩版本(如 .gz) | 原始文件 + 压缩副本 | `plugins` 数组 | | `terser-webpack-plugin` | JavaScript 代码 | 代码混淆、删除空格/注释、Tree Shaking | 压缩后的 JS 文件 | `optimization.minimizer` | | `css-minimizer-webpack-plugin` | CSS 代码 | 删除空格/注释、合并样式规则 | 压缩后的 CSS 文件 | `optimization.minimizer` | | `html-webpack-plugin` | HTML 文件 | 删除空格/注释/冗余属性 | 压缩后的 HTML 文件 | `plugins` 数组 | | `image-webpack-loader` | 图片资源 | 无损压缩算法优化像素数据 | 压缩后的图片文件 | `module.rules` 加载器链 | --- #### 1. **compression-webpack-plugin** - **用途**:为构建产物生成压缩副本(如 .gz 文件),需服务器配合启用压缩传输 - **特点**: - 不修改原始文件,生成额外压缩版本[^1] - 支持多种压缩算法(gzip/brotli) - **配置示例**: ```javascript const CompressionPlugin = require('compression-webpack-plugin'); module.exports = { plugins: [ new CompressionPlugin({ algorithm: 'gzip', test: /\.(js|css|html)$/, threshold: 10240, // 仅压缩 >10KB 的文件 }) ] } ``` #### 2. **terser-webpack-plugin** - **用途**:专用 JavaScript 代码压缩工具 - **特点**: - 默认在生产模式启用[^2][^3] - 支持 ES6+ 语法、多进程压缩 - 通过 Tree Shaking 删除未使用代码 - **关键配置**: ```javascript optimization: { minimizer: [ new TerserPlugin({ parallel: true, // 启用多进程 terserOptions: { compress: { drop_console: true } // 删除console } }) ] } ``` #### 3. **css-minimizer-webpack-plugin** - **用途**:专用 CSS 代码压缩工具 - **特点**: - 基于 cssnano 实现深度优化[^3] - 需手动配置(不像 JS 默认启用) - **注意事项**: 使用后会覆盖默认 JS 压缩,需同时配置 `terser-webpack-plugin`[^2] #### 4. **html-webpack-plugin** - **用途**:HTML 文件生成与压缩 - **特点**: - 压缩通过 `minify` 选项启用[^4] - 可基于模板生成 HTML - **配置示例**: ```javascript new HtmlWebpackPlugin({ minify: { collapseWhitespace: true, // 删除空格 removeComments: true // 删除注释 }, template: './src/index.ejs' // 支持多种模板 }) ``` #### 5. **image-webpack-loader** - **用途**:图片资源无损压缩 - **特点**: - 集成 mozjpeg/pngquant 等算法[^5] - 需在 file-loader 前调用 - **配置示例**: ```javascript module: { rules: [{ test: /\.(png|jpe?g)$/, use: [ 'file-loader', { loader: 'image-webpack-loader', options: { mozjpeg: { quality: 50 } // JPEG质量降至50% } } ] }] } ``` --- ### 组合使用策略 典型生产环境配置: ```javascript // webpack.prod.js module.exports = { optimization: { minimizer: [ new TerserPlugin(), // JS压缩 new CssMinimizerPlugin() // CSS压缩 ] }, plugins: [ new HtmlWebpackPlugin({ // HTML压缩 minify: { /* 配置 */ } }), new CompressionPlugin() // Gzip压缩 ], module: { rules: [{ test: /\.(png|jpe?g)$/, use: ['file-loader', 'image-webpack-loader'] // 图片压缩 }] } } ``` > **重要提示**:开发环境建议禁用资源压缩(如通过 `disable: process.env.NODE_ENV === 'development'`)以提升构建速度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值