Webpack中的文件指纹:给资源戴上个“名牌”

news2025/4/15 13:13:27

你是否想过,当你修改代码后,浏览器为什么仍然拿着旧版资源不放?秘密就在于——文件指纹!简单来说,文件指纹就像给每个构建出来的文件贴上独一无二的“姓名牌”,告诉浏览器:“嘿,我更新啦,换下旧货吧!”


文件指纹到底是什么?

文件指纹(File Fingerprinting)其实就是在文件名中附加一段由文件内容生成的哈希值。举个例子:

  • 旧版:app.js
  • 新版:app.3b8a1f2e.js

哈希值(如 3b8a1f2e)就像文件的身份证,只有内容真的发生变化,身份证才会“变脸”。这样就能让浏览器和CDN准确辨认出哪个版本是最新的。


为何我们需要文件指纹?

  1. 告别缓存乱象
    浏览器喜欢把东西缓存起来,但一不小心就用成了“老古董”。有了指纹,文件更新了,新的“身份证”就会迫使浏览器重新加载最新版本。

  2. CDN高效管理
    CDN节点依据URL来缓存文件,不同的指纹就代表不同的文件,确保用户拿到的都是最新鲜的资源。

  3. 版本管理更轻松
    就像手机APP版本号一样,文件指纹有助于追踪每次小改动,便于日后排查问题。

  4. 长期缓存实现高性能加载
    只要文件内容不变,指纹也不变,这样用户就能一直利用缓存,提升加载速度。


Webpack中常见的指纹方式

Webpack提供了三种主要的哈希方式,让你在不同场景下选择最适合的:

1. Hash

  • 特点:基于整个构建过程生成一个统一哈希

  • 缺点:只要项目里任意文件变了,所有输出文件的指纹都会发生变化,相当于全家换新装

  • 示例配置

    output: {
      filename: '[name].[hash:8].js',
      path: __dirname + '/dist'
    }
    

2. Chunkhash

  • 特点:每个入口文件(或“块”)都有自己的哈希

  • 适用场景:多个页面、多个入口文件中,只有部分入口发生变化时,未改动入口文件的缓存可以完美保留

  • 示例配置

    output: {
      filename: '[name].[chunkhash:8].js',
      path: __dirname + '/dist'
    }
    

3. Contenthash

  • 特点:只根据文件内容生成哈希,如果内容不变,哈希绝不更新

  • 推荐:当前最理想的做法,特别适合用于需要长期缓存的静态资源

  • 示例配置

    output: {
      filename: '[name].[contenthash:8].js',
      path: __dirname + '/dist'
    }
    

在Webpack中配置文件指纹

JavaScript文件

直接在output配置中使用指纹:

module.exports = {
  output: {
    filename: '[name].[contenthash:8].js',
    chunkFilename: '[name].[contenthash:8].chunk.js',
    path: __dirname + '/dist'
  }
}

CSS文件

配合mini-css-extract-plugin插件来使用指纹,注意新版Webpack中建议使用[contenthash]来确保CSS文件仅在实际改动时更新:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash:8].css',
      chunkFilename: '[name].[contenthash:8].chunk.css'
    })
  ]
}

图片、字体等资源

对于这类静态资源,如果你使用的是旧版本Webpack,可以借助file-loader,格式如下:

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/,
        use: [{
          loader: 'file-loader',
          options: {
            name: '[name].[hash:8].[ext]'
          }
        }]
      }
    ]
  }
}

小提示: 从Webpack 5开始,已经内置了资源模块(Asset Modules)功能,可以省去安装file-loader的烦恼哦!


