本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2021-08-09 | 编程技术 | 4778 次阅读 | 等你评论 | 0 次点赞 | 繁体

提到网站访问速度,合理运用 PJAX 无刷新访问技术、Lazyload 图片懒加载以及 Service Workers 浏览器缓存,这些技术的加持大大提升了网站的访问体验。

图片alt

在了解关于 Service Worker 的实现方式后,这里就大概的介绍一下如何在自己的博客 / 网站中启用 Service Worker 这项技术来达到减少服务器请求的负担压力。( Service Worker 并非专门为缓存而设计,它还可以解决 Web 应用推送、后台长计算等问题 )

教程

Service Workers 要求必须在 HTTPS 下才能运行,这是大前提。

1、下载保存 sw-toolbox.js 文件到主题目录下(静态文件存放的目录),例如 assets 目录之下。

https://cdn.jsdelivr.net/gh/GoogleChromeLabs/sw-toolbox/sw-toolbox.js

2、如下创建缓存规则,保存为 serviceworker.js 并存放到网站根目录。

'use strict';

(function () {
    'use strict';
    /**
    * Service Worker Toolbox caching
    */

    var cacheVersion = '-toolbox-v1';
    var dynamicVendorCacheName = 'dynamic-vendor' + cacheVersion;
    var staticVendorCacheName = 'static-vendor' + cacheVersion;
    var staticAssetsCacheName = 'static-assets' + cacheVersion;
    var contentCacheName = 'content' + cacheVersion;
    var maxEntries = 200;


    self.importScripts('usr/themes/VOID/assets/sw-toolbox.js');

    self.toolbox.options.debug = false;

    // 缓存本站静态文件
    self.toolbox.router.get('/usr/(.*)', self.toolbox.cacheFirst, {
        cache: {
            name: staticAssetsCacheName,
            maxEntries: maxEntries
        }
    });

    // 缓存 Gravatar 头像
    self.toolbox.router.get('/avatar/(.*)', self.toolbox.cacheFirst, {
        origin: /(secure\.gravatar\.com)/,
        cache: {
            name: staticVendorCacheName,
            maxEntries: maxEntries
        }
    });

    // 缓存 Google 字体
    self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {
        origin: /(fonts\.googleapis\.com)/,
        cache: {
            name: staticVendorCacheName,
            maxEntries: maxEntries
        }
    });
    self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {
        origin: /(fonts\.gstatic\.com)/,
        cache: {
            name: staticVendorCacheName,
            maxEntries: maxEntries
        }
    });

    // immediately activate this serviceworker
    self.addEventListener('install', function (event) {
        return event.waitUntil(self.skipWaiting());
    });

    self.addEventListener('activate', function (event) {
        return event.waitUntil(self.clients.claim());
    });

})();

这里需要说明的是:

1、Service Worker 不适用于缓存头为 Cache-control: no-store 或者 no-cache 的文件;
2、 typecho 涉及到的主题及插件都集中存放在 usr 目录,因此上面的缓存规则针对 usr 目录下的所有文件。大家可以依据自己情况调整。
3、在主题的 footer.php 文件闭合标签 </body> 之前加入下面的代码:

<script>
    var serviceWorkerUri = '/serviceworker.js';
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register(serviceWorkerUri).then(function() {
            if (navigator.serviceWorker.controller) {
                console.log('Service woker is registered and is controlling.');
            } else {
                console.log('Please reload this page to allow the service worker to handle network operations.');
            }
        }).catch(function(error) {
            console.log('ERROR: ' + error);
        });
    } else {
        console.log('Service workers are not supported in the current browser.');
    }
    // SW刷新判断,避免无限刷新
    let refreshing = false
    navigator.serviceWorker.addEventListener('controllerchange', () => {
      if (refreshing) {
        return
      }
      refreshing = true;
      window.location.reload();
    });
</script>

4、取消对 serviceworker.js 文件启用缓存

为了防止在浏览器需要请求新版本的 serviceworker.js 文件时,而文件自身被缓存的尴尬局面。这里可以给 serviceworker.js 文件单独指定缓存头 Cache-control: no-store 或 no-cache。

