首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第5章 样式处理
5.1 分离样式文件
5.1.1 extract-text-webpack-plugin
5.1.2 多样式文件的处理
5.1.3 mini-css-extract-plugin
5.2 样式预处理
5.2.1 Sass与SCSS
5.2.2 Less
5.3 PostCSS
5.3.1 PostCSS与Webpack
5.3.2 自动前缀
5.3.3 stylelint
5.3.4 CSSNext
5.4 CSS Modules
第6章 代码分片
6.1 通过入口划分代码
6.2 CommonsChunkPlugin
6.2.1 提取vendor
6.2.2 设置提取范围
6.2.3 设置提取规则
6.2.4 hash与长效缓存
6.2.5 CommonsChunkPlugin的不足
6.3 optimization.SplitChunks
6.3.1 从命令式到声明式
6.3.2 默认的异步提取
6.3.3 配置
6.4 资源异步加载
6.4.1 import()
6.4.2 异步chunk的配置
第7章 生产环境配置
7.1 环境配置的封装
7.2 开启production模式
7.3 环境变量
7.4 source-map
7.4.1 source-map原理
7.4.2 source-map配置
7.4.3 source-map安全
7.5 资源压缩
7.5.1 压缩JavaScript
7.5.2 压缩CSS
7.6 缓存
7.6.1 资源hash
7.6.2 输出动态HTML
7.6.3 使chunk id更稳定
7.7 bundle体积监控和分析
第8章 打包优化
8.1 HappyPack
8.1.1 工作原理
8.1.2 单个loader的优化
8.1.3 多个loader的优化
8.2 缩小打包作用域
8.2.1 exclude和include
8.2.2 noParse
8.2.3 IgnorePlugin
8.2.4 缓存
8.3 动态链接库与DllPlugin
8.3.1 vendor配置
8.3.2 vendor打包
8.3.3 链接到业务代码
8.3.4 潜在问题
8.4 去除死代码
8.4.1 ES6 Module
8.4.2 使用Webpack进行依赖关系构建
8.4.3 使用压缩工具去除死代码
当前位置:
首页>>
技术小册>>
Webpack实战:入门、进阶与调优(中)
小册名称:Webpack实战:入门、进阶与调优(中)
### 8.3.2 Vendor 打包:优化策略与实践 在Webpack的构建流程中,vendor打包是一个关键的优化步骤,它涉及到将项目依赖的第三方库(如React、Vue、Lodash等)从业务代码中分离出来,单独打包成一个或多个bundle文件。这种做法不仅可以减小主业务包的体积,提高加载速度,还能实现缓存的有效利用,即当第三方库版本未变时,用户无需重复下载,只需加载更新的业务代码即可。本节将深入探讨vendor打包的原理、实现方法、最佳实践以及可能遇到的挑战与解决方案。 #### 8.3.2.1 理解Vendor打包的必要性 - **减少主包体积**:业务代码与第三方库分离,使得主业务包更加轻量,有利于快速加载和渲染。 - **提升缓存效率**:由于第三方库更新频率远低于业务代码,将其单独打包可以最大化利用浏览器缓存,减少重复下载。 - **便于并行加载**:现代浏览器支持多个HTTP/2连接并行下载资源,vendor包和业务包可以并行加载,进一步缩短页面加载时间。 #### 8.3.2.2 实现Vendor打包 ##### 使用`entry`配置 在Webpack配置中,可以通过`entry`字段明确指定需要分离成vendor包的依赖。这种方式简单直观,但手动管理依赖可能较为繁琐,尤其是在项目依赖众多且频繁变动的情况下。 ```javascript module.exports = { entry: { main: './src/index.js', // 业务代码入口 vendor: ['react', 'react-dom'] // 第三方库作为vendor入口 }, // 其他配置... }; ``` ##### 利用`SplitChunksPlugin` 从Webpack 4开始,`SplitChunksPlugin`被内置用于代码分割,包括自动分离第三方库到vendor包。通过合理配置`optimization.splitChunks`,Webpack可以智能地分析模块依赖关系,自动将符合条件的模块打包进vendor包。 ```javascript module.exports = { optimization: { splitChunks: { chunks: 'all', // 启用对所有类型模块的分包 minSize: 20000, // 形成一个新代码块之前所需要的最小体积 maxSize: 0, // 生成代码块的最大体积,超过会尝试进行分割 minChunks: 1, // 被至少n个chunk共享时才会被分离 maxAsyncRequests: 30, // 按需加载时并行请求的最大数目 maxInitialRequests: 30, // 一个入口点下的最大并行请求数 automaticNameDelimiter: '~', // 生成的名称中的连接符 cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, // 匹配node_modules下的模块 priority: -10, // 优先级 filename: 'vendors.bundle.js' // 打包后的文件名 } } } }, // 其他配置... }; ``` #### 8.3.2.3 最佳实践 1. **合理配置`SplitChunksPlugin`**:根据项目实际情况调整`minSize`、`minChunks`等参数,以达到最佳的分割效果。 2. **利用动态导入**:对于非首屏必需的第三方库,可以考虑使用Webpack的动态导入(`import()`语法)来延迟加载,进一步减少初始加载时间。 3. **监控包体积**:定期使用Webpack Bundle Analyzer等工具分析打包结果,确保vendor包没有包含不必要的代码,特别是避免业务代码被错误地打包进vendor包。 4. **考虑代码压缩**:虽然压缩不是直接针对vendor打包的,但合理的压缩配置(如使用TerserPlugin)可以进一步减小vendor包的大小。 5. **使用CDN**:对于常用的、体积较大的第三方库,考虑通过CDN加载,减轻服务器压力,同时利用CDN的广泛分布提高加载速度。 #### 8.3.2.4 挑战与解决方案 **挑战一:第三方库版本更新频繁** - **解决方案**:使用锁文件(如`yarn.lock`或`package-lock.json`)来锁定项目依赖的具体版本,减少因依赖更新导致的缓存失效问题。同时,定期评估并更新依赖库,保持项目的健壮性和安全性。 **挑战二:vendor包体积过大** - **解决方案**:深入分析vendor包内容,移除不必要的依赖或寻找更轻量级的替代方案。同时,利用Tree Shaking(树摇)特性,确保未使用的代码被剔除。 **挑战三:动态导入与代码分割的复杂性** - **解决方案**:合理规划代码分割策略,避免过度分割导致加载性能下降。对于动态导入的模块,确保其按需加载,同时考虑加载时机和加载顺序,避免用户交互时出现延迟。 **挑战四:浏览器缓存策略的影响** - **解决方案**:合理配置Webpack的`output.filename`或`output.chunkFilename`,结合Content Hash(内容哈希)为打包文件生成唯一的文件名,确保每次更新后都能被浏览器识别为新的资源,从而触发重新下载。同时,利用HTTP缓存头部(如`Cache-Control`)来优化缓存策略。 综上所述,vendor打包是Webpack项目中不可或缺的优化手段之一。通过合理配置和最佳实践,我们可以有效减小打包体积、提升加载速度、优化缓存策略,从而为用户提供更加流畅的使用体验。
上一篇:
8.3.1 vendor配置
下一篇:
8.3.3 链接到业务代码
该分类下的相关小册推荐:
全解webpack前端开发环境定制
Webpack实战:入门、进阶与调优(上)
Webpack零基础入门
webpack指南
Webpack实战:入门、进阶与调优(下)