webpack与浏览器缓存(Caching)

0.jpg

环境准备

因为浏览器缓存这一块相对于前面的讲解较独立,所以我们重新搭建一下业务代码,并对webpack配置做简单的修改

// index.js
import _ from 'lodash'
import $ from 'jquery'
const dom = $('div')
dom.html(_.join(['hello', 'world'], ' '))
 $('body').append(dom)

这个时候执行打包呢,控制台会报一些警告,我们可以在webpack.common配置中将performance设为false,可以看下官网这个参数的意思哈,其实就是关于打包性能的,我们可以自定义一些警告的阈值,另外我们为了避免干扰,暂时将production模式下的source map关掉,然后执行打包,生成如下目录

|--dist
  |--index.html
  |--main.js
  |--vendors~main.chunk.js

然后我们配置splitChunks.cacheGroups.vendors

vendors: {
    test: /[\\/]node_modules[\\/]/,
    priority: -10,
    name: 'vendors'
}

再打包生成如下目录

|--dist
  |--index.html
  |--main.js
  |--vendors.chunk.js

上面的配置都讲过,可以回顾一下,这样我们就把准备环境搭建起来了。

浏览器缓存

我们最终打包出来的文件是要放到服务器上的,现在我们先在本地运行一下打包好的index.html,打开network做监控,会发现当运行页面时会加载下面这样的资源

network.PNG

我们加载页面后,会加载两个js文件,当我们再次刷新页面的时候,其实这两个js文件已被保存在缓存里了,我们是取的缓存
假设,现在修改了js源代码,重新做了打包,再次放到服务器上运行,那么我们做普通页面刷新(区别于强制刷新),看到的将还是旧代码,因为我们的文件名字都没有变化,再次访问还是会从缓存里面取,这就存在了问题,为了解决这一问题,我们引入下面的概念

content Hash

我们将output中的filenamechunkFilename分别提取到dev和prod配置中,其中本地的还取原来的值就可以,因为本地我们每次都是单独打包单独运行,包括热模块更新都会帮我们解决浏览器的缓存问题,但是生产模式下使我们需要解决的,我们将其配置成下面这样

    output: {
        filename: '[name].[contenthash].js',
        chunkFilename: '[name].[contenthash].js'
    }

其中的contentHash和name一样是一个出口的占位符,其含义顾明思义是当文件内容改变才发生改变,他是根据'content'生成的一个hash字符串,我们先来打包试试
我们可以看到哈,生成的文件中,假如了hash字符串这样的内容,我们刚才说只要文件内容不变,那么hash就不会变,下面我们验证一下,我们不改变文件内容,直接打包,这时候对比上次的hash,发现并没有变化,这就意味我们我们不改变源代码直接打包上线,文件名不发生变化,是会取缓存的。
下面我们对源代码做一下改变,然后重新打包,我们发现,main的hash变了,但是vendors的hsah没有变化,因为我们的vendors里面放置的lodashjquery两个库,这两个库没有变化,所以他的hash也不会变,这时候如果做代码上线,我们就会对main.js做重新加载,而对vendors取本地缓存
contentHash这种形式,可以做到,重新打包代码上线的时候,用户只更新有变化的代码,没有变化的代码用户可以直接用本地缓存

对于老版本webapck V4

如果你使用的webpack4的版本比较老,可能会出现即使你没有修改文件内容,但hash依然改变的情况,为解决这以问题,你需要在optimization中配置runtimeChunk

runtimeChunk: {
  name: 'runtime'
}

这样打包的内容不变hash就不会变了,但这时候会新生成一个runtime.js的文件,这是因为

manifest

我们已经知道,业务代码存在于main中,第三方库代码存在于vendors中,但是库和业务逻辑之间也是有关联的,这个关联就是manifest,默认manifest是存在于main也存在于vendors中的,在不同版本的webapck中,manifest可能有差异,(可能存在content不改变改变manifest改变,从而影响其他文件改变)这就导致了上面出现的,旧版本webpack4中,即使没有改变content,hash也会改变。当我们配置了runtimeChunk就会吧manifest中的代码提出来到runtime.js中,这样的话,main和vendors相对独立一点,就不会出现上面的问题了。当然了,新版本的webpack也是可以配置的,大家不放试一试,不过新版本可以不用配置。

总结

这节简单讲了讲webpack和浏览器缓存之间的关系,讲解了contenthash的意义和用法,同时也将了关于旧版本webapck中处理方式,其实对于最新版本的webpack来说,是不用太多配置的,大家知道如何处理老版本的问题后,还是建议把webpack版本升到最新~这样就能享受更多的API了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361