webpack+express实现文件精确缓存的示例代码


Posted in Javascript onJune 11, 2020

由于最近开发的个人博客(Vue + node)在使用过程中,发现网络加载有点慢,所以打算对它进行一次优化。本次优化的目标如下:

  • index.html 设置成 no-cache,这样每次请求的时候都会比对一下 index.html 文件有没变化,如果没变化就使用缓存,有变化就使用新的 index.html 文件。
  • 其他所有文件一律使用长缓存,例如设置成缓存一年 maxAge: 1000 * 60 * 60 * 24 * 365。
  • 前端代码使用 webpack 打包,根据文件内容生成对应的文件名,每次重新打包时只有内容发生了变化,文件名才会发生变化。

以上三点结合,就能实现文件的精确缓存。

换句话说,在一年内,如果我的个人博客没有进行任何更新,那同一台电脑在这段时间内访问网站不会发起任何请求;如果有某个文件更新了,只会请求新的文件,旧的文件依旧从缓存读取。

小知识:

  • max-age: 设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。在这个时间前,浏览器读取文件不会发出新请求,而是直接使用缓存。
  • 指定 no-cache 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。

webpack 打包

根据文件内容生成文件名

通过配置 output 的 filename 属性可以实现这个需求。filename 属性的值选项中有一个 [contenthash],它将根据文件内容创建出唯一 hash。当文件内容发生变化时,[contenthash] 也会发生变化。

output: {
 filename: '[name].[contenthash].js',
 chunkFilename: '[name].[contenthash].js',
 path: path.resolve(__dirname, '../dist'),
},

提取第三方库

由于引入的第三方库一般都比较稳定,不会经常改变。所以将它们单独提取出来,作为长期缓存是一个更好的选择。
这里需要使用 webpack4 的 splitChunk 插件 cacheGroups 选项。

optimization: {
  runtimeChunk: {
  name: 'manifest' // 将 webpack 的 runtime 代码拆分为一个单独的 chunk。
 },
 splitChunks: {
  cacheGroups: {
   vendor: {
    name: 'chunk-vendors',
    test: /[\\/]node_modules[\\/]/,
    priority: -10,
    chunks: 'initial'
   },
   common: {
    name: 'chunk-common',
    minChunks: 2,
    priority: -20,
    chunks: 'initial',
    reuseExistingChunk: true
   }
  },
 }
},
  • test: 用于控制哪些模块被这个缓存组匹配到。原封不动传递出去的话,它默认会选择所有的模块。可以传递的值类型:RegExp、String和Function;
  • priority:表示抽取权重,数字越大表示优先级越高。因为一个 module 可能会满足多个 cacheGroups 的条件,那么抽取到哪个就由权重最高的说了算;
  • reuseExistingChunk:表示是否使用已有的 chunk,如果为 true 则表示如果当前的 chunk 包含的模块已经被抽取出去了,那么将不会重新生成新的。
  • minChunks(默认是1):在分割之前,这个代码块最小应该被引用的次数(译注:保证代码块复用性,默认配置的策略是不需要多次引用也可以被分割)
  • chunks (默认是async) :initial、async和all
  • name(打包的chunks的名字):字符串或者函数(函数可以根据条件自定义名字)

除了提取第三方库外,结合 Vue 使用 import 动态引入组件还能实现按需加载。

express 设置

app.use((req, res, next) => { // 将 index.html 设为 no-cache
  if(req.url == '/') {
   res.setHeader('Cache-control', 'no-cache')
  }

  next()
 })

 app.use(express.static('dist', {
  etag: false,
  maxAge: 1000 * 60 * 60 * 24 * 365, // 缓存一年
 })) // 将dist设为根目录

详细的代码可以看一下我的个人博客项目。

参考资料

到此这篇关于webpack+express实现文件精确缓存的示例代码的文章就介绍到这了,更多相关webpack+express文件精确缓存内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Use Word to Search for Files
Jun 15 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
Sep 08 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
Dec 11 Javascript
JS获取当前日期和时间的简单实例
Nov 19 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
May 19 Javascript
angularjs 表单密码验证自定义指令实现代码
Oct 27 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
Sep 17 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
javascript实现图片轮换动作方法
Aug 07 Javascript
详解vue 组件
Jun 11 #Javascript
vue实现员工信息录入功能
Jun 11 #Javascript
JavaScript Event Loop相关原理解析
Jun 10 #Javascript
vue Element左侧无限级菜单实现
Jun 10 #Javascript
详解用js代码触发dom事件的实现方案
Jun 10 #Javascript
Vue中key的作用示例代码详解
Jun 10 #Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 #Javascript
You might like
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
javascript中对对层的控制
2006/12/29 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python实现按中文排序的方法示例
2018/04/25 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
pycharm配置git(图文教程)
2019/08/16 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
大一军训感言
2014/01/09 职场文书
教师开学感言
2014/02/14 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
英语邀请函范文
2015/02/02 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python