附一个示例e6书写 todolist的示例,切换list的状态:

//todolist示例
const toggleTodo = (id)=>{
setTodos(todos => todos.map((todo)=>{
return todo.id === id
? {
...todo,
complete:!todo.complete,
}
:todo;
}))
}

=======================华丽的分割线!

可以参考文章:移动PWA初探
首先安装http服务:

npm install server -g

然后执行 server

navigator.serviceWorker.register('./sw.js',{scope:'/'}).   //scope代表这个脚本可以控制的页面的相对路径,默认就是脚本本身所在的路径
then(registration => {
console.log(registration);
},error=>{
console.error(error);
})

打开控制台

self 表示全局作用域对象,生命周期有三个:

self.addEventListener('install',event=>{ //只要sw.js有一点不同,就会重新执行这里
console.log('install',event);
event.waitUntil(new Promise(resolve=>{
setTimeout(resolve,5000)
})); //这个函数传入一个promise,执行完毕之后才表示install执行完毕,然后执行 activate
//
event.waitUntil(self.skipWaiting())
/*
根据 Service Worker 生命周期的特性,如果浏览器还在使用旧的 Service Worker 版本,即使有 Service Worker 新的版本也不会立即被浏览器激活,只能进行安装并进入等待状态,直到浏览器 Tab 标签被重新关闭打开。
在开发调试 Service Worker 时肯定希望重新加载后立即激活,我们不希望每次都重新打开当前页面调试,为此我们可以在 install 事件发生时通过 skipWaiting() 来设置 skip waiting 标记。 这样每次 Service Worker 安装后就会被立即激活。
*/
})
self.addEventListener('activate',event=>{
console.log('activate',event);
})
self.addEventListener('fetch',event=>{ //项目有外部请求,比如引入css文件,就会触发
console.log('fetch',event);
})

缓存资源的写入和读取:

const CACHE_NAME = 'cache-v1';

self.addEventListener('install',event=>{
console.log('install',event);
event.waitUntil(caches.open(CACHE_NAME).then(cache =>{
cache.addAll([
'/',
'./index.css'
])
}))
})
self.addEventListener('activate',event=>{
console.log('activate',event);
event.waitUntil(self.clients.claim());
})
self.addEventListener('fetch',event=>{
console.log('fetch',event);
event.respondWidth(caches.open(CACHE_NAME).then(cache => {
return cache.match(event.request).then(response => {
if(response){//如果 response 存在 说明命中了缓存
return response;
}
//如果没有命中 则保存缓存
return fetch(event.request).then(response=>{
cache.put(event.request,response.clone());
// 对应着 cache.put(key,value) 由于response是流式的 所以要加以缓存
return response;
})
})
}))
})

清理因为名字改变后的缓存:

self.addEventListener('activate',event=>{
console.log('activate',event);
//每次跟新缓存名字之后,都要清理之前的缓存,在fetch之前进行清理
event.waitUntil(caches.keys().then(cacheNames=>{ //cacahe.key()得到所有缓存的名字
return Promise.all(cacheNames.map(cacheName => {
if(cacheName !== CACHE_NAME){
return caches.delete(cacheName)
}
}))
}));
})

现在是有两个的缓存,如果执行 激活状态下的 清理缓存 步骤之后,这里的缓存会变少。

Notification API (通知API)

