Service Worker
Service Worker 是运行在浏览器后台的脚本,用于处理缓存和推送通知等任务。使用 Service Worker 适配器,可以将 Hono 应用作为浏览器内的 FetchEvent 处理函数运行。
本页介绍使用 Vite 创建项目的示例。
1. 初始化
首先创建项目目录并进入该目录:
sh
mkdir my-app
cd my-app创建项目所需文件。使用以下内容创建 package.json:
json
{
"name": "my-app",
"private": true,
"scripts": {
"dev": "vite dev"
},
"type": "module"
}同样,使用以下内容创建 tsconfig.json:
json
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"lib": ["ES2020", "DOM", "WebWorker"],
"moduleResolution": "bundler"
},
"include": ["./"],
"exclude": ["node_modules"]
}接下来安装所需模块。
sh
npm i hono @hono/service-worker
npm i -D vitesh
yarn add hono @hono/service-worker
yarn add -D vitesh
pnpm add hono @hono/service-worker
pnpm add -D vitesh
bun add hono @hono/service-worker
bun add -D vite2. Hello World
编辑 index.html:
html
<!doctype html>
<html>
<body>
<a href="/sw">Hello World by Service Worker</a>
<script type="module" src="/main.ts"></script>
</body>
</html>main.ts 是用于注册 Service Worker 的脚本:
ts
function register() {
navigator.serviceWorker
.register('/sw.ts', { scope: '/sw', type: 'module' })
.then(
function (_registration) {
console.log('Register Service Worker: Success')
},
function (_error) {
console.log('Register Service Worker: Error')
}
)
}
function start() {
navigator.serviceWorker
.getRegistrations()
.then(function (registrations) {
for (const registration of registrations) {
console.log('Unregister Service Worker')
registration.unregister()
}
register()
})
}
start()在 sw.ts 中使用 Hono 创建应用,并通过 Service Worker 适配器的 handle 函数将其注册到 fetch 事件。这样 Hono 应用就能拦截对 /sw 的访问。
ts
// To support types
// https://github.com/microsoft/TypeScript/issues/14877
declare const self: ServiceWorkerGlobalScope
import { Hono } from 'hono'
import { handle } from '@hono/service-worker'
const app = new Hono().basePath('/sw')
app.get('/', (c) => c.text('Hello World'))
self.addEventListener('fetch', handle(app))使用 fire()
fire() 函数会自动调用 addEventListener('fetch', handle(app)),使代码更加简洁。
ts
import { Hono } from 'hono'
import { fire } from '@hono/service-worker'
const app = new Hono().basePath('/sw')
app.get('/', (c) => c.text('Hello World'))
fire(app)3. 运行
启动开发服务器。
sh
npm run devsh
yarn devsh
pnpm run devsh
bun run dev开发服务器默认运行在 5173 端口。在浏览器中访问 http://localhost:5173/ 完成 Service Worker 注册,然后访问 /sw 查看 Hono 应用的响应。