使用 Vite/Vue 插件

Valaxy 兼容 Vite/Vue 插件,你可以参考以下示例进行使用。

使用 Vite 插件 ​

使用 vite-plugin-pwa ​

valaxy.config.ts
ts
import type { ThemeConfig } from 'valaxy-theme-yun'
import { defineValaxyConfig } from 'valaxy'
import { VitePWA } from 'vite-plugin-pwa'

export default defineValaxyConfig<ThemeConfig>({
  vite: {
    plugins: [
      // https://vite-pwa-org.netlify.app/
      VitePWA({
        workbox: {
          // SSG 页面需要各自的 HTML,禁用 SPA 首页回退。
          navigateFallback: null,
        },
      }),
    ],
  },
})
setup/main.ts
ts
import { defineAppSetup } from 'valaxy'

export default defineAppSetup(({ router, isClient }) => {
  router.isReady().then(async () => {
    if (!isClient)
      return
    const { registerSW } = await import('virtual:pwa-register')
    registerSW({ immediate: true })
  })
})

SSG 导航与离线行为 ​

Valaxy 为每个路由生成不同的 HTML。在默认的 generateSW 策略下,vite-plugin-pwa 将 workbox.navigateFallback 设为 'index.html'。未匹配到预缓存页面的导航请求可能因此收到首页 HTML,包括直接访问或刷新文章链接。Vue 随后会按文章页对首页 DOM 进行 hydration,造成 hydration mismatch、布局错位、目录缺失或链接无法点击。参见 #718。

按上面的示例设置 workbox.navigateFallback: null,让未匹配的请求交给服务器,返回对应的 SSG HTML。这也能避免直接访问 /sitemap.xml、/atom.xml 等文件时回退到首页,进而显示博客的 404 页面。禁用回退后,无需再设置 navigateFallbackDenylist;只排除 XML 地址而保留首页回退,不能修复文章页的 hydration 问题。

此配置不会禁用 PWA 或预缓存,但未缓存的页面仍需要网络连接,并不会自动让所有 SSG 页面支持离线访问。如果使用 injectManifest 或自定义导航缓存,也应确保返回请求页面自身的 HTML,而非首页。参见 Workbox 导航回退配置。

更新已有部署 ​

修改配置后,重新构建并将生成的 Service Worker 与站点一起部署。新 Worker 激活前,已有访客仍可能受旧 Worker 控制。请完成站点的 PWA 更新流程,或在新 Worker 安装后关闭该站点的所有标签页并重新打开。

验证时,使用生产构建及预览(先 pnpm build,再 pnpm serve),等待新 Service Worker 接管页面,然后直接打开并刷新文章链接。确认目录、头像跳转正常,控制台没有 hydration 错误,且直接访问 /sitemap.xml 返回 XML。可在浏览器开发者工具中临时绕过 Service Worker,区分旧 Worker 与服务器配置问题;仅使用开发模式无法验证生产 Worker 的行为。

移除已经部署的 PWA ​

直接从配置中删除 VitePWA,不会注销访客浏览器里已安装的 Service Worker。应先在现有 VitePWA 配置中加入 selfDestroying: true 并部署,保留其他选项、注册代码及 Worker 文件名和路径,让已有安装能够获取替代 Worker。

移除集成前,应持续提供这个替代 Worker,以覆盖之后才再次访问的用户;发布一次并不代表所有访客都已更新。参见 官方 Service Worker 注销指南。

更多配置请参考 vite-plugin-pwa。

使用 Vue 插件 ​

提示

Valaxy 默认集成了 @vitejs/plugin-vue 插件,如果你自定义插件 @vitejs/plugin-vue 的配置,你可以通过 vue 配置项进行配置。

可参见 扩展配置。

譬如使用 Element Plus,你可以在 setup/main.ts 中添加以下配置:

setup/main.ts
ts
import ElementPlus from 'element-plus'

import { defineAppSetup } from 'valaxy'
import 'element-plus/lib/theme-chalk/index.css'

export default defineAppSetup(({ app }) => {
  app.use(ElementPlus)
})

贡献者