一文入门Webpack文件指纹

目录
  • 什么是文件指纹
  • 文件指纹的作用
  • 文件指纹策略
    • 占位符介绍
  • 文件指纹的设置
    • JS文件指纹设置
    • 图片文件指纹设置
    • CSS文件指纹设置
    • 设置步骤
  • 文件指纹项目应用

什么是文件指纹

文件指纹是文件打包后输出的文件名的后缀,通常用来做一些文件的版本管理

文件指纹的作用

  • 用作版本管理时,如果一个项目需要发布,只需要发布修改过的文件指纹;
  • 对于没有修改过的文件,用户在访问的时候,依旧可以使用浏览器缓存好的,无需二次加载,加速页面访问。

文件指纹策略

  • Hash

和整个项目的构建相关,只要项目文件有修改,整个项目构建的hash值就会更改,并且全部文件都共用相同的hash值

  • Chunkhash

和webpack打包的chunk有关,不同的entyr会生成不同的Chunkhash值(一个页面的值改变了并不会影响另一个页面,js文件一般采用此方法),chunkhash和hash不一样,它根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值。我们在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响。

  • Contenthash

根据文件内容来定义hash,文件内容不变,则contenthash不变(css文件一般采用此方法)。

比如文件index.css被index.js引用了,所以共用相同的chunkhash值。但是这样子有个问题,如果index.js更改了代码,css文件就算内容没有任何改变,由于是该模块发生了改变,导致css文件会重复构建。
这个时候,我们可以使用extra-text-webpack-plugin里的contenthash值,保证即使css文件所处的模块里就算其他文件内容改变,只要css文件内容不变,那么不会重复构建。

hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值。如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CDN服务器从源服务器上拉取对应数据,进而更新本地缓存。但是在实际使用的时候,这几种hash计算还是有一定区别。

占位符介绍

占位符名称 定义
[ext] 资源后缀名
[name] 文件名称
[path] 文件的相对路径
[folder] 文件所在的文件夹
[contenthash] 文件的内容hash,默认是md5生成
[hash] 文件的内容hash,默认是md5生成
[emoji] 一个随机的指代文件内容的emoji

文件指纹的设置

根据不同的文件类型一般选择不同的文件指纹策略,通常情况下:

  • JS文件采用[chunkhash]文件指纹策略
  • CSS文件采用[contenthash]文件指纹策略
  • JS文件采用[hash]文件指纹策略

下面我们来介绍下几种用法

JS文件指纹设置

设置outputfilename,使用[chunkhash]chunkhash没办法和热更新一起使用的,不能与HotModuleReplacementPlugin这个插件一起使用,所以我们只在生产环境写。

output: {                               //打包输出文件
        path: path.join(__dirname, 'dist'),
        filename: '[name]_[chunkhash:8].js'	//chunkhash指纹策略,截取前面8个字符
    }

图片文件指纹设置

设置file-loadername,使用[hash]

module: {
        rules: [
            {
                test: /.(png|jpg|gif|jpeg)$/,
                use: {
                    loader: "url-loader",
                    options: {
                        name: '[name]_[hash:8].[ext]',
                        limit: 10240 //不超过10K时,将其转化为base64
                    }
                }
            },
    },

CSS文件指纹设置

CSS文件指纹策略比较特殊,我们需要用到MiniCssExtractPlugin,设置MiniCssExtractPluginfilename,使用[contenthash]

正常情况下,如果我们使用了style-loadercss-loader的话,那么这个css会由style-loadercss插入到style里面,并且放到head头部,此时并没有一个独立的css文件,因此,我们通常会采用MiniCssExtractPlugin,通过这个插件把这个style-loadercss提取成一个独立的文件,所以,对于这个css的文件指纹,我们会设置在这个MiniCssExtractPlugin里面,给它设置一个filename,并且给它设置一个[contenthash]

注意:MiniCssExtractPlugin这个插件没办法与style-loader一起使用,因为它们之间的功能是互斥的,所以需要将style-loader换成MiniCssExtractPlugin.loader

设置步骤

首先安装MiniCssExtractPlugin

npm i -D mini-css-extract-plugin

配置webpack.config.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
......
module.exports = {
        plugins: [
        new MiniCssExtractPlugin({
            filename: '[name][contenthash:8].css'
        })
    ],
}

文件指纹项目应用

webpack.config.js文件更名为webpack.dev.js并将内部的mode修改为development,再复制一份文件,更名为webpack.prod.jsmode修改为production

然后需要修改配置文件package.json区分production和development

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.prod.js",
    "watch": "webpack --watch --progress",
    "dev": "webpack-dev-server -config webpack.dev.js --open"
  }

