前端PWA:让你的网站变成App

前端PWA:让你的网站变成App

毒舌时刻

前端PWA?这不是噱头吗?

"PWA有什么用,用户直接用浏览器不就好了"——结果用户体验差,无法离线访问,
"我有原生App,不需要PWA"——结果开发成本高,维护困难,
"PWA就是加个manifest和service worker,多简单"——结果功能不完整,用户体验差。

醒醒吧,PWA不是简单的技术组合,而是一种现代化的Web应用模式!

为什么你需要这个?

  • 离线访问:即使没有网络也能访问应用
  • 安装到主屏幕:像原生App一样方便使用
  • 推送通知:及时向用户发送重要信息
  • 性能提升:缓存静态资源,加快加载速度
  • 跨平台:一次开发,多平台运行

反面教材

<!-- 反面教材:不完整的PWA配置 --> <!DOCTYPE html> <html> <head> <title>我的PWA应用</title> <!-- 缺少manifest.json --> <!-- 缺少service worker --> </head> <body> <h1>我的PWA应用</h1> <p>这是一个PWA应用</p> </body> </html> 
// 反面教材:简单的service worker // service-worker.js self.addEventListener('install', event => { console.log('Service Worker 安装'); }); self.addEventListener('activate', event => { console.log('Service Worker 激活'); }); self.addEventListener('fetch', event => { console.log('Service Worker 拦截请求'); }); 

正确的做法

<!-- 正确的做法:完整的PWA配置 --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>我的PWA应用</title> <!-- 添加manifest.json --> <link rel="manifest" href="/manifest.json"> <!-- 添加主题颜色 --> <meta name="theme-color" content="#317EFB"> <!-- 添加Apple Touch Icon --> <link rel="apple-touch-icon" href="/icons/icon-192x192.png"> <!-- 添加预加载 --> <link rel="preload" href="/style.css" as="style"> <link rel="preload" href="/script.js" as="script"> <link rel="stylesheet" href="/style.css"> </head> <body> <h1>我的PWA应用</h1> <p>这是一个完整的PWA应用</p> <button>发送通知</button> <script src="/script.js"></script> <script> // 注册service worker if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/service-worker.js') .then(registration => { console.log('Service Worker 注册成功:', registration.scope); }) .catch(error => { console.log('Service Worker 注册失败:', error); }); }); } </script> </body> </html> 
// 正确的做法:manifest.json { "name": "我的PWA应用", "short_name": "PWA应用", "description": "一个完整的PWA应用示例", "start_url": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#317EFB", "icons": [ { "src": "/icons/icon-72x72.png", "sizes": "72x72", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-96x96.png", "sizes": "96x96", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-128x128.png", "sizes": "128x128", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-144x144.png", "sizes": "144x144", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-152x152.png", "sizes": "152x152", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-384x384.png", "sizes": "384x384", "type": "image/png", "purpose": "any" }, { "src": "/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" } ] } 
// 正确的做法:完整的service worker // service-worker.js const CACHE_NAME = 'pwa-app-cache-v1'; const ASSETS_TO_CACHE = [ '/', '/index.html', '/style.css', '/script.js', '/manifest.json', '/icons/icon-72x72.png', '/icons/icon-96x96.png', '/icons/icon-128x128.png', '/icons/icon-144x144.png', '/icons/icon-152x152.png', '/icons/icon-192x192.png', '/icons/icon-384x384.png', '/icons/icon-512x512.png' ]; // 安装Service Worker self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => { console.log('Cache opened'); return cache.addAll(ASSETS_TO_CACHE); }) .then(() => self.skipWaiting()) ); }); // 激活Service Worker self.addEventListener('activate', event => { const cacheWhitelist = [CACHE_NAME]; event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cacheName => { if (cacheWhitelist.indexOf(cacheName) === -1) { return caches.delete(cacheName); } }) ); }) .then(() => self.clients.claim()) ); }); // 拦截网络请求 self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => { // 如果缓存中有响应,直接返回 if (response) { return response; } // 否则发起网络请求 return fetch(event.request) .then(response => { // 如果响应有效,缓存一份 if (response && response.status === 200 && response.type === 'basic') { const responseToCache = response.clone(); caches.open(CACHE_NAME) .then(cache => { cache.put(event.request, responseToCache); }); } return response; }) .catch(error => { // 网络错误时返回离线页面 if (event.request.mode === 'navigate') { return caches.match('/offline.html'); } }); }) ); }); // 处理推送通知 self.addEventListener('push', event => { const data = event.data.json(); const options = { body: data.body, icon: '/icons/icon-192x192.png', badge: '/icons/icon-72x72.png', data: { url: data.url } }; event.waitUntil( self.registration.showNotification(data.title, options) ); }); // 处理通知点击 self.addEventListener('notificationclick', event => { event.notification.close(); event.waitUntil( clients.openWindow(event.notification.data.url) ); }); 
// 正确的做法:使用推送通知 // script.js // 请求通知权限 function requestNotificationPermission() { if ('Notification' in window) { Notification.requestPermission().then(permission => { if (permission === 'granted') { console.log('通知权限已授予'); } else { console.log('通知权限被拒绝'); } }); } } // 发送通知 function sendNotification() { if ('serviceWorker' in navigator && 'PushManager' in window) { navigator.serviceWorker.ready.then(registration => { registration.showNotification('测试通知', { body: '这是一条测试通知', icon: '/icons/icon-192x192.png', badge: '/icons/icon-72x72.png', data: { url: '/' } }); }); } } // 页面加载时请求通知权限 window.addEventListener('load', () => { requestNotificationPermission(); // 绑定按钮点击事件 const notificationBtn = document.getElementById('notification-btn'); if (notificationBtn) { notificationBtn.addEventListener('click', sendNotification); } }); // 检查是否是PWA模式 function checkPwaMode() { const isPwa = window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone || document.referrer.includes('android-app://'); if (isPwa) { console.log('应用以PWA模式运行'); } else { console.log('应用以浏览器模式运行'); } } checkPwaMode(); 

