通过ServiceWorker缓存静态资源提高网站访问速度

编程教程 > WEB (0) 2024-11-26 14:39:04

通常我们使用普通的自己的资源,可以通过Cache-Control 配置通知浏览器进行缓存,但是有些小站没有cdn资源,用了外站的cdn资源,速度一般又想提升用户体验,这个时候ServiceWorker缓存就有用武之地了。

下面是serviceWorker的实用案例,可以看到缓存后很快。

操作示例图-b280381f0c4440749611239d31e8d9a7.png

service worker 可让浏览器主动去缓存数据。这里通过Google以前的一个开源js库sw-toolbox来实现,虽然现在访问提示该库已经过时,又更好的workbox替代,但是从简洁度来说sw-toolbox 还算能用的。 

 

接下来讲解如何使用。

 

首先下载工具sw-toolbox.js

官网地址:https://googlechromelabs.github.io/sw-toolbox/

sw-toolbox工具GitHub开源地址:https://github.com/GoogleChromeLabs/sw-toolbox

 

编写sw-toolbox.js工具配置文件

文件名为 service-worker.js,并将该文件放于网站访问的根目录,例如:https://www.example.com/service-worker.js

特别注意:该配置文件一定要放根目录(后续尝试过放其他地方配置score都非常繁琐,根目录是最佳选择)

配置内容参考:

/**
 * google sw-toolbox配置文件
 */
'use strict';
(function () {
    'use strict';
    /**
     * Service Worker Toolbox caching
     */

    var cacheVersion = '-toolbox-v1';
    var staticVendorCacheName = 'static-vendor' + cacheVersion;
    var staticThirdVendorCacheName = 'static-third-vendor' + cacheVersion;
    var staticAssetsCacheName = 'static-assets' + cacheVersion;
    var maxEntries = 5000;
    //以下的网址请更换为博客地址(可以填写绝对链接或者相对链接)
    self.importScripts('/assets/libs/sw-toolbox/sw-toolbox.js');
    self.toolbox.options.debug = false;

    //添加图片静态资源,具体目录请自行更换
    self.toolbox.router.get('/assets/upload/(.*)', self.toolbox.cacheFirst, {
        cache: {
            name: staticAssetsCacheName,
            maxEntries: maxEntries
        }
    });
    //添加图片静态资源,具体目录请自行更换
    self.toolbox.router.get('/assets/(libs|web|img)/(.*)', self.toolbox.cacheFirst, {
        cache: {
            name: staticAssetsCacheName,
            maxEntries: maxEntries
        }
    });
    self.toolbox.router.get('/(.*)(.ico)', self.toolbox.cacheFirst, {
        cache: {
            name: staticAssetsCacheName,
            maxEntries: maxEntries
        }
    });

    //以下均为第三方/不同域名cdn资源缓存
    self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {
        origin: /static\.xqlee\.com/,
        cache: {
            name: staticVendorCacheName,
            maxEntries: maxEntries
        }
    });

    self.toolbox.router.get('/(.*)(.js)', self.toolbox.cacheFirst, {
        origin: /cdn\.bootcdn\.net/,
        cache: {
            name: staticThirdVendorCacheName,
            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());
    });

})();

 

内部表达式根据自己网站情况进行更改,其中有个配置self.toolbox.cacheFirst

这里表示缓存优先,一共有5个模式,采用那个根据自身情况来。

  • 网络优先 Network first 
  • 缓存优先 Cache first
  • 最快 Fastest(本地和网络请求同时进行,谁快用谁)
  • 只用缓存 Cache Only 
  • 只用网络 Network Only
  networkOnly: strategies.networkOnly,
  networkFirst: strategies.networkFirst,
  cacheOnly: strategies.cacheOnly,
  cacheFirst: strategies.cacheFirst,
  fastest: strategies.fastest,

 

网站网页引入service-worker.js配置

<script>
     var serviceWorkerUri = '/service-worker.js';
    if ('serviceWorker'in navigator) {
        navigator.serviceWorker.register(serviceWorkerUri).then(function() {
            if (navigator.serviceWorker.controller) {
                console.log('Assets cached by the controlling service worker.');
            } 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.');
    }
</script>

 

至此已经搞定了serviceworker相关配置,下面是验真

 

验证就十分繁琐了,这里讲解下思路

首先你的有一个域名,然后去腾讯云/阿里云申请一个免费的ssl证书

本地编辑hosts文件,将本地127.0.0.1映射到你的域名,然后通过nginx或者其他工具配置你上面的ssl证书和访问域名

本地调试看结果

over

 

 

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
通常使用普通的资源可以通过Cache-Control配置通知浏览器进行缓存,但是有些小站没有cdn资源,用了外站的cdn资源,速度一般又想提升用户体验,ServiceWorker缓存就有用武之地了。
mybatis事物访问数据库的一级缓存和二级缓存和刷新缓存
需求将静态资源如css/js/图片缓存到不用每次都到后端服务去拿取,减少性能消耗。 配置nginx缓存配置缓存文件存放信息在nginx配置文件,httpd内部配
spring data redis设置缓存的过期时间,spring data redis更新缓存的过期时间
Gmail 设置开启SMTP服务设置并查看所有设置切换到POP/IMP栏目启用IMPA,然后保存更改获取Google应用密钥直接使用gmail的账号密码是不行的
通过crontab 任务,定时reloadnginx -s reload
通过自定义ehcache缓存策略+自定义缓存事件来实现ehcahce中一个cache指定不同时间,且支持设定总缓存大小或数量。引入依赖&lt;dependency&gtl;
spring boot 开发技巧,在开发web项目中跳过thyemeleaf模板/js/css等缓存避免每次修改资源文件都需要重启服务器
       Ehcache 3.6 配置缓存过期时间,上一次写Ehcache缓存是3.3.0版本,没想到3.6.X的时候3.3版本的方式也弃用了       3.3版本ehcache参考:  ...
spring boot 1.5整合redis实现spring的缓存框架,spring boot,redis
spring boot 2.x设置静态资源缓存时间
java编程之Ehcache3.x 缓存过期时间Java配置demo
问题描述git 提交代码报错 :error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413导致原因1. 本...
Spring Boot 2.0 Redis整合,通过spring boot 2.0整合Redis作为spring缓存框架的实现。