完成上述步骤,我们在项目中就可以根据生产环境和开发环境不同,配置不同的文件指纹。

到此这篇关于一文入门Webpack文件指纹的文章就介绍到这了,更多相关Webpack文件指纹内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • webpack打包进度展示以及美化教程

    目录 介绍 准备 1.webpack.ProgressPlugin 2.progress-bar-webpack-plugin 3.webpackbar 结语 介绍 我们在自己搭建项目的时候,在打包构建的时候等待非常的枯燥,尤其是特别大不知道还要等多久才是最恐怖的,这时不妨找一款进度条插件,让我们不再焦躁下去,本期我们会推荐三款进度条插件给大家进行选择,找出或者改造喜欢的那一款来用到自己的项目中. 准备 我们既然要美化进度条就要考虑给他更改颜色.目前市面上给终端字符串上色最好用的还是chalk,

  • webpack源码中一些精妙的方法总结

    目录 前言 精妙方法 缓存函数 属性劫持 数组比较 配置项校验 结尾 前言 过年这一段时间一直在研究webpack的源码,由于过年周围气氛比较欢快,心态有点飘导致没有沉下心来仔细研究其中的细节.经过反思之后,静心重新捋顺webpack的源码,这时发现不少巧妙的方法值得学习.这里我已经迫不及待的跟大家分享了,希望对大家平常开发过程中有所帮助. 精妙方法 缓存函数 这个方法最精妙的地方在于将执行结果缓存,减少函数的重复执行以达到提升性能的目的,对于执行越复杂越耗时的函数收益越大.但是,不适用于动态执

  • webpack之基础打包优化的实现

    目录 前言 优化loader 压缩代码 gzip压缩 抽离公共依赖包 最后 前言 webpack至今已经发展了5个版本,如果你还不会webpack,那么赶紧学习起来吧.webpack是web前端开发人员必学的一个知识点.本篇文章带大家一起看看webpack基础的打包优化.话不多说,上酸菜~~~~ 优化loader 在脚手架项目中,想必各位开发人员都会用到预处理的css.比如sass.stylus.less这些预处理语言.我们知道使用这些预处理css必须要在webpack中配置相应的loader.

  • 一文入门Webpack文件指纹

    目录 什么是文件指纹 文件指纹的作用 文件指纹策略 占位符介绍 文件指纹的设置 JS文件指纹设置 图片文件指纹设置 CSS文件指纹设置 设置步骤 文件指纹项目应用 什么是文件指纹 文件指纹是文件打包后输出的文件名的后缀,通常用来做一些文件的版本管理 文件指纹的作用 用作版本管理时,如果一个项目需要发布,只需要发布修改过的文件指纹: 对于没有修改过的文件,用户在访问的时候,依旧可以使用浏览器缓存好的,无需二次加载,加速页面访问. 文件指纹策略 Hash 和整个项目的构建相关,只要项目文件有修改,整

  • Android中Java根据文件头获取文件类型的方法

    本文实例讲述了Android中Java根据文件头获取文件类型的方法.分享给大家供大家参考,具体如下: 前面讲过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其实,获取文件类型最好的办法便是根据文件头信息来判断.下面贴出相关代码: public class FileType { public static final HashMap<String, Str

  • webpack文件打包错误异常

    在进行webpack打包前我们要确保已完成的工作: 1)安装webpack:推荐全局命令 npm install -g webpack 查看webpack版本 webpack -v 2)此时对文件进行打包可能出现错误,提示脚手架文件错误,因为在webpack4的版本里,CLI被单独分离出来了所以要我们单独安装 执行全局命令 npm install -g webpack-cli 安装完脚手架,按理讲是可以使用webpack命令进行正常打包了. 使用webpack打包文件的一般语法为:(简书上面的w

  • Python一文入门Flask Blueprint SQLAlchemy部分详解

    目录 概述 安装准备 pipenv 开始实践 入口文件 路由 优化路由器 SQLAlchemy database类的定义 入口文件加载DB 模块中定义方法 在路由中的使用 SQLAlchemy实现mysql编码.列类型 默认值和索引设置 兼容Mysql列类型 自定义数据库名和字符集编码 概述 从安装Flask,pipenv 到路由实现,Blueprint.SQLAlchemy,一次简单实践,github地址,github.com/stark0824/s… 安装准备 python3 -V &&

  • python通过文件头判断文件类型

    对于提供上传的服务器,需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦. 分享代码如下 import struct # 支持文件类型 # 用16进制字符串的目的是可以知道文件头是多少字节 # 各种文件头的长度不一样,少半2字符,长则8字符 def typeList(): return { "52617221": EXT_RAR, "504B0304": EXT_ZIP} # 字节码转16进制字符串 def byt

  • php通过文件头检测文件类型通用代码类(zip,rar等)

    有时候我们这样做还不完善.可能有些人上存一些文件,但是他通过修改扩展名,让在我们的文件类型之内. 单实际访问时候又不能展示(因为扩展名与文件内容不符).下面这个php类,可能能够给我们带来帮助.一.php检测类 首先说明下,上面文件头与文件类型映射关系来自网上,如果你有新的文件需要检查,只需要将映射加入即可. 如果你需要知道文件头信息,可以通过工具:winhex打开标准文件查找.如: 代码: 复制代码 代码如下: <?php /*通过文件名,获得文件类型* *@author chengmo* *

  • .net文件上传时实现通过文件头确认文件类型的方法

    本文实例讲述了.net文件上传时实现通过文件头确认文件类型的方法,其中 script 用来返回给页面的数据,读者还可以根据自身需要对相关部分自行修改.另外,文件头也可以自行添加定义. 主要代码如下: AppCode/FileUpload.cs using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; using

  • php 读取文件头判断文件类型的实现代码

    php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀.案例: 复制代码 代码如下: <?php $filename = "11.jpg";//为图片的路径可以用d:/upload/11.jpg等绝对路径$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);$strInfo = @unpack("C2chars", $bin);$

  • PHP如何根据文件头检测文件类型实例代码

    前言 什么是文件头部Bom? 说白了,就是在保存文件的时候,文件前面会多出一串隐藏的字符,文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息.如用uestudio以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信息.同理jpg文件状况有FF D8 FF E0 xx xx 4A 46这样的十六进制信息,其实这此十六进制都是表示一些特殊字条. php怎么样验证文件类型? 先来看一个简单的方法: <?php function

  • 一文探索Java文件读写更高效方式

    目录 背景 场景分析 场景1:小文件单文件压缩 方式1:网上流传(流传在坊间的神话,其实是带刺的玫瑰) 方式2:使用缓冲区 方式3:使用通道 方式4:使用mmp 场景2:大文件单文件压缩 场景3:大文件多文件压缩 分析结论 背后机密 1.网上流传方法 2.使用缓冲区 3.使用通道 4.使用mmp 背景 最近在探秘kafka为什么如此快?其背后的秘诀又是什么? 怀着好奇之心,开始像剥洋葱 一样逐层内嵌.一步步揭晓kafka能够吊打mq的真因.了解之后不得不说kafka:yyds. 了解到顺序存盘的

随机推荐