Swup 用于服务器呈现网站的多功能且可扩展的页面过渡库。

缘起

最近看到 Astro ,感觉不错。试了试,虽然感觉生成速度很慢,但是工具链确实很现代化。比如支持 MDX,生成后进行文件压缩,图片转 WebP,少量 js 实现的页面过渡等等功能。

其中比较喜欢 Astro Paper ↗ 和 Fuwari ↗ 主题,这两个都有类似 SPA 应用效果,Paper 使用的应该是 Astro4 自带的 API。而 Fuwari,使用的是 Swup 实现的。 Fuwari Demo ↗

下面进行简单尝试。

信息

官网介绍

Swup 是一个多功能且可扩展的页面过渡库,适用于 SSR 网站。 它管理整个页面加载生命周期,并在当前和下一个之间平滑地制作动画页。此外,它还提供了许多其他生命周期改进,例如缓存、智能预加载、 本机浏览器历史记录和增强的可访问性。无需复杂操作,即可让您的网站感觉像一个 SPA 单页应用程序。

官网 https://swup.js.org/ ↗

虽然适用于 SSR 网站,但静态博客也能用。

示例

以本博客站点为例, layouts/_default/baseof.html 添加

    <script src="https://unpkg.com/swup@4"></script>
    <script src="https://unpkg.com/@swup/scripts-plugin@2"></script>
    <script data-swup-ignore-script> 
        const swup = new Swup({
            plugins: [new SwupScriptsPlugin({
                body: true,
                head: true
            })]
        });
    </script>
html

这段代码引入了 swup 主要 js 和一个插件。插件主要作用是保证 body ,head js 能够正常运行。(但不保证完全正常)

data-swup-ignore-script 是告诉插件 SwupScriptsPlugin 这段 js 不必重复执行。

除此之外,还需要根据错误,适当修改代码。比如把需要重新执行 js 放到 body ,head 或 main 里。总的来说,增加了页面维护难度。

比如 DoIt 这个主题,我把 {{- partial "assets.html" . -}} 放到 <main></main> 里,评论有时还不会生效。

main 增加 transition-fade class 和 id swup。

<main class="main transition-fade" id="swup">
html

css 增加

html.is-changing .transition-fade {
  transition: opacity 0.1s;
  opacity: 1;
}
/* Define the styles for the unloaded pages */
html.is-animating .transition-fade {
  opacity: 0;
}
css

忽略控制台报错和一些无法正常工作的脚本还是不错的。按照 4.5.1 版本来看, https://cdn.staticfile.net/swup/4.5.1/Swup.umd.min.js ↗ 文件,这个 js 大概 10kb ,未压缩 25kb 左右。插件未压缩不到 3kb 。

类似工具

http://instantclick.io/ ↗ 预加载,访问体验优化。并使用 pushState 和 Ajax (pjax) 替换正文。可能会导致部分 js 失效,增加维护难度。5.9kb
https://instant.page/ ↗ 预加载缓存 4.2kb

附件

baseof.html 完整代码参考

后续

因为我目前使用的 DoIt 主题 JS 写的有点复杂,加上 Swup 会导致部分 JS 失效,就删除了。
Swup.js 效果可见

https://kkbt0.github.io/Hugo-Landscape/ ↗
https://kkbt0.github.io/Somnia/ ↗

使用 Swup 实现网页平滑过渡
https://www.ftls.xyz/posts/2024-04-04-swup/
Author 恐咖兵糖
Published at
Copyright CC BY-NC-SA 4.0