PWA (Progressive Web Apps) 是未来网页设计的方向. 渐进式网站.

Angular v5 开始支持 pwa 网站 (所谓支持意思是说有一些 build in 的方法和规范去实现它) 。

就目前来说 pwa 有几个特点 :

1.https

2.Service work

3.Cache API

4.拦截 Fetch (任何游览器发出的请求, 包括 index.html)

5.Push API

6.Share API

主要的用途是 :

1. offline view (通过 service work + cache + 拦截 fetch 实现)

2. push notification (通过 service work + Push API + Notification API 实现)

3. AMP 网站预加载 service-work.js (在 amp page 出发 service worker 预加载整个页面需要的 html,js.css)

参考 :

https://blog.angular-university.io/service-workers/

https://blog.angular-university.io/angular-service-worker/

实现我就不说了,人家已经是 step by step 了. 我就讲一些重点吧.

service work 比较复杂的地方是 life cycle.

当你访问一个网站后 www.domain.com

当页面渲染好后, ng 会找到一个好的时间点去 register service worker 也就是加载 "/ngsw-worker.js".

ng 有自己的方式(比如对比文件的 hash 等等)去管理 life cycle (如果你知道怎么自己实现 service worker 的话,你会发现 ng 完全自己控制了 life cycle 而没有使用 default 的)

service work 开启后, 就是一般的预加载 css, js, html 等等. 然后统统都会 cache 起来.

完成后, 你 offline 就可以看到效果了. 你 refresh 的话会发现所有的请求都是从 cache 返回的,包括 index.html

连 index.html 都 cache 起来了,那要怎样更新网站呢 ?

每一次更新, ng 在 cli build 的时候都会生产一个 hash 放进 ngsw-worker.js,

网站每一次刷新虽然会先使用 cache 版本,但是它也会马上去加载 ngsw-worker.js 然后进行判断看 hash 是否一样。

如果发现有新的 js,css 那么就会去加载,等到下一次 refresh 就会使用新版本了. 如果你希望用户马上使用新版本, ng 也开放了一个 API

可以通过 subscribe 的方式监听这个 update event, 然后可以 alert 用户叫用户马上 refresh.

所以流程是  cache first -> check update -> notify user and update now Or wait for user next refresh

我建议在网站比较稳定后才设置 service work, 而

而且网页必须向后兼容, 或至少要有错误处理在版本过久的情况下。

因为不管怎样,用户一定会先获取到 cache 的版本,如果你的 cache 版本运行失败(比如你的 Ajax response 已经换了, 而之前的 js 版本无法处理, 甚至 error, 这样用户可能非常的难升级到新版本,而且体验也会很糟. 所以要用 pwa 要注意这个哦)

除了 cache, ng 也封装了 push notification。

之前写过一篇关于 push 的原生实现.

http://www.cnblogs.com/keatkeat/p/7503615.html

ng 的实现看这个

https://medium.com/google-developer-experts/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-2-practice-3221471269a1

目前还不支持 notification click 时间,这个还蛮糟糕的,非常重要的功能丫。怎么会没有实现呢 ? https://github.com/angular/angular/issues/20956

而且也没有扩展的方式,如果硬要就需要直接改 ngsw-worker.js  源码了。

最后说说 App-shell

这个和 skeleton 类似的概念, 取代单调的 loading bar.

step by step :  https://blog.angular-university.io/angular-app-shell/

ng 的实现手法是通过 cli build 时运行 server render, 然后把渲染好的 skeleton page 插入到 index.html.

好啦,接下来我会准备做一个简单的电子商务, 来实战一个 ng. 会做成一个视屏希望新手们可以省走冤枉路.

Angular 学习笔记 ( PWA + App Shell )的更多相关文章

  1. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  2. angular学习笔记(三十)-指令(1)-概述

    之前在 angular学习笔记(十九)-指令修改dom 里面已经简单的提到了angular中的指令,现在来详细的介绍 '指令' 一.指令的创建: dirAppModule.directive('dir ...

  3. 学习笔记:APP切图那点事儿–详细介绍android和ios平台

    学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址 ...

  4. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  5. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

  6. angular学习笔记(三十)-指令(7)-compile和link(2)

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  7. angular学习笔记(三十)-指令(7)-compile和link(1)

    这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...

  8. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  9. angular学习笔记(三十)-指令(5)-link

    这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...

随机推荐

  1. EasyNetQ WithTopic过滤失效的解决方案

    RabbitMQ原理及教程:http://www.cnblogs.com/AlvinLee/p/6141834.html EasyNetQ是什么以及常见用法这里都不做讲解.可以参考这篇博文:http: ...

  2. Java学习者的建议:把自己从一个疯狂下载者&资料的奴隶变成一个真正的学习者

    Java学习者的建议:把自己从一个疯狂下载者&资料的奴隶变成一个真正的学习者 你下载的资料看过了多少,请大家好好想想,然后回答一下很多人为了The.Economist花了不少时间,为了下载一个 ...

  3. 淘宝镜像 cnpm 不是内部命令

    升级npm之后安装淘宝镜像,然后一直提示不是内部命令,网上查看文章 http://blog.csdn.net/fighting_2017/article/details/76979844,发现是路径问 ...

  4. Git - 可视化冲突解决工具P4Merge

    P4Merge P4Merge是Git的一个第三发Diff和Merge工具(可视化冲突解决工具). 下载地址: https://www.perforce.com/downloads/visual-me ...

  5. 强大核心功能矩阵,详解腾讯云负载均衡CLB高可靠高性能背后架构

    1 前言 腾讯云负载均衡(Cloud LoadBalancer),简称CLB, 负载均衡通过设置虚拟服务地址(VIP)将来自客户端的请求按照指定方式分发到其关联的多台后端云服务器,服务器将请求的响应返 ...

  6. Angular开发实践(三):剖析Angular Component

    Web Component 在介绍Angular Component之前,我们先简单了解下W3C Web Components 定义 W3C为统一组件化标准方式,提出Web Component的标准. ...

  7. php 制作圆形图片

    function createRoundImg($imgpath) { $ext = pathinfo($imgpath); $src_img = null; switch ($ext['extens ...

  8. Explain

    explain关键字 explain关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.explain 可以帮助我们分析 sele ...

  9. js实现单双行文本溢出添加省略号

    # 单双行文本溢出省略 ``` // 2. 当内容过多的时候,单行省略号: overflow: hidden; text-overflow:ellipsis; white-space: nowrap; ...

  10. java基础笔记(4)----数组

    介绍: 数组是一种数据类型,是引用类型,是一块连续的内存空间,用于存储和管理相同类型的多个数据. 定义:-- > 数组的声明方式 先声明,在开辟内存空间--> int [] a; a=ne ...