终极修炼人

终极修炼人 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

终极修炼人 赞了文章 · 2019-12-18

【达生科技】解决 Web 缓存的 Python 脚本

解决 Web 缓存的 Python 脚本

web cache killer

源码地址

作用

  • 通过脚本,为文件中的 URL 添加版本号,解决移动端使用缓存,不显示最新效果的问题。
  • 添加后缀为「js」「html」「css」「png」「jpg」「jpeg」链接的版本号。

定位

  • vue 脚手架本身就自带这个功能,gulp 也有类似的功能。为什么要重复造轮子?
  • 因为 vue,gulp 等,需要 npm 下载各种依赖包。对于只有几个页面的微小型项目。为此添加脚手架性价比不高。
  • 本脚本不需要添加任何依赖。在 linux 和 mac 等自带 python 环境的系统中,可直接运行。简单便捷。
  • 本脚本可以放在 linux 中,结合 jenkins 发布系统等,进行自动化发布。

原理

  • 通过在 URL 链接中添加版本号,让浏览器当做全新的资源。绕过浏览器缓存,从服务器重新获取文件。以解决缓存问题。
  • 版本号添加的是,文件对应的 hash 值。故文件内容未发生变化时。URL 将不会发生变化。会复用浏览器中缓存的文件。合理利用缓存。
  • 工具只会添加目标文件夹中存在的文件,的链接。因为通常访问的外部链接,是第三方资源,不会轻易改变,故不存在缓存问题。

使用方法

注意,工具会在源文件中进行替换,注意备份源文件。否则会被污染。

python changeVersion.py '目前文件夹绝对路径'

代码解析

  • 递归遍历目标文件夹中的所有文件。
  • 用字典(或者叫对象)保存每个文件的「文件名」及「文件内容hash」。
  • 再次递归遍历目标文件夹中的所有文件。
  • 遍历文件内容,通过正则匹配里面所有的 URL,通过「文件名」查询前面保存的字典,是否有对应的 hash 值。
  • 如果有 hash 值,则证明该文件是内部文件,可能被改动,往 URL 中添加版本号,version=${hash}。以解决文件缓存问题。
  • 由于版本号是通过文件内容的hash,故文件内容未发生变化时。URL 将不会发生变化。会复用浏览器中缓存的文件。

关于缓存的友情链接

查看原文

赞 2 收藏 1 评论 1

终极修炼人 关注了用户 · 2019-12-18

关注 58

终极修炼人 关注了用户 · 2019-12-18

前端小伙子 @qianduanxiaohuo

关注 1

终极修炼人 收藏了文章 · 2019-12-18

【达生科技】突破浏览器域名并发限制的解决方案

背景

拿Chrome浏览器来说,同域名下资源加载的最大并发连接数为6,当资源文件大于6时,多于6个的文件就会进入待定,等第一批加载完才会加载第二批的6个图片资源,这样就增加了等待时间。无形中就增加用户加载网页等待的时间。

waiting.jpeg

思考

对于这种并发限制,可以有什么方法来解决这种问题呢?
既然最大并发数为6,那我们就把N个资源URL替换成N/6个不同域名,这样就有N/6个最大并发可以同时发生了。
先来看看我们处理前后的比对情况吧。

效果展示

本文拿图片加载来举例【具体的资源加载时间因不同设备不同网速而不同,仅供参考】


处理前

当一个网页的图片资源在同一个域名情况下加载,如图,30个图片总用时【1.11s】

waitFinish.jpeg

最后一个图片资源连接开始后的停转时间(即图片资源加载的等待响应时间)【357ms】

waitTime.png


处理后

同样的运行环境,同样的资源在多个域名(同一个ip)情况下加载,如图,30个图片总用时【424ms】

noWait.jpeg

最后一个图片资源连接开始后的停转时间【0.64ms】

noWaitTime.png


对比结果:在本示例中,同样的资源,同一个IP,处理资源加载域名限制后,速度可以优化【60%】。用最后一张加载的图片对比,连接开始后的停转时间优化比也达到【99.8%】


实现方法

  • 实现思路

    • 在DNS服务商中申请多个域名,指向同一个 IP 服务。
    • 对后台返回的数据进行域名处理,对图片链接,进行域名替换。
    • 域名替换完成后,通过 localStorage 进行 key / value 保存。以使得相同图片在下一次展示时,能使用浏览器缓存,而非重复加载。
  • 代码实现【本方法仅用在ajax回调中】 =》 示例代码如下:

        // 替换域名
        function replaceDomain(data) {
          let imgUrlObj = localStorage.getItem('imgUrlObj') || {} // 获取本地保存的图片链接,能正常使用缓存
          if (typeof(imgUrlObj) === 'string') { // 判断是否为JSON对象,不是则转换
            imgUrlObj = JSON.parse(imgUrlObj)
          }
          let index = Math.floor(Math.random() * 4.99) // 随机0-4的下标
          try {
            data = JSON.stringify(data)
            data = data.replace(/www\.baidu\.com\/image(.*?)(jpg|png|jpeg)/g, (...params) => { // 查找图片的url并对其进行操作
              let sourceUrl = params[1] + params[2] // 图片资源名称,未包含域名。如:整条图片链接为:www.baidu.com/image/123.png; 现保存为:/image/123.png
              if (!imgUrlObj[sourceUrl]) { // 未保存在本地,则新产生域名
                let imgUrl = `node${[1, 2, 3, 4, 5][index % 5]}.baidu.com/image/${sourceUrl}` // 域名替换,如:从 www.baidu.com 替换到 node1.baidu.com,node2.baidu.com
                imgUrlObj[sourceUrl] = imgUrl // 同时保存好新的域名,在这就体现了使用JSON对象的好处,图片资源路径名当key值,图片完整链接当value值
                localStorage.setItem('imgUrlObj', JSON.stringify(imgUrlObj))
                index++
                return imgUrl
              } else { // 保存到了本地,则直接使用localStorage的url
                return imgUrlObj[sourceUrl]
              }
            })
            data = JSON.parse(data)
          } catch (e) {
            console.log('replaceDomain error')
            console.log(e)
          }
          return data
        }
  • 另外,为了加快DNS解析,可以进行DNS预加载

    <!-- 配置 Mate 进行域名预加载 -->
    <!-- dns预加载 -->
    <link rel="dns-prefetch" href="//node1.baidu.com" />
    <link rel="dns-prefetch" href="//node2.baidu.com" />

