前端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

Kylin(麒麟)V10系统安装WebLogic 12C

Kylin(麒麟)V10系统安装WebLogic 12C

目录 前言 一、JDK环境 二、安装WebLogic 1. 下载安装包 2. 开始安装 前言 先说下服务器的情况:我的环境是国产化环境,所以和之前的X86架构有些区别之处。 CPU是华为鲲鹏(Kunpeng)ARM64(aarch64)指令集架构,所以操作系统是:Kylin Linux Advanced Server V10 (ARM64) 。 由此我们在安装其他软件的时候也要注意这一点了,需要下载安装ARM64(aarch64)指令集架构的软件了,不然会会报指令集不符的相关错误提示。 一、JDK环境 Kylin V10系统默认安装匹配的是OpenJDK。 这里我安装WebLogic 12C时使用的是Oracle JDK。当然OpenJDK应该也是可以的。 JDK要求:WebLogic 12.2.1.4 需要 JDK 8(1.8.

YOLO12目标检测WebUI:5分钟快速部署实战教程

YOLO12目标检测WebUI:5分钟快速部署实战教程 1. 引言:为什么选择YOLO12? 你有没有想过,让计算机像人眼一样快速识别图片中的物体?从自动驾驶汽车识别行人,到工厂流水线检测产品缺陷,目标检测技术正在改变我们的生活。而在众多检测模型中,YOLO系列一直以其"又快又准"的特点备受青睐。 YOLO12作为该系列的最新成员,在2025年初由纽约州立大学布法罗分校与中国科学院大学团队联合发布。这个以注意力机制为核心的实时目标检测模型,在保持YOLO系列高速推理优势的同时,进一步提升了检测精度。 今天,我将带你用短短5分钟时间,快速部署一个基于YOLO12的WebUI目标检测服务。无需深厚的AI背景,只要跟着步骤操作,你就能拥有一个功能完整的物体识别系统! 2. 环境准备与快速部署 2.1 系统要求 在开始之前,请确保你的系统满足以下基本要求: * 操作系统:Ubuntu 18.04+ 或 CentOS 7+ * 内存:至少4GB RAM(推荐8GB) * 存储空间:10GB可用空间 * Python版本:3.8或更高版本

Vue-Vben-Admin 从入门到实战:后端开发的前端探索之旅

Vue-Vben-Admin 从入门到实战:后端开发的前端探索之旅

技术视野拓展,从后端视角开启前端探索之旅 1. 概述:一名后端工程师的前端初体验 作为一名深耕后端多年的Java工程师,一直围绕着Spring全家桶、微服务、中间件和分布式架构等后端技术栈。前端世界对我而言,虽说感觉并不陌生,但总是带着一层神秘面纱,知识点零散,理解停留在表面。 直到某天,我在GitHub上偶然发现了Vue-Vben-Admin——这个拥有超过30k⭐️的热门前端脚手架,瞬间吸引了我的注意。它基于Vue3、TypeScript和Vite等前沿技术栈,提供了一套能够快速搭建企业级管理后台的前端解决方案。 为什么Vue-Vben-Admin如此火爆? 🔥 技术栈前沿 - 采用Vue3+TypeScript+Vite,这些都是当前前端生态中最新、最热门的技术组合 🔥 开箱即用 - 内置企业级项目所需的各种功能:权限管理、多种布局、主题切换、丰富示例,应有尽有 🔥 代码规范 - 严格的代码规范和类型检查,让后端开发者也能写出高质量的前端代码 🔥 性能优异 - 基于Vite的快速冷启动和热更新,开发体验流畅 🔥 多UI库支持 - 支持Ant Desi

中兴B863AV3.1-M2卡刷固件实战:从萌虎动画到无线网卡全解析

1. 中兴B863AV3.1-M2卡刷固件入门指南 第一次接触中兴B863AV3.1-M2刷机的朋友可能会觉得有些复杂,但其实只要跟着步骤来,整个过程并不难。这个固件最大的亮点就是加入了萌虎动画和无线网卡支持,让原本功能受限的机顶盒焕发新生。 我去年第一次刷这个固件时也踩过不少坑,比如U盘格式不对、刷机按键时机没掌握好等等。后来反复尝试了几次,终于摸清了门道。现在我的盒子开机就能看到可爱的萌虎动画,还能用USB无线网卡连接WiFi,彻底摆脱了网线的束缚。 这个固件适合哪些人呢?首先你得有个中兴B863AV3.1-M2的盒子,或者兼容的魔百盒E900V22C/D系列。其次最好有些基础的刷机经验,至少知道怎么进Recovery模式。如果你是纯小白,建议先看看其他基础教程练练手。 2. 萌虎动画的实现原理与定制 2.1 萌虎动画的技术解析 这个固件最吸引人的就是那个虎年主题的开机动画了。我拆解过这个动画包,发现它其实是由一系列PNG图片组成的bootanimation.zip。这个压缩包放在/system/media/目录下,包含三个关键部分: * desc.txt:定义动