详解使用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 相关文章推荐
Array.prototype 的泛型应用分析
Apr 30 Javascript
JavaScript实现自己的DOM选择器原理及代码
Mar 04 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
JQuery处理json与ajax返回JSON实例代码
Jan 03 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
Apr 21 Javascript
jQuery里filter()函数与find()函数用法分析
Jun 24 Javascript
深入剖析javascript中的exec与match方法
May 18 Javascript
angular+webpack2实战例子
May 23 Javascript
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 Javascript
微信小程序调用后台service教程详解
Nov 06 Javascript
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
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
Zerg剧情介绍
2020/03/14 星际争霸
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php Smarty 字符比较代码
2011/02/27 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
js导出txt示例代码
2014/01/14 Javascript
JSON格式化输出
2014/11/10 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
对pandas处理json数据的方法详解
2019/02/08 Python
python输出pdf文档的实例
2020/02/13 Python
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
10条PHP编程习惯
2014/05/26 面试题
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
行政副总岗位职责
2014/02/23 职场文书
钢琴师观后感
2015/06/12 职场文书
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server