毒舌点评

看看,这才叫前端PWA!不是简单地添加manifest和service worker,而是构建一个完整的PWA应用,包括离线访问、推送通知、安装到主屏幕等功能。

记住,PWA不是替代原生App,而是一种补充。它可以让你的Web应用获得类似原生App的体验,同时保持Web的跨平台优势。

所以,别再觉得PWA是噱头了,它是现代Web开发的重要方向!

总结

  • manifest.json:配置应用名称、图标、显示模式等
  • Service Worker:实现离线缓存、推送通知等功能
  • 离线访问:缓存静态资源,确保无网络时也能访问
  • 安装到主屏幕:提供类似原生App的入口
  • 推送通知:及时向用户发送重要信息
  • 性能优化:缓存策略、预加载等
  • 可访问性:确保PWA对所有用户都友好
  • 跨平台:一次开发,多平台运行

PWA,让你的网站变成真正的应用!

Read more

拒绝新手村!OpenClaw高阶实操:一个人如何用多Agent活成一支AI团队?

拒绝新手村!OpenClaw高阶实操:一个人如何用多Agent活成一支AI团队?

文章目录 * 1、前言 * 2、多Agent协同:组建你的AI龙虾军团 * 2.1 架构基础:单Gateway多Agent * 2.1.1 三层隔离模型 * 2.1.2 Bindings路由系统 * 2.2 案例:5只AI龙虾同住一台服务器 * 2.2.1 踩坑实录 * 2.2.2 Discord双模设计 * 2.2.3 三层记忆架构 * 2.3 案例:9 Agent科研团队一键部署 * 2.3.1 对抗性协作设计 * 2.3.2 一键部署 * 2.4 案例:

2026年最值得关注的6个AI新模型,国内中转API价格全面对比

