由于最近开发的个人博客(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 缓存

一步一步的了解webpack4的splitChunk插件

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

您可能感兴趣的文章:详解浏览器缓存和webpack缓存配置

浅谈Webpack 持久化缓存实践

webpack学习笔记之优化缓存、合并、懒加载

webpack进阶——缓存与独立打包的用法

webpack独立打包和缓存处理详解

express给html设置缓存,webpack+express实现文件精确缓存的示例代码相关推荐

  1. express给html设置缓存,webpack + express 实现文件精确缓存

    由于最近开发的个人博客(Vue + node)在使用过程中,发现网络加载有点慢,所以打算对它进行一次优化.本次优化的目标如下: index.html 设置成 no-cache,这样每次请求的时候都会比 ...

  2. 大厂都拿捏的缓存方案,平台级分布式缓存,什么业务才合适?

    所有程序猿都对那缓存并不陌生,好似那风一样的女子只为你独自而舞.只见那回眸一笑百媚生,让你甚是吝惜,惹人怜爱. 但随着项目规模不断增大变强,光是单个缓存就难以招架,优而显得力不从心. 这时伴随着多级缓 ...

  3. 如何使用Node.js,Express和MongoDB设置GraphQL服务器

    by Leonardo Maldonado 莱昂纳多·马尔多纳多(Leonardo Maldonado) 如何使用Node.js,Express和MongoDB设置GraphQL服务器 (How to ...

  4. node ,express框架后台设置跨域操作,路由中间件

    express项目入口文件下app.js 设置跨域操作 app.all('*', function(req, res, next) { res.header("Access-Control- ...

  5. webpack打包缓存_【第835期】Webpack 的静态资源持久缓存

    原标题:[第835期]Webpack 的静态资源持久缓存 前言 你现在还在休假吗?早读课节前以web pack漫谈结尾,今年就以web pack开始吧.今日早读文章由众成翻译@yanni4night带 ...

  6. express路由子路由器_使用Express在Node中构建您的第一个路由器

    express路由子路由器 本文最初发布在Okta开发人员博客上 . 感谢您支持使SitePoint成为可能的合作伙伴. 如果最近几年您使用Node进行过任何Web开发,那么您可能已经使用过Expre ...

  7. github nodejs mysql_GitHub - lizhuohaicode/express: nodejs服务端开发(Express+Mysql)---小k博客...

    nodejs服务端开发(Express+Mysql) 项目展示 git clone git@github.com:htmlk/express.git 2.再导入express.sql到数据库,数据库名 ...

  8. express,multer,jQuery前端后端上传单个文件

    文章目录 先安装基本的模块 附上multer的github当中别人汉化的API文档 开始创建基本express(上传图片) 测试是否正常 前端部分 前端需要注意的 multer使用 multer({} ...

  9. Express框架学习记录一:Express框架基础使用

    Express框架 一.什么是Express框架 二.安装Express 三.框架的使用 1.监听get/post请求 2.获取 URL 中携带的查询参数 四.中间件 1.use中间件 2.中间件的作 ...

最新文章

  1. 人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码
  2. 2018-3-9 论文(网络评论中非结构化信息表示与研究)笔记---模糊认知图的形式化表示
  3. K - 迷宫问题 POJ - 3984
  4. java 实现 DES加密 解密算法
  5. 光标定位在文本框的末尾
  6. STM32实现IAP功能之一
  7. 电脑系统哪个最好用_什么除湿机好用_家用除湿机哪个牌子最好用-装修攻略
  8. android一句话搞定图片加载
  9. Activity 模版样式简介
  10. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
  11. CSS单位em是相对于父元素还是当前元素的字体大小?
  12. AltiumDesigner14.3.X下载安装破解教程
  13. excel提取身份证出生日期_Excel如何从身份证号码中提取年龄
  14. 国足亚洲杯首败的背后:与韩国队只差一个孙兴民?
  15. 多线程:synchronized关键字解析
  16. office常用技巧总结【word篇】
  17. C#实现HDMI音视频采集和处理
  18. Android应用权限大全(Manifest.permission)
  19. 二叉树前序遍历执行过程
  20. 00.奇特的一生--序言(笔记)

热门文章

  1. 这个城市的外卖小哥注意了!必须穿上特定马甲 违反交规逃逸将被追罚
  2. 日照私家驾车族必看之摄像头和测速器地点
  3. 08年最佳短篇小说《误解》
  4. java httpresponse headres属性,Http Header里的Content-Type - 飞鸿影~ - 博客园
  5. 创科视觉软件说明书_【拓斯达 | GGII】20192023年中国机器视觉行业调研
  6. setnx是原子操作吗_Redis面试七连问,你能扛得住吗?
  7. 准备写一本协议方面的书,谁赞成,谁反对?
  8. 【flink】Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死
  9. 95-910-165-源码-FlinkSQL-Flink SQL 中的时间属性
  10. 【Flink】Flink keyed State多年的误解 以及 Keyed state redistribute