PWA的更多相关文章

  1. 说说 PWA 和微信小程序--Progressive Web App

    作者:云图图链接:https://zhuanlan.zhihu.com/p/22578965来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 利益相关:微信小用户,谷歌小 ...

  2. [PWA] Keynote: Progressive Web Apps across all frameworks

    PWA: Add to home screen Angular Universal Server side rendering: for achieving better proference on ...

  3. PWA - 渐进式网络应用初认识

    Progressive Web Apps 简称PWA,是一种接近原生用户体验的渐进增强的web-app.从浏览器演进而来,沉浸式的体验,改进web的性能低下等.是Google 在2015年提出,今年才 ...

  4. 轻松把你的项目升级到PWA

    什么是PWA PWA(Progressive Web Apps,渐进式网页应用)是Google在2015年推出的项目,致力于通过web app获得类似native app体验的网站. 优点 1.无需客 ...

  5. PWA学习心得

    PWA学习心得 一.什么是PWA Progressive  Web  App , (渐进式增强 WEB 应用) 简称 PWA ,是提升WebApp的体验的一种新方法,能给用户原生应用的体验. PWA ...

  6. hexo 博客支持PWA和压缩博文

    目标网站 https://blog.rmiao.top/ PWA yarn add hexo-offline 然后在root config.yml里新增 # offline config passed ...

  7. 震撼功能:逐浪CMS全面支持PWA移动生成意指未来

    Progressive Web App, 简称 PWA,是提升 Web App 的体验的一种新方法,能给用户原生应用的体验. PWA 能做到原生应用的体验不是靠特指某一项技术,而是经过应用一些新技术进 ...

  8. 新事物学习---Chrome上使用PWA

    PWA是什么 PWA(Progressive Web Apps)是 Google 最近在提的一种 Web App 形态 (或者如 Wikipedia 所称的"软件开发方法").PW ...

  9. Angular 学习笔记 ( PWA + App Shell )

    PWA (Progressive Web Apps) 是未来网页设计的方向. 渐进式网站. Angular v5 开始支持 pwa 网站 (所谓支持意思是说有一些 build in 的方法和规范去实现 ...

  10. PWA初体验

    一.前言 现在市面上的Native  APP成千上万个,各种应用商店里面的APP琳琅满目.原生的APP下载到手机上之后,用户就可以获取一个方便的入口,体验上也十分顺畅.但是再好的事物难免有点缺点: 1 ...

随机推荐

  1. JPEG与JPEG2000

    JPEG与JPEG2000 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 背景介绍 JPEG 全名为 Joint Photographic Experts ...

  2. discuz 访问 Discuz! Database Error(2002) notconnect

    网站四五年了,今天突然访问,提示这个错误,在通过阿里云后台查看 CPU 一直处于100%,通过xshell 登录 OK 先看下数据库 不能重启,原来是数据库日志被写满了. /var/log/httpd ...

  3. CentOS系统下Tomcat的优化

    一.JVM内存优化(线程优化) vim ./bin/catalina.sh 在catalina.sh文件中添加以下配置: JAVA_OPTS="-server -Xms128m -Xmx12 ...

  4. 【洛谷】P3980 [NOI2008]志愿者招募

    [洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...

  5. C/C++内存知识(一)

    一.C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap)- 由程序 ...

  6. Python senium 中页面属性

    1.通过id定位元素2.通过class_name定位元素3.通过tag_name定位元素4.通过name定位元素5.通过link文字精确定位元素6.通过link文字模糊定位元素7.通过CSS定位元素8 ...

  7. MongoDB进阶之路:不仅仅是技术研究,还有优化和最佳实践--转载

    摘要:MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 本文将从操作手册.技术研究.会议分享.场景应用等几个方面给大家推荐干货好文 ...

  8. go if 便捷语句

    之前使用java  C#没这么用过. 绝对新技能 if v := math.Pow(x, n); v < lim { 跟 for 一样,`if` 语句可以在条件之前执行一个简单的语句. 由这个语 ...

  9. 使用Duilib开发Windows软件(2)——控件的基本介绍

    XML 先学习xml https://www.w3cschool.cn/xml/xml-xml-tutorialhc4o1t5m.html 控件 上图是我们下载的NIM_Duilib_Framewor ...

  10. SQL查询oracle数据库最近备份情况

    需求,查询RMAN备份情况,通过视图进行查询 SQL> //,) input_g, round(OUTPUT_BYTES///,) output_g order by ; SID OUTPUT_ ...