文件指纹

550 阅读1分钟

index.51727db.js中51727db就是一个文件指纹,文件指纹的作用有两种:

  • 版本管理:版本发布时,不同的版本对应不同的文件指纹(只要文件有修改)。
  • 控制缓存:当文件修改后,文件指纹就会改变,从而获取最新内容,不会取缓存。没有修改的文件会继续取缓存。

一、文件指纹的类别

一共有三种:

  • Hash:和整个项目的构建有关,如果项目中有文件更改,整个项目的hash值都会改变。

  • Chunkhash:根据不同的entry进行文件解析,依赖分析,构建不同的chunk,生成不同的hash值,在实际的开发中,将公共库和程序入口区分开,生成不同的chunk,公共库的文件改变不会影响程序入口的hash,无法和热更新一起使用

  • ContentHash:根据文件的内容生成hash,内容不变,hash不变。

js使用Chunkhash,css使用ContentHash,因为如果都是用Chunkhash,一旦js改变,css没有改变,css文件的hash也会跟着改变。而css使用ContentHash,只要文件内容没有改变,hash就不会改变。

Hash和ContentHash默认是md5生成的,32位。

二、占位符的类别

  • [hash]

  • [contenthash]

  • [ext]:文件的扩展名

  • [name]:文件的名称

  • [path]:文件的绝对路径

  • [folder]:文件所在的文件夹

  • [emoji]:一个随机的代之文件内容的emoji。

例子:

const path = require("path");const HtmlWebpacPlugin = require("html-webpack-plugin");const MiniCssExtractPlugin = require("mini-css-extract-plugin");module.exports = {  mode: "development",  entry: "./src/index.js",  output: {    path: path.join(__dirname, "dist"),    filename: "[name]_[chunkhash:8].js",  },  module: {    rules: [      {        test: /\.css/,        use: [MiniCssExtractPlugin.loader, "css-loader"],      },      {        test: /\.js$/,        use: "babel-loader",      },      {        test: /\.(jpg|png|jpeg|gif)$/,        use: {          loader: "file-loader",          options: {            name: "[name]_[hash].[ext]",            outputPath: "imgs/",          },        },      },    ],  },  plugins: [    new HtmlWebpacPlugin({ template: "./src/index.html" }),    new MiniCssExtractPlugin({ filename: "[name]_[contenthash:8].css" }),  ],};