Webpack中的文件指紋:給資源戴上個“名牌”


你是否想過,當你修改代碼后,瀏覽器為什么仍然拿著舊版資源不放?秘密就在于——文件指紋!簡單來說,文件指紋就像給每個構建出來的文件貼上獨一無二的“姓名牌”,告訴瀏覽器:“嘿,我更新啦,換下舊貨吧!”


文件指紋到底是什么?

文件指紋(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.pswp.cn/web/75549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75549.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python可變對象與不可變對象

文章目錄 Python 中的可變對象與不可變對象不可變對象(Immutable Objects)可變對象(Mutable Objects)重要區別 Python 中的可變對象與不可變對象 在 Python 中,對象可以分為可變對象(mutable)和不可變對象(immutable),這是 Python 中非常重要的概念&…

DeepSeek私有化部署性能怎么樣?企業級AI落地實戰解析!

1. 私有化部署是什么?為什么企業需要它? 很多公司在考慮用AI時都會問:“DeepSeek私有化部署性能怎么樣?能不能在我們自己的服務器上跑?” 私有化部署的意思就是把AI模型裝在你自己的機房或者云服務器上,而…

SQL學習--基礎語法學習

SQL和excle對比 學習目標 單表查詢 項目背景 SQL 練習環境 SQL Online Compiler - Next gen SQL Editor 商品信息表:https://study-zhibo.oss-cn-shanghai.aliyuncs.com/test/%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF%E8%A1%A8.csv 訂單明細表:https://…

【Docker基礎-網絡】--查閱筆記4

目錄 Docker 網絡網絡類型none 網絡host 網絡bridge 網絡自定義網絡 容器間通信IP 通信Docker DNS Serverjoined 容器 容器與外部通信容器訪問外部外部訪問容器 Docker 網絡 學習Docker提供的幾種原生網絡如何創建自定義網絡容器間通信,容器于外界交互 Docker 安裝…

GPT模型架構與文本生成技術深度解析

核心發現概述 本文通過系統分析OpenAI的GPT系列模型架構,揭示其基于Transformer解碼器的核心設計原理與文本生成機制。研究顯示,GPT模型通過自回歸機制實現上下文感知的序列生成,其堆疊式解碼器結構配合創新的位置編碼方案,可有效…

AWTK-MVVM 如何讓多個View復用一個Model記錄+關于app_conf的踩坑

前言 有這么一個業務,主界面點擊應用窗口進入聲納顯示界面,聲納顯示界面再通過按鈕進入菜單界面,菜單界面有很多關于該聲納顯示界面的設置項,比如量程,增益,時間顯示,亮度,對比度等…

CrystalDiskInfo電腦硬盤監控工具 v9.6.0中文綠色便攜版

前言 CrystalDiskInfo是一個不用花錢的硬盤小幫手軟件,它可以幫你看看你的電腦硬盤工作得怎么樣,健不健康。這個軟件能顯示硬盤的溫度高不高、還有多少地方沒用、傳輸東西快不快等等好多信息。用了它,你就能很容易地知道硬盤現在是什么情況&…

數據分析-數據預處理

數據分析-數據預處理 處理重復值 duplicated( )查找重復值 import pandas as pd apd.DataFrame(data[[A,19],[B,19],[C,20],[A,19],[C,20]],columns[name,age]) print(a) print(--------------------------) aa.duplicated() print(a)只判斷全局不判斷每個 any() import p…

如何用海倫公式快速判斷點在直線的哪一側

一、海倫公式的定義與推導 1. 海倫公式的定義 海倫公式(Heron’s Formula)是用于計算三角形面積的一種方法,適用于已知三角形三邊長度的情況。公式如下: S s ( s ? a ) ( s ? b ) ( s ? c ) S \sqrt{s(s - a)(s - b)(s - c…

python推箱子游戲

,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…

使用Python建模量子隧穿

引言 量子隧穿是量子力學中的一個非常有趣且令人神往的現象。在經典物理學中,我們通常認為粒子必須克服一個勢壘才能通過它。但是,在量子力學中,粒子有時可以“穿越”一個勢壘,即使它的能量不足以克服這個勢壘。這種現象被稱為“量子隧穿”。今天,我們將通過 Python 來建…

Vuex Actions 多參數傳遞的解決方案及介紹

Vuex Actions 多參數傳遞的解決方案及介紹 引言 在Vuex狀態管理模式中,Actions 扮演著至關重要的角色。它主要用于處理異步操作,并且可以提交 Mutations 來修改全局狀態。然而,在實際開發中,我們常常會遇到需要向 Actions 傳遞多…

設計模式 --- 策略模式

?策略模式(Strategy Pattern)是一種 ??行為型設計模式??,用于動態切換算法或策略??,使得算法可以獨立于客戶端變化。它通過封裝算法策略并使其可互換,提升了系統的靈活性和擴展性,尤其適用于需要多種…

【論文閱讀】RMA: Rapid Motor Adaptation for Legged Robots

Paper: https://arxiv.org/abs/2107.04034Project: https://ashish-kmr.github.io/rma-legged-robots/Code: https://github.com/antonilo/rl_locomotion訓練環境:Raisim 1.方法 RMA(Rapid Motor Adaptation)算法通過兩階段訓練實現四足機器…

QQ風格客服聊天窗口

QQ風格客服聊天窗口 展示引入方式 展示 引入方式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

【家政平臺開發(37)】家政平臺蛻變記:性能優化與代碼重構揭秘

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

PostgreSQL 的 COPY 命令

PostgreSQL 的 COPY 命令 PostgreSQL 的 COPY 命令是高效數據導入導出的核心工具&#xff0c;性能遠超常規 INSERT 語句。以下是 COPY 命令的深度解析&#xff1a; 一 COPY 命令基礎 1.1 基本語法對比 命令類型語法示例執行位置文件訪問權限服務器端COPYCOPY table FROM /p…

Sa-Token 自定義插件 —— SPI 機制講解(一)

前言 博主在使用 Sa-Token 框架的過程中&#xff0c;越用越感嘆框架設計的精妙。于是&#xff0c;最近在學習如何給 Sa-Token 貢獻自定義框架。為 Sa-Token 的開源盡一份微不足道的力量。我將分三篇文章從 0 到 1 講解如何為 Sa-Token 自定義一個插件&#xff0c;這一集將是前沿…

論文精度:基于LVNet的高效混合架構:多幀紅外小目標檢測新突破

論文地址:https://arxiv.org/pdf/2503.02220 目錄 一、論文背景與結構 1.1 研究背景 1.2 論文結構 二、核心創新點解讀 2.1 三大創新突破 2.2 創新結構原理 2.2.1 多尺度CNN前端 2.2.2 視頻Transformer設計 三、代碼復現指南 3.1 環境配置 3.2 數據集準備 3.3 訓…