JavaScript缓存之Service Worker && workbox

目录

[先来看看基础Service Worker](#先来看看基础Service Worker)

注册阶段

安装和激活

workbox

workbox-webpack-plugin

来看看结果


这次再做组件的库模式打包之后想着优化js加载,于是想到了大家用的并不是很多的Service Worker技术,这个技术类似于原生的离线包能力

先来看看基础Service Worker

注册阶段
javascript 复制代码
if ('serviceWorker' in navigator) {
  navigator.serviceWorker
    .register('/service-worker.js')
    .then(registration => {
      console.log(
        'ServiceWorker registration successful with scope: ',
        registration.scope
      )
    })
    .catch(err => {
      console.log('ServiceWorker registration failed: ', err)
    })
}

来看看registration信息

需要注意的是,Service Worker 脚本除了域名为 localhost 时能运行在 http 协议下以外,只能运行 https 协议下。

注册了一个 service worker,它工作在 worker 上下文,所以没有访问 DOM 的权限。

安装和激活
javascript 复制代码
const addResourcesToCache = async (resources) => {
  const cache = await caches.open("v1");
  await cache.addAll(resources);
};

self.addEventListener("install", (event) => {
  event.waitUntil(
    addResourcesToCache([
      "/",
      "/index.html",
      "/style.css",
      "/app.js",
      "/image-list.js",
      "/star-wars-logo.jpg",
      "/gallery/bountyHunters.jpg",
      "/gallery/myLittleVader.jpg",
      "/gallery/snowTroopers.jpg",
    ]),
  );
});

在安装的时候预缓存网站的静态资源

还有一些涉及service work的工作可以参考MDN文档,里面涉及的一些基本用法也有写。只是很多时候我们不会去直接使用,而是用成熟的框架来达到我们的目的!!


workbox

既然如此,我们最好是站在巨人的肩膀上,这个巨人就是谷歌。workbox 是由谷歌浏览器团队发布,用来协助创建 PWA 应用的 JavaScript 库。当然直接用 workbox 还是太复杂了,谷歌还很贴心的发布了一个 webpack 插件,能够自动生成 Service Worker 和 静态资源列表

workbox-webpack-plugin

添加 workbox-webpack-plugin 插件,然后调整 vue.config.js 文件(具体看自己工程配置):

javascript 复制代码
npm install workbox-webpack-plugin --save-dev

这里的urlPattern可以是链接也可以是正则匹配的规则路径等等

这样就可以直接达到我们的目的

来看看结果

看起来就是和localStroage的显示形式差不多,也可以理解成一种缓存策略,只不过是运用多线程的技术,让js更优雅


如果觉得有收获,麻烦给个赞和关注。你的鼓励是我写作的动力,大家一起学习一起进步。

相关推荐
龙在天20 小时前
ts中的函数重载
前端
卓伊凡20 小时前
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
前端
前端Hardy20 小时前
HTML&CSS: 谁懂啊!用代码 “擦去”图片雾气
前端·javascript·css
前端Hardy20 小时前
HTML&CSS:好精致的导航栏
前端·javascript·css
天下无贼20 小时前
【手写组件】 Vue3 + Uniapp 手写一个高颜值日历组件(含跨月补全+今日高亮+选中状态)
前端·vue.js
我是天龙_绍20 小时前
🔹🔹🔹 vue 通信方式 eventBus
前端
一个不爱写代码的瘦子21 小时前
迭代器和生成器
前端·javascript
拳打南山敬老院21 小时前
漫谈 MCP 构建之概念篇
前端·后端·aigc
前端老鹰21 小时前
HTML <output> 标签:原生表单结果展示容器,自动关联输入值
前端·html
OpenTiny社区21 小时前
OpenTiny NEXT 内核新生:生成式UI × MCP,重塑前端交互新范式!
前端·开源·agent