让 Hugo 支持 PWA 特性
前言
什么是 PWA
PWA(Progressive web apps,渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。这些应用无处不在、功能丰富,使其具有与原生应用相同的用户体验优势。
PWA 的特点:
- 添加你的博客到电脑 / 手机的桌面,以原生应用般的方式浏览你的博客
- 更快速地浏览你的博客
- 离线浏览你的博客
目前已知使用 Vue CLI 搭建项目时可以选择是否支持 PWA,Hexo 也可以通过插件来支持 PWA,而 Hugo 目前除了自己手动修改来支持 PWA 外,暂时没有其他的办法。本简单记录 Hugo 支持 PWA 的步骤。
配置 PWA
Service Workers
首先在博客根目录static文件夹添加 Blog/static/service-worker.js
// https://developers.google.com/web/tools/workbox/guides/get-started
importScripts('https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js');
if (workbox) {
console.log(`Yay! Workbox is loaded 🎉`);
workbox.routing.registerRoute(
new RegExp(/\/.*/),
workbox.strategies.networkFirst()
);
workbox.routing.registerRoute(
// Cache CSS files
/.*\.css/,
// Use cache but update in the background ASAP
workbox.strategies.staleWhileRevalidate({
// Use a custom cache name
cacheName: 'css-cache',
})
);
workbox.routing.registerRoute(
// Cache image files
/.*\.(?:png|jpg|jpeg|svg|gif)|https:\/\/www\.codewars\.com\/users\/AoiYamada\/badges\/micro/,
// Use the cache if it's available
workbox.strategies.cacheFirst({
// Use a custom cache name
cacheName: 'image-cache',
plugins: [
new workbox.expiration.Plugin({
// Cache only 20 images
maxEntries: 20,
// Cache for a maximum of a week
maxAgeSeconds: 7 * 24 * 60 * 60,
})
],
})
);
} else {
console.log(`Boo! Workbox didn't load 😬`);
}
PWA Script
在主题 footer.hmtl 或 Blog/themes/zozo/layouts/partials/js.html 添加脚本
<meta name=”apple-mobile-web-app-capable” content=”yes”>
<script>
// Check that service workers are registered
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js');
});
}
</script>
manifest.json
使用 https://realfavicongenerator.net/ 生成图标以及 manifest.json
解压后把图标和 manifest.json 放到 Blog/static/manifest.json 路径
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}
完成
接下来我们可以通过访问移动端网站就可以把网站添加到桌面,桌面浏览器 Chrome 可以通过地址栏最右加进行添加,iOS Safari 可以通过添加到桌面。