• 打包后输出的文件名的后缀
    • 比如:image.png
    • 作用:便于版本管理

文件指纹策略作用于服务的增量更新。

增量更新是指在进行更新操作时,只更新需要改变的地方,不需要更新或者已经更新过的地方则不会重复更新,增量更新与完全更新相对。 这种更新的概念应用范围比较广泛,凡是需要进行数据更新的地方都会用到,如软件更新、数据库更新、杀毒软件的病毒库更新、CMS 更新和路由表更新等。

占位符

Webpack 为此提供占位符。这些字符串用于将特定信息附加到 Webpack 输出。

占位符 含义
[ext] 资源后缀名
[name] 文件名称
[path] 文件的相对路径
[folder] 文件所在的文件夹
[contenthash] 文件的内容发生变化时变更,默认是 md5 生成
[hash] 项目每次构建都会变更,默认是 md5 生成
[chunkhash] webpack 打包的 chunk 发生变化时变更,默认是 md5 生成
[emoji] 一个随机的指代文件内容的 emoji

hash、chunkhash、contenthash 如何生成

  • Hash:和整个项目的构建相关,只要项目文件有修改,整个项目构建的 hash 值就会更改
  • Chunkhash:和 webpack 打包的 chunk 有关,不同的 entry 会生成不同的 chunkhash 值
  • Contenthash:根据文件内容来定义 hash,文件内容不变,则 contenthash 不变

JS 一般使用 chunkHash css 一般使用 contentHash 图片 一般使用 hash

JS文件指纹的设置

  • 设置 output 的 filename,使用[chunkhash] ```javascript // webpack.config.js ‘use strict’; const path = require(‘path’); const webpack = require(‘webpack’)

module.exports = { entry: { index: ‘./src/index.js’, search: ‘./src/search.js’, }, output: { path: path.join(__dirname, ‘dist’), filename: ‘[name][chunkhash:8].js’, }, }

  1. <a name="nknTw"></a>
  2. # CSS文件指纹的设置
  3. - 设置MiniCssExtractPlugin的filename
  4. - 下载包:`npm i mini-css-extract-plugin -D`
  5. - 使用contenthash
  6. - 前提:用`MiniCssExtractPlugin.loader`代替`style-loader`
  7. ```javascript
  8. // webpack.config.js
  9. 'use strict';
  10. const path = require('path');
  11. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  12. module.exports = {
  13. entry: {
  14. index: './src/index.js',
  15. search: './src/search.js',
  16. },
  17. output: {
  18. path: path.join(__dirname, 'dist'),
  19. filename: '[name][chunkhash:8].js',
  20. },
  21. module: {
  22. rules: [
  23. {
  24. test: /\.css$/,
  25. use: [MiniCssExtractPlugin.loader, 'css-loader']
  26. },
  27. {
  28. test: /\.less$/,
  29. use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'],
  30. },
  31. {
  32. test: /\.(scss|sass)$/,
  33. use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
  34. },
  35. ]
  36. },
  37. plugins: [
  38. new MiniCssExtractPlugin({
  39. filename: '[name][contenthash:8].css'
  40. }),
  41. ],
  42. mode: 'development',
  43. }

图片的文件指纹的设置

  • 设置file-loader的name,使用[hash] | 占位符的名称 | 含义 | | —- | —- | | [ext] | 资源后缀名 | | [name] | 文件名称 | | [path] | 文件相对路径 | | [folder] | 文件所在的文件夹 | | [contenthash] | 文件的内容hash,默认是md5生成 | | [hash] | 文件内容的hash,默认是md5生成 | | [emoji] | 一个随机的指代文件内容的emoji |
  1. 'use strict';
  2. const path = require('path');
  3. const webpack = require('webpack')
  4. module.exports = {
  5. entry: {
  6. index: './src/index.js',
  7. search: './src/search.js',
  8. },
  9. output: {
  10. path: path.join(__dirname, 'dist'),
  11. filename: '[name].js',
  12. },
  13. module: {
  14. rules: [
  15. {
  16. test: /\.(png|jpg|gif|jpeg|svg)$/,
  17. use: [
  18. {
  19. loader: 'file-loader',
  20. options: {
  21. name: 'img/[name][hash:8].[ext]'
  22. }
  23. }
  24. ]
  25. },
  26. ]
  27. },
  28. }

自动清理构建的目标产物

  • 问题:加了文件指纹后,每次更新的时候不会清理目标,造成构建的输出目录output出来的文件越来越多
  • 两种解决方法
    • 通过package.jsonscripts,添加命令行
      • rm -rf ./dist && webpackrimraf ./dist && webpack
    • 使用 clean-webpack-plugin
      • 默认删除output指定的输出目录
      • 下载包:cnpm i clean-webpack-plugin -D ```javascript ‘use strict’; const path = require(‘path’); const { CleanWebpackPlugin } = require(‘clean-webpack-plugin’);

module.exports = { plugins: [ new CleanWebpackPlugin() ], mode: ‘production’, } ```