Nginx 配置在 server { 区域内追加内容如下:

# serviceworker.js 不设置缓存

location ~* /(.*)/serviceworker\.js {
    add_header Cache-Control no-cache;
    add_header Pragma no-cache;
    add_header Expires 0;
}

重启一下 Nginx

systemctl restart nginx.service

查看 Service Workers 状态

打开浏览器 F12 进入浏览器开发者模式,在 Application 应该就能找到 Service Workers。

图片alt

查看 Service Workers 效果

图片alt

具体效果表现在:
二次访问页面,符合缓存条件的文件请求会优先从 Service Worker 读取。本文主要介绍 Service Worker 功能的部分实现过程,它作为一款 Google 黑科技更多功能还是需要自己去挖掘 --> https://developers.google.com/web/fundamentals/primers/service-workers

标签: 加速前端骚操作

猜你喜欢
薅京东羊毛必备抓取Cookies教程
本文只介绍如何利用安卓手机浏览器获取京东 cookie 教程,具体为什么要获取 cookie 以及如何薅羊毛请查看:闲置服务器薅京东的羊毛—青龙面板部署与京东签到第一步,下载工具去各大应用商店搜...
Lazysizes.js图片懒加载的使用
lazysizes 是一种快速(无垃圾),对 SEO 友好且可自动初始化的 lazyloader,用于图像(包括响应图像 picture/ srcset),iframe,脚本/小部件等。它还通过...
typecho使用文件缓存加快打开速度
typecho 是一个伪静态的博客系统,如果不使用缓存,每次打开页面都会查询数据库,访问人数多了以后服务器压力倍增。但是,typecho 是一个 php 的程序,我们可以利用 php 将实时页面...
白嫖移动,联通,电信手机短信通知
无论在生活中或者工作中,对于一些比较紧急的事情,可能需要发送个通知!比如:自建的服务器突然宕机,如何自动发短信通知运维主管?后台服务日志大量报错如何第一时间发短信通知码农geigei?类似的情景...
通用的检测到广告屏蔽插件进行弹窗提示实现方法
用的 js 方法来检测,按理说所有博客都能使用,就是在打开网页的时候进行一次判断。如果发现没有加载广告代码,就会出来一个弹窗来提示浏览者将本站加到广告拦截插件的白名单里面。别喷我,个人站长经营实...
如何找回微信已过期文件教程
现在基本人人都会使用微信,微信里面保存着很多文件。但是过段时间去看,你可能由于当时没有保存或者根本就没有点开过,微信文件名称显示红色,这表示已经过期了。难道我们要再问别人重发一遍吗?这可能会有点...
javascript | 原生JS多语言切换简单实现
由于项目需要实现一个前端的多语言切换,不想因为一个简单的功能就引入 jQuery,所以经过 google 编程大法摸索出一个原生 JS 就可以实现的多语言前端切换的小例子,仅供参考。<bo...
反爬虫的极致手段,几行代码直接炸了爬虫服务器
作为一个站长,你是不是对爬虫不胜其烦?爬虫天天来爬,速度又快,频率又高,服务器的大量资源被白白浪费。 看这篇文章的你有福了,我们今天一起来报复一下爬虫,直接把爬虫的服务器给干死机。 **本
让 macOS 终端走代理的四种方法
# 介绍 当我们在使用小飞机的时候浏览器可以实现代理,但是 macOS 系统下终端仍然不走代理,下面提供的四种办法优点在于简单直接,并且影响面很小(只对当前终端有效)。 # 方法 1
mysql 已有大数据量表进行分区踩坑
### 一、背景 mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错: ``` ERROR 1659 (HY000): Field '**'
Web 加载速度优化清单,让你的网站快上加快
网页加载速度是衡量一个网页好坏的重要标准,网页遗弃率随网页加载时间的增加而增加。据说近一半的用户希望网页加载时间不超过 2s,超过 3s 一般就放弃该网页。时间就是生命,干等着,谁愿意平白无故地 +1
(首次提交评论需审核通过才会显示,请勿重复提交)