最佳实践和一些纠正

  1. 只在生产环境使用指纹
    开发阶段追求快速反馈,不需要每次构建都重新生成长长的文件名,毕竟调试时只关心“有木有改!”

  2. 保证哈希长度适中
    通常8位哈希已足够,既简洁又能保证冲突率低。

  3. 固定模块ID防止无谓哈希变化
    如果发现文件内容没变但指纹却变了,可能是模块ID在不断变化。旧做法是使用HashedModuleIdsPlugin,而在Webpack 5中,更推荐使用内置的确定性算法:

    optimization: {
      moduleIds: 'deterministic',
      runtimeChunk: 'single'
    }
    
  4. CSS与JS分开缓存
    为了避免CSS和JS文件因打包不同步导致的缓存混乱,确保它们分别使用contenthash。就像让两个好基友各自管理自己的家庭事务。

  5. 合理拆分代码
    切记,把几乎不变的库代码(vendor)、偶尔更新的业务代码和常变的运行时代码分离开来。示例如下:

    optimization: {
      splitChunks: {
        cacheGroups: {
          vendor: {
            test: /[\\/]node_modules[\\/]/,
            name: 'vendors',
            chunks: 'all'
          }
        }
      },
      runtimeChunk: 'single'
    }
    

    这样一来,就算你修改了一点点业务逻辑,其他部分依然能“坐享其成”,高速加载不是梦!


总结

文件指纹就像是给你的资源穿上了“高科技外衣”,不仅能让浏览器和CDN精确识别文件版本,还能避免因缓存问题带来的各种麻烦。无论是Hash、Chunkhash还是Contenthash,各有千秋,你只需选出最适合你项目的那一款。快乐构建,从有“名牌”的资源开始!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBuilderX中uni-app打包Android(apk)全流程超详细打包

一、Android生成打包证书 1、Android平台签名证书(.keystore)生成指南_android 签名生成-CSDN博客(如果不上架应用商店可以跳过,可以使用云端证书) 二、打开manifest.json配置基础设置 三、配置安卓应用图标 四、配置安卓启动页图片 五、…

多模态大模型重塑自动驾驶:技术融合与实践路径全解析

目录 1、 引言:AI与自动驾驶的革命性融合 2、五大领先多模态模型解析 2.1 Qwen2.5-Omni:全模态集大成者 2.2. LLaVA:视觉语言理解专家 2.3. Qwen2-VL:长视频理解能手 2.4. X-InstructBLIP:跨模态理解框架 2.5. …

vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值。

项目场景&#xff1a; <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …

OFDM CP 对解码影响

OFDM符号间会存在ISI&#xff0c;为了解决该问题在符号间插入了循环前缀&#xff0c;可以说这个发明是OFDM能够实用的关键&#xff0c;在多径信道中CP可以有效的解决符号间干扰。3GPP中对于不同SCS 定义了不同的CP长度&#xff1a; 5G Cyclic Prefix (CP) Design -5G Physical …

Vue3.5 企业级管理系统实战(十四):动态主题切换

动态主题切换是针对用户体验的常见的功能之一&#xff0c;我们可以自己实现如暗黑模式、明亮模式的切换&#xff0c;也可以利用 Element Plus 默认支持的强大动态主题方案实现。这里我们探讨的是后者通过 CSS 变量设置的方案。 1 组件准备 1.1 修改 Navbar 组件 在 src/layo…

解决Ubuntu20.04安装ROS2的问题(操作记录)

一、ROS 系统安装版本选择 每版的Ubuntu系统版本都有与之对应ROS版本&#xff0c;每一版ROS都有其对应版本的Ubuntu版本&#xff0c;切记不可随便装。ROS 和Ubuntu之间的版本对应关系如下&#xff1a;&#xff08; 可以从这个网站查看ROS2的各个发行版本的介绍信息。&#xff…

C# 设置Excel中文本的对齐方式、换行、和旋转

在 Excel 中&#xff0c;对齐、换行和旋转是用于设置单元格内容显示方式的功能。合理的设置这些文本选项可以帮助用户更好地组织和展示 Excel 表格中的数据&#xff0c;使表格更加清晰、易读&#xff0c;提高数据的可视化效果。本文将介绍如何在.NET 程序中通过C# 设置Excel单元…

RPA VS AI Agent

图片来源网络 RPA&#xff08;机器人流程自动化&#xff09;和AI Agent&#xff08;人工智能代理&#xff09;在自动化和智能化领域各自扮演着重要角色&#xff0c;但它们之间存在显著的区别。以下是对两者区别的详细分析&#xff1a; 一、定义与核心功能 RPA&#xff08;机…

uniapp大文件分包

