惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
美团技术团队
博客园_首页
罗磊的独立博客
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
Jina AI
Jina AI
V
V2EX
雷峰网
雷峰网
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
O
OpenAI News
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
T
Threatpost
Scott Helme
Scott Helme
Latest news
Latest news
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tor Project blog
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
C
CERT Recently Published Vulnerability Notes
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
小众软件
小众软件
I
Intezer
The Hacker News
The Hacker News
Project Zero
Project Zero
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
NISL@THU
NISL@THU
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hugging Face - Blog
Hugging Face - Blog
P
Privacy & Cybersecurity Law Blog
P
Proofpoint News Feed

微风静语

用 codebase-memory-mcp 给 AI 编程加一层“代码记忆” EchoCraft - 专为独立开发者和小型团队打造的产品官网主题 Halo 站长必备:外链安全与流量分析神器——“链接工具箱”重磅升级! Halo插件开发:java17旧项目迁移至java21项目记录 Halo插件|一个面向创作者的多功能媒体处理工具集 分布式事务详解:从入门到精通 Halo主题 - 微浸:以轻量构建美学,用细节定义体验 深入理解Python爬虫技术:原理、实现与实践 Halo-2.20 新特性:自定义登录页面模版 vue3 中父子组件数据传输踩坑 将你的服务运维面板从宝塔替换为1panel Python实战项目:外星人入侵(源码分享) theme-hao主题适配友链自助提交插件 plugin-artalk 插件保姆级使用教程 plugin-blog-hao 插件部分功能演示 halo 插件开发踩坑记录(一) Thymeleaf 模版引擎语法浅记 信息洪流中的自我救赎 mac 系统里如何管理多个jdk版本 memso API 不完全指南 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法 halo-theme-hao主题:artalk评论区美化 衡量个人成长 halo-theme-hao 主题魔改教程 分享一个魔改的 Artalk 评论系统邮件模版 halo-theme-hao 主题标签记录 开发一个 Halo2.0 的安全条跳转中台插件! Mac 软件推荐:使用 Mac 一年半来,我一直在用的软件! TypeScript教程---面向对象编程 软件版本命名规范 TypeScript教程---基础语法及编译设置 2024年家乡春季的第一场大雪 提问的智慧 基础篇:容器化部署技术 -—docker,从此摆脱多环境配置的苦恼! 普通本科的四年大学教育,给我带来了什么? 因果与平衡 程序的本质:代码是如何被执行的 软件开发者应该具备的基本提问素质 如何编写 Restful 风格的接口 探索力 Springboot入门基础篇 springboot中如何使用注解来实现aop Springboot项目生成接口文档方法 Java 实体代码生成器 lombok 的使用 深入 Java 泛型 分布式版本控制工具 git 的基本使用 如何搭建前后端分离的项目 初识Vue3--令人焕然一新的使用逻辑和代码组织方式! 浅谈前端发展史 为什么要学习数据结构和算法 关于富文本编辑器 wangeditor 在 vue2 项目中的使用
让你的网站初步适配PWA
高峰君主 · 2025-03-29 · via 微风静语

近年来,渐进式 Web 应用程序(Progressive Web App,简称 PWA)因其能够在用户体验和性能之间取得平衡而受到越来越多开发者的青睐。PWA 结合了网页和本地应用的优势,例如离线访问、快速加载、推送通知以及添加到主屏幕等功能。这篇文章将带领你了解如何让你的网站初步适配 PWA。

PWA 是一种增强型的 Web 应用程序,通过利用现代浏览器的新特性(如 Service Workers 和 Web App Manifest),提供类似原生应用的用户体验。它具有以下特点:

  1. 可靠性:即使在网络条件较差或无网络的情况下,应用仍能正常运行。

  2. 性能:加载速度快,界面流畅,用户体验接近本地应用。

  3. 可安装性:用户可以将 PWA 添加到设备的主屏幕,就像安装了本地应用程序一样。

实现 PWA 的基本步骤

1. 添加 Web App Manifest 文件

Manifest 文件是 JSON 格式的配置文件,它定义了 PWA 的元信息,如应用名称、图标、启动页面等。将该文件链接到 HTML,可以让浏览器识别你的 PWA。

示例代码

创建一个名为 manifest.json 的文件,并添加以下内容:

