@budarin/pluggable-serviceworker 1.5.2 → 1.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -57
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -77,17 +77,16 @@ pnpm add @budarin/pluggable-serviceworker
|
|
|
77
77
|
### Базовое использование
|
|
78
78
|
|
|
79
79
|
```typescript
|
|
80
|
-
//
|
|
80
|
+
// precacheAndServePlugin.js
|
|
81
81
|
import {
|
|
82
|
-
type
|
|
83
|
-
type ServiceWorkerPlugin,
|
|
82
|
+
type Plugin,
|
|
84
83
|
initServiceWorker,
|
|
85
84
|
} from '@budarin/pluggable-serviceworker';
|
|
86
85
|
|
|
87
|
-
function precacheAndServePlugin(config: {
|
|
86
|
+
export function precacheAndServePlugin(config: {
|
|
88
87
|
cacheName: string;
|
|
89
88
|
assets: string[];
|
|
90
|
-
}):
|
|
89
|
+
}): Plugin {
|
|
91
90
|
const { cacheName, assets } = config;
|
|
92
91
|
|
|
93
92
|
return {
|
|
@@ -116,6 +115,11 @@ function precacheAndServePlugin(config: {
|
|
|
116
115
|
},
|
|
117
116
|
};
|
|
118
117
|
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// sw.ts
|
|
122
|
+
import { precacheAndServePlugin } from './precacheAndServePlugin';
|
|
119
123
|
|
|
120
124
|
initServiceWorker([
|
|
121
125
|
precacheAndServePlugin({
|
|
@@ -125,22 +129,11 @@ initServiceWorker([
|
|
|
125
129
|
]);
|
|
126
130
|
```
|
|
127
131
|
|
|
128
|
-
**Важно:**
|
|
129
|
-
|
|
130
|
-
- для `fetch` плагину не нужно самому вызывать `fetch(event.request)` — если все плагины вернули `undefined`, фреймворк сам идёт в сеть.
|
|
131
|
-
- конфиг плагина задаётся по месту вызова фабрики; в `options` только `logger?` и `onError?`.
|
|
132
|
-
|
|
133
|
-
### Фабрика плагинов
|
|
134
|
-
|
|
135
|
-
**Плагин** — это объект с полем `name` и опциональными обработчиками (`install`, `fetch`, `activate` и т.д.). В массив `initServiceWorker(plugins, options)` передаются именно такие объекты.
|
|
136
|
-
|
|
137
|
-
**Фабрика плагина** — функция, которая принимает конфиг и возвращает плагин (объект). Например: `precache(config)`, `serveFromCache(config)` или собственная `precacheAndServePlugin(config)` из примера выше. Конфиг задаётся по месту вызова фабрики; в общий `options` попадают только `logger?` и `onError?`.
|
|
138
|
-
|
|
139
132
|
## Демо
|
|
140
133
|
|
|
141
134
|
В папке [demo/](demo/) — приложение **React + Vite** с пресетом **offlineFirst** и типовым сервис-воркером **activateOnSignal**. Запуск из корня: `pnpm start`. Подробности — в [demo/README.md](demo/README.md).
|
|
142
135
|
|
|
143
|
-
##
|
|
136
|
+
## initServiceWorker(plugins, options)
|
|
144
137
|
|
|
145
138
|
`initServiceWorker` — точка входа: регистрирует обработчики событий Service Worker (`install`, `activate`, `fetch`, …) и прогоняет их через список плагинов.
|
|
146
139
|
|
|
@@ -305,7 +298,13 @@ initServiceWorker(
|
|
|
305
298
|
);
|
|
306
299
|
```
|
|
307
300
|
|
|
308
|
-
##
|
|
301
|
+
## Плагины
|
|
302
|
+
|
|
303
|
+
**Плагин** — это объект с полем `name` и опциональными обработчиками (`install`, `fetch`, `activate` и т.д.). В массив `initServiceWorker(plugins, options)` передаются именно такие объекты.
|
|
304
|
+
|
|
305
|
+
**Фабрика плагина** — функция, которая принимает конфиг и возвращает плагин (объект). Например: `precache(config)`, `serveFromCache(config)` или собственная `precacheAndServePlugin(config)` из примера выше. Конфиг задаётся по месту вызова фабрики; в общий `options` попадают только `logger?` и `onError?`.
|
|
306
|
+
|
|
307
|
+
### 🔌 Интерфейс плагина
|
|
309
308
|
|
|
310
309
|
Плагин — объект, реализующий интерфейс `ServiceWorkerPlugin`. Во все обработчики вторым аргументом передаётся **logger** (всегда определён: из `options` или `console`). Специфичный для плагина конфиг задаётся при вызове **фабрики** плагина; в `options` только `logger?` и `onError?`. Параметр типа `_C` (например `PluginContext`) используется для типизации; по умолчанию контекст содержит только `logger`.
|
|
311
310
|
|
|
@@ -441,14 +440,9 @@ initServiceWorker(
|
|
|
441
440
|
Пример фабрики, которая прерывает цепочку при неавторизованном доступе к защищённым путям:
|
|
442
441
|
|
|
443
442
|
```typescript
|
|
444
|
-
import type {
|
|
445
|
-
PluginContext,
|
|
446
|
-
ServiceWorkerPlugin,
|
|
447
|
-
} from '@budarin/pluggable-serviceworker';
|
|
443
|
+
import type { Plugin } from '@budarin/pluggable-serviceworker';
|
|
448
444
|
|
|
449
|
-
function authPlugin(config: {
|
|
450
|
-
protectedPaths: string[];
|
|
451
|
-
}): ServiceWorkerPlugin<PluginContext> {
|
|
445
|
+
function authPlugin(config: { protectedPaths: string[] }): Plugin {
|
|
452
446
|
const { protectedPaths } = config;
|
|
453
447
|
|
|
454
448
|
return {
|
|
@@ -494,7 +488,6 @@ function authPlugin(config: {
|
|
|
494
488
|
### Примитивы (плагины)
|
|
495
489
|
|
|
496
490
|
Один примитив — одна операция. Импорт: `@budarin/pluggable-serviceworker/plugins`.
|
|
497
|
-
|
|
498
491
|
Примитивы с конфигом — **фабрики плагинов** (см. раздел «Фабрика плагинов»): конфиг передаётся при вызове по месту использования; в `options` в `initServiceWorker` попадают только `logger?` и `onError?`. Примитивы без конфига (`skipWaiting`, `claim`, …) — готовые объекты плагинов.
|
|
499
492
|
|
|
500
493
|
| Название | Событие | Описание |
|
|
@@ -518,9 +511,7 @@ function authPlugin(config: {
|
|
|
518
511
|
|
|
519
512
|
Обработчики одного типа (`install`, `activate` и т.д.) у разных плагинов выполняются **параллельно**. Если нужна строгая последовательность (например «сначала claim, потом перезагрузка клиентов»), соберите один плагин, который по очереди вызывает логику примитивов — для гарантии порядка.
|
|
520
513
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
Плагин **claimAndReloadClients** вызывает существующие примитивы **claim** и **reloadClients** по очереди:
|
|
514
|
+
Пример: claimAndReloadClients как композиция двух примитивов. Плагин вызывает существующие примитивы **claim** и **reloadClients** по очереди:
|
|
524
515
|
|
|
525
516
|
```typescript
|
|
526
517
|
import { claim } from '@budarin/pluggable-serviceworker/plugins';
|
|
@@ -543,43 +534,24 @@ activate: (event, logger) =>
|
|
|
543
534
|
// postsSwrPlugin.ts
|
|
544
535
|
import type { Plugin } from '@budarin/pluggable-serviceworker';
|
|
545
536
|
|
|
546
|
-
import {
|
|
547
|
-
precache,
|
|
548
|
-
serveFromCache,
|
|
549
|
-
} from '@budarin/pluggable-serviceworker/plugins';
|
|
550
|
-
import { initServiceWorker } from '@budarin/pluggable-serviceworker';
|
|
537
|
+
import { staleWhileRevalidate } from '@budarin/pluggable-serviceworker/plugins';
|
|
551
538
|
|
|
552
539
|
function postsSwrPlugin(config: {
|
|
553
540
|
cacheName: string;
|
|
554
541
|
pathPattern?: RegExp;
|
|
555
542
|
}): Plugin {
|
|
556
543
|
const { cacheName, pathPattern = /\/api\/posts(\/|$)/ } = config;
|
|
544
|
+
const swrPlugin = staleWhileRevalidate({ cacheName });
|
|
557
545
|
|
|
558
546
|
return {
|
|
559
547
|
name: 'postsSwr',
|
|
560
548
|
order: 0,
|
|
561
549
|
|
|
562
|
-
fetch: async (event) => {
|
|
550
|
+
fetch: async (event, logger) => {
|
|
563
551
|
if (!pathPattern.test(new URL(event.request.url).pathname)) {
|
|
564
552
|
return undefined;
|
|
565
553
|
}
|
|
566
|
-
|
|
567
|
-
const cache = await caches.open(cacheName);
|
|
568
|
-
const cached = await cache.match(event.request);
|
|
569
|
-
const revalidate = fetch(event.request).then(async (response) => {
|
|
570
|
-
if (response.ok) {
|
|
571
|
-
await cache.put(event.request, response.clone());
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
return response;
|
|
575
|
-
});
|
|
576
|
-
|
|
577
|
-
if (cached) {
|
|
578
|
-
void revalidate;
|
|
579
|
-
return cached;
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
return revalidate;
|
|
554
|
+
return swrPlugin.fetch!(event, logger);
|
|
583
555
|
},
|
|
584
556
|
};
|
|
585
557
|
}
|
|
@@ -625,14 +597,12 @@ initServiceWorker(
|
|
|
625
597
|
|
|
626
598
|
```typescript
|
|
627
599
|
// sw.js — точка входа вашего сервис-воркера
|
|
628
|
-
import { customLogger } from './customLogger';
|
|
629
600
|
import { activateOnNextVisitServiceWorker } from '@budarin/pluggable-serviceworker/sw';
|
|
630
601
|
|
|
631
602
|
activateOnNextVisitServiceWorker({
|
|
632
|
-
assets: ['/', '/styles.css', '/script.js'],
|
|
633
603
|
cacheName: 'my-cache-v1',
|
|
634
|
-
|
|
635
|
-
onError: (err, event, type) =>
|
|
604
|
+
assets: ['/', '/styles.css', '/script.js'],
|
|
605
|
+
onError: (err, event, type) => console.error(type, err),
|
|
636
606
|
});
|
|
637
607
|
```
|
|
638
608
|
|
|
@@ -661,7 +631,7 @@ activateOnNextVisitServiceWorker({
|
|
|
661
631
|
"@budarin/pluggable-serviceworker": "^1.0.0"
|
|
662
632
|
},
|
|
663
633
|
"devDependencies": {
|
|
664
|
-
"@budarin/pluggable-serviceworker": "^1.5.
|
|
634
|
+
"@budarin/pluggable-serviceworker": "^1.5.5"
|
|
665
635
|
}
|
|
666
636
|
}
|
|
667
637
|
```
|