JavaScript 如何做 Service Worker

打开浏览器,在网页上点右键选“检查”,切换到“应用程序”面板,你会看到一个叫“Service Workers”的选项——这就是今天要聊的主角,一个能让网页像APP一样离线能用、加载更快的小工具。很多人觉得它是复杂的“前端黑科技”,其实用JavaScript写,就像给网页装了个“后台小助手”,步骤清晰到像拼乐高积木,咱们一步步拆明白。

第一步:先搭好“小助手的落脚点”——写个简单的SW脚本

Service Worker需要一个单独的JS文件当“本体”,比如取名叫sw.js,这个文件得放在网站根目录,这样它才能控制整个网站的页面。不用写复杂的代码,先做个最基础的“缓存助手”:

JavaScript 如何做 Service Worker

`javascript

// 定义缓存名,换内容时改个名字就能清旧缓存

const CACHE_NAME = 'my-site-cache-v1';

// 要缓存的文件,比如首页、CSS、JS这些核心资源

const urlsToCache = [

'/',

'/styles/main.css',

'/scripts/main.js'

];

`

这里举个生活化的例子:把缓存名当成你家冰箱的“保鲜盒标签”,比如“水果盒v1”,你换种水果存,标签改成“水果盒v2”,旧盒子就不用了,不会串味。

第二步:给网页“请小助手”——注册Service Worker

有了sw.js,得告诉网页“我要你帮我把这个小助手装进来”。在网页的JS文件(比如main.js)里加一段注册代码:

`javascript

if ('serviceWorker' in navigator) {

// 检查浏览器支不支持,旧浏览器会忽略这段代码

window.addEventListener('load', () => {

navigator.serviceWorker.register('/sw.js')

.then(registration => {

console.log('小助手注册成功啦,范围是:', registration.scope);

})

.catch(err => {

console.log('小助手注册失败:', err);

});

});

}

`

就像你请钟点工,得先给她打电话说“来我家干活,我家地址是XX”,浏览器就是“雇主”,注册代码就是“打电话请人”,成功了就会在控制台看到提示。

第三步:给小助手派活——监听它的“生命周期事件”

Service Worker有自己的“一生”:安装、激活、拦截请求,咱们要给它安排不同阶段的任务,这就靠监听事件:

**安装阶段:把要存的东西放进“缓存冰箱”**

小助手刚到家里,先干“整理冰箱”的活,把提前说好的urlsToCache里的文件都存起来,代码写在sw.js里:

`javascript

self.addEventListener('install', event => {

// waitUntil是让小助手等缓存完再算“安装完成”

event.waitUntil(

caches.open(CACHE_NAME)

.then(cache => cache.addAll(urlsToCache))

);

});

`

比如你搬新家,请了收纳师,收纳师先把你提前列好的常用餐具、食材都放进冰箱,这样你一到家就能用。

**激活阶段:清理旧的“保鲜盒”**

如果之前装过旧版本的Service Worker,小助手激活时得把旧缓存删掉,避免新旧内容打架:

`javascript

self.addEventListener('activate', event => {

event.waitUntil(

caches.keys().then(cacheNames => {

return Promise.all(

cacheNames.filter(name => name !== CACHE_NAME)

.map(name => caches.delete(name))

);

})

);

});

`

就像你换了新的保鲜盒,把旧的、没用完的食材都清掉,冰箱不会乱。

**拦截请求:让小助手管“找资源”的事**

这是Service Worker最实用的功能:用户打开网页要找资源时,小助手先看看“冰箱里有没有”,有就直接拿,没有再去网上下载,这样加载更快,还能离线用:

`javascript

self.addEventListener('fetch', event => {

event.respondWith(

caches.match(event.request)

.then(cachedResponse => {

// 有缓存就用缓存,没有就去网上拿

return cachedResponse || fetch(event.request);

})

);

});

`

比如你想吃苹果,先看看冰箱有没有,有就直接拿,没有再去超市买,不用每次都跑超市,省时间还方便。

最后:别踩这几个小坑

很多人第一次做会踩坑:一是sw.js必须放根目录,放子目录的话控制范围有限,相当于钟点工只能在你房间干活,不能去客厅;二是缓存名一定要改,改了内容却没改缓存名,用户看不到新内容;三是本地调试要开HTTPS,浏览器只允许安全的网站用Service Worker,本地用localhost也可以调试。

这样一套下来,你就用JavaScript做了一个基础的Service Worker,网页加载更快、断网也能打开核心内容,是不是没想象中难?

上一篇 PHP == 和 === 区别