详解使用angular框架离线你的应用(pwa指南)


Posted in Javascript onJanuary 31, 2019

简介

关于service worker,网络上已经有了较多的文章。总的来说它依靠缓存资源,拦截http请求,来帮助我们达到离线使用网站的效果。

而angular cli为了让使用service worker更加便利,为开发者提供了一个配置窗口(ngsw-config.json)和一个与service worker通讯的服务(SwUpdate)。

启用

1、新建项目后在项目根目录下键入ng add @angular/pwa

会为你的项目添加一些文件,其中包括上文提到的ngsw-config.json,为了即刻感受离线应用的魅力,现暂不需配置。

2、安装http-server npm install http-server -g

将用http-server启用的服务器来加载应用,这么做是为了模拟真实的生产环境,因为ng serve环境下无法启用service worker。

3、键入ng build --prod进行打包。 打包完成后进入dist下的项目根目录下,键入http-server -p <port>将打包后的应用部署在http-server指定的端口上。

4、打开浏览器进入控制台,以chrome为例,在network选项卡上勾选offline模拟离线使用。

此时重新刷新网页发现页面依然能够在离线状态下显示,说明service worker已经工作了。

配置

以上并没有手动配置ngsw-config.json,然而初始的配置还有许多不足,比如无法拦截缓存api请求。因此需要对该文件的配置参数做一个大概了解(点击浏览官方配置说明)。

参考官方的说明,我们了解到可以配置静态资源的缓存策略(配置项中的assetGroups)以及动态资源的缓存策略(配置项中的dataGroups)。

静态资源配置(assetGroups)

interface AssetGroup {
 name: string;
 installMode?: 'prefetch' | 'lazy';
 updateMode?: 'prefetch' | 'lazy';
 resources: {
  files?: string[];
  /** @deprecated As of v6 `versionedFiles` and `files` options have the same behavior. Use `files` instead. */
  versionedFiles?: string[];
  urls?: string[];
 };
}

这是该配置项的接口,下面对各个属性做一个简要的说明:

  • resources属性下可配置本地的静态资源(resources.files)和通过cdn来的静态资源(resources.urls)
  • name是需要编写的该资源集合的唯一的名字
  • installMode配置的是你的网站应用第一次在当前浏览器加载后,service worker应该进行的缓存策略。选择'prefetch'会将resources列出的资源一股脑儿的预先缓存起来,不管当前是否有访问到。选择'lazy'则不会预先缓存,而是在用到时才会进行缓存。
  • updateMode配置的是当检测到资源的版本改变之后,所进行的资源缓存策略。

如何得知资源的版本发生了变化呢?angular service worker会对比资源内容的hash值。如果hash值不同则版本不同。选择'prefetch'会立即缓存更新的资源,选择'lazy'会在用到时在进行缓存。不过,这里要注意如果在installMode的配置中没有选择'lazy'模式,则这里的'lazy'模式也不会生效。

动态资源配置(dataGroups)

export interface DataGroup {
 name: string;
 urls: string[];
 version?: number;
 cacheConfig: {
  maxSize: number;
  maxAge: string;
  timeout?: string;
  strategy?: 'freshness' | 'performance';
 };
}

这是缓存动态资源的配置项,其实就是缓存的ajax、fetch的response,将这些api请求的响应体进行缓存后,就可以在离线状态下使用。其中:

  • urls配置api的url
  • cacheConfig配置具体的缓存策略:
    • maxSize 缓存的最大条目数或响应数,太多则会暂用系统资源
    • maxAge 过期时间,该项与下面提到的strategy策略配合,如果设置过长,容易呈现老资源给用户。
    • timeout是指的应用发起真实网络请求后的等待时间,如果超时将会配合下面提到的strategy进行动作
    • strategy策略,选择'performance'会直接拦截网络请求,返回缓存(前提是有缓存,并且没有超过maxAge的时间),选择'freshness'会在timeout超时的时候返回缓存。

与service worker通讯

与service worker通讯可以让我们主动做很多事情,而不是仅仅依赖于ngsw-config.json配置,通过依赖注入一个SwUpdate*服务,我们可以主动要求查询、更新、激活应用的版本,(这部分内容笔者还未投入应用,详见官网描述)

总结

这篇文章我们分享了如何在angular里面使用service worker 进行离线场景的增强,其中包括

  • 引入@angular/pwa
  • 安装http-server,模拟生产环境
  • 配置ngsw-config.json 缓存策略
  • 简单描述了与service worker通讯的概念

相信今后angular框架能够在pwa应用方便给我们更多的方便。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 对象、函数和继承
Jul 07 Javascript
JavaScript实现关键字高亮功能
Nov 12 Javascript
AngularJS语法详解
Jan 23 Javascript
浅谈EasyUI中编辑treegrid的方法
Mar 01 Javascript
Node.js 日志处理模块log4js
Aug 28 Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
Aug 03 Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
Dec 03 Javascript
微信小程序实现轨迹回放的示例代码
Dec 13 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
nuxt 每个页面head标签内容设置方式
Nov 05 Javascript
Angular PWA使用的Demo示例
Jan 31 #Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 #Javascript
微信小程序开发的基本流程步骤
Jan 31 #Javascript
JSON的parse()方法介绍
Jan 31 #Javascript
JSON.stringify()方法讲解
Jan 31 #Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 #Javascript
vue中的mvvm模式讲解
Jan 31 #Javascript
You might like
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
Yii分页用法实例详解
2014/12/04 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
用Python编写一个国际象棋AI程序
2014/11/28 Python
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python 专题三 字符串的基础知识
2017/03/19 Python
python中正则表达式的使用方法
2018/02/25 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
python迭代器常见用法实例分析
2019/11/22 Python
Python运行异常管理解决方案
2020/03/09 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
利用指针变量实现队列的入队操作
2012/04/07 面试题
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
校园十佳歌手策划书
2014/01/22 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers