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

栏目: 编程工具 · 发布时间: 7年前

内容简介:在本文中,您将学习如何将 Workbox 和 IndexedDB 一起使用,创建离线优先、数据驱动的渐进式Web应用程序(PWA)。即使关闭了Web应用程序,也可以使用后台同步功能将应用程序与服务器同步。如果你没有安装之后通过下面的方式 clone 模板仓库

在本文中,您将学习如何将 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 文件检查,会看到很多依赖,有很多是开发环境需要的(你可以忽略),主要的依赖是:

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 对象是否存在。


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

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术:第4卷 第4册(双语版)

计算机程序设计艺术:第4卷 第4册(双语版)

Donald E.Knuth / 苏运霖 / 机械工业出版社 / 2007-4 / 42.00元

关于算法分析的这多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷组成了程序设计理论和实践的惟一的珍贵源泉,无数读者都赞扬Knuth的著作对个人的深远影响。科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员们已经成功地应用他的“菜谱式”的解到日常问题上,所有人都由于Knuth在书中所表现出的博学、清晰、精确和高度幽默而对他无比敬仰。   为开始后续各卷的写作并更......一起来看看 《计算机程序设计艺术:第4卷 第4册(双语版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具