2026年最值得关注的6个AI新模型,国内中转API价格全面对比 数据来源:本文价格数据均来自 API易、DMXAPI、No.1-API、一步API、柏拉图AI、老张API、GreatRouter、Grsai 等8家主流中转服务商的公开报价,采集时间为2026年3月,仅供参考,以各平台实时报价为准。 最近这段时间,AI模型圈子可以说是热闹非凡。Anthropic、Google、OpenAI三家几乎同时放出了一批让人眼前一亮的新模型。但对于国内开发者来说,直连官方API不仅需要解决支付问题,还要面对网络延迟、限速等各种麻烦。中转API服务商因此成了很多人的首选。 本文基于对8家主流中转服务商的价格数据进行整理,重点对比以下6个近期最受关注的模型: * claude-opus-4-6 — Anthropic 新一代旗舰对话模型 * claude-sonnet-4-6 — Anthropic 旗舰对话模型 * claude-sonnet-4-6-thinking — 带扩展思考能力的 Sonnet 变体 * gemini-3-pro-preview — Google Gemi

AI时代人人都是产品经理:落地流程:AI 核心功能,从需求到上线的全流程管控方法

AI时代人人都是产品经理:落地流程:AI 核心功能,从需求到上线的全流程管控方法

AI的普及正在重构产品经理的工作模式——不再依赖传统的跨部门协作瓶颈,AI可以成为产品经理的"全职助手",覆盖需求分析、原型设计、开发协同、测试验证全流程。本文将拆解AI时代产品核心功能从0到1落地的完整管控方法,让你用AI能力提升300%的落地效率。 一、需求阶段:AI辅助的需求挖掘与标准化 需求是产品的起点,AI可以帮你从海量信息中精准定位用户真实需求,避免"伪需求"浪费资源。 1. 需求挖掘:AI辅助用户洞察 传统需求调研依赖问卷、访谈,效率低且样本有限。AI可以通过以下方式快速完成用户洞察: * 结构化处理非结构化数据:用AI分析用户在社交媒体、客服对话、应用评论中的碎片化反馈,自动提炼高频需求点 * 需求优先级排序:基于KANO模型,AI可以自动将需求划分为基础型、期望型、兴奋型、无差异型四类,输出优先级列表 实战工具与示例: 使用GPT-4+Python脚本批量处理应用商店评论: import openai import pandas as

AI在医疗领域的十大应用场景:变革医疗健康未来与AI产品经理的新机遇

AI在医疗领域的十大应用场景:变革医疗健康未来与AI产品经理的新机遇

AI在医疗领域的十大应用场景:变革医疗健康未来与AI产品经理的新机遇 写在前面 在科技飞速发展的今天,人工智能(AI)已逐渐渗透到各个行业,医疗领域更是成为其大展身手的舞台。从疾病诊断到治疗方案制定,从药物研发到患者护理,AI正在深刻改变着医疗健康的面貌。对于产品经理而言,这一变革不仅意味着技术层面的升级,更是一次职业发展的重大机遇。 引言 传统产品经理的角色正逐渐向AI产品经理转型,这一转变不仅要求掌握新的技术工具,更需要对医疗行业的深刻理解和敏锐洞察。本文将深入探讨AI在医疗领域的十大应用场景,并阐述为何转型为AI产品经理是明智之选。 **本文将详细介绍AI在医疗领域的10大应用场景,并探讨AI产品经理在这一变革中的角色和价值。 为什么转型为AI产品经理? 1. 行业趋势所迫 随着AI技术的不断成熟,越来越多的医疗企业开始将AI应用于产品和服务中。传统产品经理若不及时转型,将面临被市场淘汰的风险。 2. 职业发展空间广阔 AI产品经理不仅需要具备产品管理的基本技能,还需掌握AI技术、数据分析、医疗知识等多方面的能力。这种复合型人才在市场上极为稀缺,因此拥有