首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第9章 开发环境调优
9.1 Webpack开发效率插件
9.1.1 webpack-dashboard
9.1.2 webpack-merge
9.1.3 speed-measure-webpack-plugin
9.1.4 size-plugin
9.2 模块热替换
9.2.1 开启HMR
9.2.2 HMR原理
9.2.3 HMR API示例
第10章 Webpack打包机制
10.1 总览
10.2 准备工作
10.3 缓存加载
10.4 模块打包
10.4.1 Compiler
10.4.2 Compilation
10.4.3 Resolver
10.4.4 Module Factory
10.4.5 Parser
10.4.6 模板渲染
10.5 深入Webpack插件
10.5.1 Tapable
10.5.2 插件的协同模式
第11章 实战案例
11.1 React应用
11.1.1 基础配置
11.1.2 JavaScript处理
11.1.3 TypeScript处理
11.1.4 样式处理
11.1.5 静态资源
11.1.6 多页应用公共代码优化
11.1.7 长效缓存
11.2 Vue应用
11.2.1 手动搭建Vue项目
11.2.2 通过@vue/cli搭建项目
第12章 更多JavaScript打包工具
12.1 Rollup
12.1.1 配置
12.1.2 Rollup去除死代码
12.1.3 可选的输出格式
12.1.4 使用Rollup构建JavaScript库
12.2 Parcel
12.2.1 打包速度
12.2.2 零配置
12.3 esbuild
12.3.1 打包速度
当前位置:
首页>>
技术小册>>
Webpack实战:入门、进阶与调优(下)
小册名称:Webpack实战:入门、进阶与调优(下)
### 11.1.5 静态资源管理在Webpack中的实践 在Web开发中,静态资源(如图片、字体、视频、CSS文件、JavaScript库等)的管理是构建过程中不可或缺的一环。Webpack作为一个现代JavaScript应用程序的静态模块打包器,提供了强大的功能来优化和处理这些静态资源。本章节将深入探讨Webpack中静态资源的管理策略,包括资源加载、缓存优化、分离提取以及动态导入等方面的内容。 #### 11.1.5.1 静态资源的加载与处理 ##### 1.1 文件加载器(Loaders) Webpack通过加载器(Loaders)来扩展其能力,使其能够处理非JavaScript文件(Webpack本身只理解JavaScript)。对于静态资源,常用的加载器包括: - **file-loader**:用于将文件发送到输出目录,并返回(相对)URL。这对于图片、字体等文件特别有用。 - **url-loader**:类似于file-loader,但能在文件很小的情况下将文件作为DataURL内联到代码中,减少HTTP请求。 - **css-loader**:处理CSS文件中的@import和url()语句,将CSS文件转化为CommonJS模块。 - **style-loader**:将模块的导出作为样式添加到DOM中,通常与css-loader结合使用。 ##### 示例配置 ```javascript module: { rules: [ { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', generator: { filename: 'images/[name][ext][query]', }, }, { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: 'asset/resource', generator: { filename: 'fonts/[name][ext][query]', }, }, ], } ``` 注意:从Webpack 5开始,`asset/resource` 和 `asset/inline` 替代了`file-loader`和`url-loader`的部分功能,提供了更简洁的配置方式。 #### 11.1.5.2 静态资源的缓存优化 为了提高网页加载速度,合理利用浏览器缓存是非常重要的。Webpack提供了几种机制来帮助我们优化静态资源的缓存策略。 ##### 2.1 内容哈希(ContentHash) 在Webpack的输出文件名中包含内容的哈希值,可以确保只有在文件内容改变时,文件名才会变化,从而允许浏览器缓存未更改的文件。这可以通过在output配置中使用`[contenthash]`占位符来实现。 ```javascript output: { filename: '[name].[contenthash].js', chunkFilename: '[name].[contenthash].js', clean: true, // Webpack 5+ 清理/dist 文件夹 } ``` ##### 2.2 缓存组(SplitChunks) 通过配置`optimization.splitChunks`,Webpack可以将第三方库或公共模块分离到单独的bundle中,这些bundle的更新频率通常低于应用程序代码,因此可以长时间缓存。 ```javascript optimization: { splitChunks: { chunks: 'all', minSize: 20000, maxSize: 0, minChunks: 1, maxInitialRequests: Infinity, automaticNameDelimiter: '~', enforceSizeThreshold: 50000, cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, priority: -10, filename: 'vendors.bundle.js', }, default: { minChunks: 2, priority: -20, reuseExistingChunk: true, }, }, }, } ``` #### 11.1.5.3 静态资源的分离提取 在某些情况下,将CSS或特定类型的资源从主JavaScript bundle中分离出来是有益的,这可以通过插件或特定的loader配置来实现。 ##### 3.1 CSS分离 使用`MiniCssExtractPlugin`可以将CSS从主bundle中分离出来,生成单独的CSS文件。这对于按需加载CSS或利用浏览器并行下载资源的能力非常有帮助。 ```javascript const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module: { rules: [ { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'], }, ], }, plugins: [ new MiniCssExtractPlugin({ filename: '[name].[contenthash].css', chunkFilename: '[id].[contenthash].css', }), ], ``` ##### 3.2 图片与字体分离 虽然Webpack的默认配置已经能够处理图片和字体的加载,但有时候我们可能希望将这些资源单独打包,以便于管理和缓存。这通常可以通过调整Webpack的output配置或使用专门的插件来实现。 #### 11.1.5.4 动态导入与代码分割 动态导入(Dynamic Imports)是ES2020标准的一部分,允许你按需加载模块。Webpack利用这一特性来实现代码分割,即根据路由或组件将代码分割成多个bundle,用户只下载当前路由或组件所需的代码。 ```javascript // 使用import()语法动态导入模块 button.onclick = e => import('./path/to/your/module').then(({ default: module }) => { // 使用module }); // 或者在React组件中 const LazyComponent = React.lazy(() => import('./LazyComponent')); function App() { return ( <React.Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </React.Suspense> ); } ``` 动态导入不仅减少了初始加载时间,还提高了应用的交互性和响应性。 #### 11.1.5.5 总结 静态资源的管理是Webpack构建过程中的一个重要环节,它直接影响到应用的加载速度和用户体验。通过合理配置加载器、优化缓存策略、分离提取资源以及利用动态导入和代码分割,我们可以有效地管理和优化静态资源,提升应用的性能和可维护性。在编写本书的过程中,我们深入探讨了Webpack在静态资源管理方面的各种技巧和最佳实践,希望这些内容能够帮助读者更好地理解和应用Webpack,构建出更加高效、可靠和可维护的Web应用程序。
上一篇:
11.1.4 样式处理
下一篇:
11.1.6 多页应用公共代码优化
该分类下的相关小册推荐:
webpack指南
Webpack实战:入门、进阶与调优(上)
全解webpack前端开发环境定制
Webpack零基础入门
Webpack实战:入门、进阶与调优(中)