1. 在pages.json中配置 "subPackages":[{"root":pagesUser,"pages":[{"path":mine/xxx,"style":xxx },{"path":mine/xxx,"style":xxx}]},{"root":pagesIndex,"pages":[{"p…

Spark-core编程

sortByKey 函数说明 join 函数说明 leftOuterJoin 函数说明 cogroup 函数说明 RDD行动算子&#xff1a; 行动算子就是会触发action的算子&#xff0c;触发action的含义就是真正的计算数据。 reduce 函数说明 collect 函数说明 foreach 函数说明 count 函数说明 first …

2025年的Android NDK 快速开发入门

十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三&#xff1a;Android Studio的NDK开发》&#xff0c;今天看来已经发生了很多变化&#xff0c;NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。 **原生开发套件 (NDK) **是一套工具&#xff0c;使开发者能…

基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)

基于springboot的“嗨玩旅游网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…

React 之 Redux 第三十一节 useDispatch() 和 useSelector()使用以及详细案例

使用 Redux 实现购物车案例 由于 redux 5.0 已经将 createStore 废弃&#xff0c;我们需要先将 reduxjs/toolkit 安装一下&#xff1b; yarn add reduxjs/toolkit// 或者 npm install reduxjs/toolkit使用 vite 创建 React 项目时候 配置路径别名 &#xff1a; // 第一种写法…

Llama 4全面评测:官方数据亮眼,社区测试显不足之处

引言 2025年4月&#xff0c;Meta正式发布了全新的Llama 4系列模型&#xff0c;这标志着Llama生态系统进入了一个全新的时代。Llama 4不仅是Meta首个原生多模态模型&#xff0c;还采用了混合专家(MoE)架构&#xff0c;并提供了前所未有的上下文长度支持。本文将详细介绍Llama 4…

【C++】函数直接返回bool值和返回bool变量差异

函数直接返回bool值和返回bool变量差异 背景 在工作中遇到一个比较诡异的问题&#xff0c;场景是给业务方提供的SDK有一个获取状态的函数GetStatus&#xff0c;函数的返回值类型是bool&#xff0c;在测试过程中发现&#xff0c;SDK返回的是false&#xff0c;但是业务方拿到的…

第1节:计算机视觉发展简史

计算机视觉与图像分类概述&#xff1a;计算机视觉发展简史 计算机视觉&#xff08;Computer Vision&#xff09;作为人工智能领域的重要分支&#xff0c;是一门研究如何使机器"看"的科学&#xff0c;更具体地说&#xff0c;是指用摄影机和计算机代替人眼对目标进行识…

英伟达Llama-3.1-Nemotron-Ultra-253B-v1语言模型论文快读:FFN Fusion

FFN Fusion: Rethinking Sequential Computation in Large Language Models 代表模型&#xff1a;Llama-3.1-Nemotron-Ultra-253B-v1 1. 摘要 本文介绍了一种名为 FFN Fusion 的架构优化技术&#xff0c;旨在通过识别和利用自然并行化机会来减少大型语言模型&#xff08;LLM…

云曦月末断网考核复现

Web 先看一个BUUCTF中的文件一个上传题 [BUUCTF] 2020新生赛 Upload 打开后是一个文件上传页面 随便上传一个txt一句话木马后出现js弹窗&#xff0c;提示只能上传图片格式文件 说明有前端验证。我的做法是把一句话改为.jpg格式&#xff0c; 然后上传 访问发现虽然上传成功了…

Flutter常用组件实践

Flutter常用组件实践 1、MaterialApp 和 Center(组件居中)2、Scaffold3、Container(容器)4、BoxDecoration(装饰器)5、Column(纵向布局)及Icon(图标)6、Column/Row(横向/横向布局)+CloseButton/BackButton/IconButton(简单按钮)7、Expanded和Flexible8、Stack和Po…

0.机器学习基础

0.人工智能概述&#xff1a; &#xff08;1&#xff09;必备三要素&#xff1a; 数据算法计算力 CPU、GPU、TPUGPU和CPU对比&#xff1a; GPU主要适合计算密集型任务&#xff1b;CPU主要适合I/O密集型任务&#xff1b; 【笔试问题】什么类型程序适合在GPU上运行&#xff1…