{
  "name": "示例 PWA 应用",
  "short_name": "PWA 示例",
  "start_url": "/index.html",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/icons/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

然后在 HTML 的 <head> 标签中添加:

<link rel="manifest" href="/manifest.json">

2. 使用 Service Worker

Service Worker 是 PWA 的核心组件,它运行在浏览器后台,可以拦截和缓存网络请求,从而实现离线功能。

编写 Service Worker

创建一个名为 sw.js 的文件,并添加以下内容:

const CACHE_NAME = 'pwa-cache-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/styles.css',
  '/script.js',
  '/icons/icon-192x192.png',
  '/icons/icon-512x512.png'
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME).then(cache => {
      return cache.addAll(urlsToCache);
    })
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

self.addEventListener('activate', event => {
  const cacheWhitelist = [CACHE_NAME];
  event.waitUntil(
    caches.keys().then(cacheNames => {
      return Promise.all(
        cacheNames.map(cacheName => {
          if (!cacheWhitelist.includes(cacheName)) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

注册 Service Worker

在你的主 JavaScript 文件中注册 Service Worker:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/sw.js')
      .then(registration => {
        console.log('Service Worker 注册成功:', registration);
      })
      .catch(error => {
        console.log('Service Worker 注册失败:', error);
      });
  });
}

3. 启用 HTTPS

PWA 要求在 HTTPS 环境下运行(本地开发环境下可使用 localhost)。你可以通过以下方式启用 HTTPS:

  • 使用免费的 Let’s Encrypt 证书。

  • 在本地使用工具如 mkcert 来生成自签名证书。

4. 测试 PWA

使用 Chrome 开发者工具中的 Lighthouse 进行测试:

  1. 打开开发者工具(F12)。

  2. 切换到 "Lighthouse" 标签。

  3. 勾选 "Progressive Web App",然后点击 "Generate report"。

Lighthouse 会生成一份评分报告,显示你的网站在 PWA 方面的表现。

适配 Hexo Butterfly 主题

要使您的 Hexo 博客在使用 Butterfly 主题时支持 PWA 功能,可以按照以下步骤进行配置:

1. 安装 hexo-offline 插件

在您的 Hexo 工作目录中,运行以下命令安装 hexo-offline 插件:

npm install hexo-offline --save

2. 创建 hexo-offline 配置文件

在 Hexo 根目录下创建一个名为 hexo-offline.config.cjs 的文件,并添加以下内容:

module.exports = {
  globPatterns: ['**/*.{js,html,css,png,jpg,gif,svg,webp,eot,ttf,woff,woff2}'],
  globDirectory: 'public',
  swDest: 'public/service-worker.js',
  maximumFileSizeToCacheInBytes: 10485760, // 10 MB
  skipWaiting: true,
  clientsClaim: true,
  runtimeCaching: [
    {
      urlPattern: /^https:\/\/cdn\.example\.com\/.*/, // 将 example 替换为您的 CDN 域名
      handler: 'CacheFirst'
    }
  ]
};

此配置指定了要缓存的文件类型、缓存目录以及 Service Worker 的相关设置。

3. 修改主题配置文件

打开 Butterfly 主题的配置文件 _config.butterfly.yml,启用 PWA 选项,并设置相关参数:

pwa:
  enable: true
  manifest: /img/pwa/manifest.json
  apple_touch_icon: /img/pwa/apple-touch-icon.png
  favicon_32_32: /img/pwa/32.png
  favicon_16_16: /img/pwa/16.png
  mask_icon: /img/pwa/safari-pinned-tab.svg

确保上述路径下存在相应的图标文件,或者根据需要调整路径。

4. 创建 manifest.json

source/img/pwa/ 目录下创建 manifest.json 文件,内容如下:

{
  "name": "Hexo PWA 示例",
  "short_name": "HexoPWA",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#333333",
  "icons": [
    {
      "src": "/img/pwa/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/img/pwa/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

5. 生成并部署

运行以下命令生成静态文件并部署到服务器:

hexo clean
hexo generate
hexo deploy

优化 PWA 体验

离线支持

通过缓存更多资源(如图片、字体),提升离线用户体验。

推送通知

集成 Web Push API,向用户发送通知,进一步增强交互性。

动态缓存策略

使用 Workbox 库实现更复杂的缓存策略,例如动态内容缓存或缓存过期控制。

结语

通过以上步骤,你可以让你的网站初步适配 PWA,从而为用户提供更加优质的体验。如果想进一步优化,可以研究更多高级功能,例如后台同步和渐进式加载等。PWA 是未来 Web 开发的重要趋势,赶快行动起来,让你的网站更上一层楼!