在主题目录中创建manifest.json,并在 header.php<head> 里引用:

<link rel="manifest" href="<?php echo Typecho_Widget::widget('Widget_Options')->themeUrl; ?>/manifest.json">

manifest.json 内容

{
  "name": "Joomaen's Blog",
  "short_name": "Joomaen",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/usr/themes/你的主题/icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/usr/themes/你的主题/icons/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

注意

  • start_url 设为 /,确保 PWA 启动时进入首页。
  • display: "standalone" 让 PWA 以独立窗口运行,而不是浏览器标签页。
  • 创建 icons 目录,并放入 192x192512x512 PNG 图标。

Typecho 主题目录 下新建 sw.js,并缓存主要页面资源:

footer.php文件的 <body> 结束前加入以下代码用来注册 Service Worker

<script>
if ("serviceWorker" in navigator) {
  navigator.serviceWorker.register("<?php echo Typecho_Widget::widget('Widget_Options')->themeUrl; ?>/sw.js")
    .then(() => console.log("Service Worker 注册成功"))
    .catch(err => console.log("Service Worker 注册失败", err));
}
</script>

配置 Typecho 伪静态(适用于 Nginx)(可选)

location /sw.js {
    add_header Cache-Control "no-cache, no-store, must-revalidate";
}

location /manifest.json {
    add_header Content-Type application/json;
}