热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

创建一个离线优先,数据驱动的渐进式Web应用程序

在本文中,您将学习如何将Workbox和IndexedDB一起使用,创建离线优先、数据驱动的渐进式W

在本文中,您将学习如何将 Workbox 和 IndexedDB 一起使用,创建离线优先、数据驱动的渐进式Web应用程序(PWA)。即使关闭了Web应用程序,也可以使用后台同步功能将应用程序与服务器同步。

你将会学习到

  • 如何使用 Workbox 缓存应用程序
  • 如何使用 IndexedDB 存储数据
  • 如何在用户脱机时从 IndexedDB 中检索和显示数据
  • 脱机时如何保存数据
  • 如何在脱机时使用后台同步更新应用程序

你应该了解的

  • HTML, CSS, 和 Javascript
  • ES2015 Promises
  • 如何使用命令行
  • 熟悉一下 Workbox
  • 熟悉一下 Gulp
  • 熟悉一下 IndexedDB

你需要的

  • 拥有 terminal/shell 访问权限的电脑
  • 能上网
  • Chrome
  • 编辑器
  • Nodejs 和 npm

设置

如果你没有安装 Nodejs 需要安装一下

之后通过下面的方式 clone 模板仓库

git clone https://github.com/googlecodelabs/workbox-indexeddb.git

或者直接下载 压缩包

安装依赖并启动服务

到下载好的 git 仓库目录中,转到 project 文件夹

cd workbox-indexeddb/project/

然后安装依赖并启动服务

npm install
npm start

说明

这个步骤中会根据 package.json 定义的依赖并安装,打开 package.json 文件检查,会看到很多依赖,有很多是开发环境需要的(你可以忽略),主要的依赖是:

  • workbox-sw Workbox
  • workbox-background-sync 是 Workbox 用来后台同步的,稍后会提到
  • gulp 和 workbox-build 是构建工具

npm start 会构建并输出到 build 文件夹,启动 dev server,并且会开启一个 gulp watch 任务。 gulp watch 会监听文件的修改自动构建。 concurrently 可以同时跑 gulp 和 dev server

打开程序

打开 Chrome 并且跳转到 localhost:8081 你会看到一个事件列表的控制台,在弹出的权限确认菜单中点击允许

创建一个离线优先,数据驱动的渐进式 Web 应用程序

我们使用通知系统来告知用户程序的后台同步已经更新,试着测试一下页面底部的添加功能

说明

这个小项目的目标是离线保存用户的事件日历。你可以查看一下 app/js/main.js 文件的 loadContentNetworkFirst 方法看一下当前是怎么工作的,首先会请求 server,成功则更新页面,失败会在控制台打印一个信息,目前脱机是无法使用的,接下来我们添加一些方法使它脱机可用。

缓存我们的应用程序

编写 service worker

要想脱机工作,就需要 server worker,现在写一个。

把下面的代码添加到 app/src/sw.js

importScripts('workbox-sw.dev.v2.0.0.js');
importScripts('workbox-background-sync.dev.v2.0.0.js');

const workboxSW = new WorkboxSW();
workboxSW.precache([]);

保存。

说明

在开头我们引入了 workbox-swworkbox-background-sync

  • workbox-sw 包含了预缓存和向 service worker 添加路由的方法
  • workbox-background-sync 是在 service worker 中后台同步的库,稍后会提到

precache 方法接收一个文件列表的数组,注意现在先用一个空数组占位,下一步我们会用 workbox-build 去计算出这个数组的结果。

构建 service worker

推荐使用 Workbox 的构建模块,比如 workbox-build

把下面的代码添加进 project/gulpfile.js

gulp.task('build-sw', () => {
  return wbBuild.injectManifest({
    swSrc: 'app/src/sw.js',
    swDest: 'build/service-worker.js',
    globDirectory: 'build',
    staticFileGlobs: [
      'style/main.css',
      'index.html',
      'js/idb-promised.js',
      'js/main.js',
      'images/**/*.*',
      'manifest.json'
    ],
    templatedUrls: {
      '/': ['index.html']
    }
  }).catch((err) => {
    console.log('[ERROR] This happened: ' + err);
  });
});

现在取消一些注释:

gulpfile.js:

// uncomment the line below:
const wbBuild = require('workbox-build');

// ...

gulp.task('default', ['clean'], cb => {
  runSequence(
    'copy',
    // uncomment the line below:
    'build-sw',
    cb
  );
});

保存修改,因为修改了 gulp,所以我们得重新跑一下, Ctrl + C 退出当前的进程,重新运行 npm start ,会看到 service worker 的文件被生成在了 build/service-worker.js

取消 app/index.html 中 service worker 的注册代码

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('service-worker.js')
    .then(function(registration){
      console.log('Service Worker registration successful with scope: ',
      registration.scope);
    })
    .catch(function(err){
      console.log('Service Worker registration failed: ', err);
    });
}

保存修改,刷新浏览器 service worker 就会被安装。 Ctrl + C 关闭 dev server,再返回到浏览器中刷新页面,已经可以脱机运行了!

说明

在这一步中, workbox-buildbuild-sw 任务被合并到我们的 gulp 文件中,我们的构建过程是使用 workbox-build 库来从 swSrc(app/src/sw.js) 中生成 service work 到 swDest(build/service-worker.js) ,来自 globDirectory(build)staticFileGlobs 文件被注入到 build/service-worker.js 以供 precache 调用,还有每个文件的修订哈希。templatedUrls 选项告诉 Workbox 我们的站点以 index.html 的内容响应请求,因此我们不必管理两个单独的预缓存条目。

安装生成好的 service worker 预缓存应用程序的资源文件,Workbox 会自动去:

  • 为缓存资源设置缓存优先策略,允许应用程序离线加载
  • service work 更新时,使用修订哈希来更新缓存的文件

创建 IndexedDB 数据库

目前为止还不能离线加载数据,我们接下来创建一个 IndexDB 数据库来保存程序的数据,我们命名为 dashboardr

添加下面代码到 app/js/main.js

function createIndexedDB(){
  if (!('indexedDB' in window)) {return null;}
  return idb.open('dashboardr', 1, function(upgradeDb){
    if (!upgradeDb.objectStoreNames.contains('events')) {
      const eventsOS = upgradeDb.createObjectStore('events', {keyPath: 'id'});
    }
  })
}

取消 createIndexedDB 调用的注释:

const dbPromise = createIndexedDB();

保存文件,重启 server:

npm start

回到浏览器刷新页面,激活 skipWaiting 并再次刷新页面,在 Chrome 中,你可以在开发者 工具 中的 Application 面板中选择 Service Workers 点击 skipWaiting ,之后使用 开发者工具 检查数据库是否存在。在 Chrome 中你可以在 Application 面板中点击 IndexedDB 选择 dashboardr 查看 events 对象是否存在。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • linux qt打开常用文件格式,设置Linux Qt文件默认打开方式为QtCreator
    Linux自定义文件打开方式也可参照文本抱歉,本文前段时间写的ubuntu下的Qt工程文件默认打开方式是不好用的,因为其他的文本文件也会受到影响,强迫症患者,每次打开Qt工程都是先 ... [详细]
author-avatar
张诣轩压_143
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有