完结,撒花

shuai.jpeg

查看原文

终极修炼人 赞了文章 · 2019-12-18

【达生科技】突破浏览器域名并发限制的解决方案

背景

拿Chrome浏览器来说,同域名下资源加载的最大并发连接数为6,当资源文件大于6时,多于6个的文件就会进入待定,等第一批加载完才会加载第二批的6个图片资源,这样就增加了等待时间。无形中就增加用户加载网页等待的时间。

waiting.jpeg

思考

对于这种并发限制,可以有什么方法来解决这种问题呢?
既然最大并发数为6,那我们就把N个资源URL替换成N/6个不同域名,这样就有N/6个最大并发可以同时发生了。
先来看看我们处理前后的比对情况吧。

效果展示

本文拿图片加载来举例【具体的资源加载时间因不同设备不同网速而不同,仅供参考】


处理前

当一个网页的图片资源在同一个域名情况下加载,如图,30个图片总用时【1.11s】

waitFinish.jpeg

最后一个图片资源连接开始后的停转时间(即图片资源加载的等待响应时间)【357ms】

waitTime.png


处理后

同样的运行环境,同样的资源在多个域名(同一个ip)情况下加载,如图,30个图片总用时【424ms】

noWait.jpeg

最后一个图片资源连接开始后的停转时间【0.64ms】

noWaitTime.png


对比结果:在本示例中,同样的资源,同一个IP,处理资源加载域名限制后,速度可以优化【60%】。用最后一张加载的图片对比,连接开始后的停转时间优化比也达到【99.8%】


实现方法

  • 实现思路

    • 在DNS服务商中申请多个域名,指向同一个 IP 服务。
    • 对后台返回的数据进行域名处理,对图片链接,进行域名替换。
    • 域名替换完成后,通过 localStorage 进行 key / value 保存。以使得相同图片在下一次展示时,能使用浏览器缓存,而非重复加载。
  • 代码实现【本方法仅用在ajax回调中】 =》 示例代码如下:

        // 替换域名
        function replaceDomain(data) {
          let imgUrlObj = localStorage.getItem('imgUrlObj') || {} // 获取本地保存的图片链接,能正常使用缓存
          if (typeof(imgUrlObj) === 'string') { // 判断是否为JSON对象,不是则转换
            imgUrlObj = JSON.parse(imgUrlObj)
          }
          let index = Math.floor(Math.random() * 4.99) // 随机0-4的下标
          try {
            data = JSON.stringify(data)
            data = data.replace(/www\.baidu\.com\/image(.*?)(jpg|png|jpeg)/g, (...params) => { // 查找图片的url并对其进行操作
              let sourceUrl = params[1] + params[2] // 图片资源名称,未包含域名。如:整条图片链接为:www.baidu.com/image/123.png; 现保存为:/image/123.png
              if (!imgUrlObj[sourceUrl]) { // 未保存在本地,则新产生域名
                let imgUrl = `node${[1, 2, 3, 4, 5][index % 5]}.baidu.com/image/${sourceUrl}` // 域名替换,如:从 www.baidu.com 替换到 node1.baidu.com,node2.baidu.com
                imgUrlObj[sourceUrl] = imgUrl // 同时保存好新的域名,在这就体现了使用JSON对象的好处,图片资源路径名当key值,图片完整链接当value值
                localStorage.setItem('imgUrlObj', JSON.stringify(imgUrlObj))
                index++
                return imgUrl
              } else { // 保存到了本地,则直接使用localStorage的url
                return imgUrlObj[sourceUrl]
              }
            })
            data = JSON.parse(data)
          } catch (e) {
            console.log('replaceDomain error')
            console.log(e)
          }
          return data
        }
  • 另外,为了加快DNS解析,可以进行DNS预加载

    <!-- 配置 Mate 进行域名预加载 -->
    <!-- dns预加载 -->
    <link rel="dns-prefetch" href="//node1.baidu.com" />
    <link rel="dns-prefetch" href="//node2.baidu.com" />

完结,撒花

shuai.jpeg

查看原文

赞 9 收藏 7 评论 4

终极修炼人 关注了用户 · 2019-12-11

捷叔叔 @mumu_59479fc466a4e

关注 1731

终极修炼人 关注了用户 · 2019-12-11

Chor @chor

关注 5806

终极修炼人 关注了用户 · 2019-12-11

湖人总冠军 @xuge

菜鸟与孤鹜齐飞

关注 720

终极修炼人 关注了用户 · 2019-12-11

程序员cxuan @cxuan

Java后端开发,欢迎关注个人微信公众号 Java建设者 及时关注最新技术文章。

关注 7322

终极修炼人 关注了专栏 · 2019-12-11

Springboot源码深度历险记

深入讲解Springboot源码,原创连载源码专题,让你对boot更加游刃有余! 关注师长的原创公众号【java进阶架构师】,回复【架构】领取2019架构师视频全套

关注 811

认证与成就

  • 获得 0 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-12-11
个人主页被 180 人浏览