# 调试PWA
使用 Application 面板检查、修改和调试网络应用清单、服务工作线程和服务工作线程缓存。
相关指南:
* Progressive Web App
本指南仅讨论 **Application** 面板的 Progressive Web App 功能。 如果您希望获得其他面板的帮助,请参阅本指南的最后一部分,即[其他 Application 面板指南](https://developers.google.com/web/tools/chrome-devtools/progressive-web-apps#other)。
<br>
总结
* 使用 **App Manifest** 面板检查您的网络应用清单和触发 Add to Homescreen 事件。
* 使用 **Service Worker** 面板执行与Service Worke相关的全部任务,例如注销或更新服务、模拟推送事件、切换为离线状态,或者停止服务工作线程。
* 从 **Cache Storage** 面板查看您的Service Worke缓存。
* 从 **Clear Storage** 面板中点击一次按钮,注销Service Worke并清除所有存储与缓存。
## 网络应用清单
如果您希望用户能够将您的应用添加到他们移动设备的主屏幕上,那么您需要一个网络应用清单。 清单定义应用在主屏幕上的外观、从主屏幕启动时将用户定向到何处,以及应用在启动时的外观。
相关指南:
[通过网络应用清单改进用户体验](https://developers.google.com/web/fundamentals/web-app-manifest/)
[使用应用安装横幅](https://developers.google.com/web/fundamentals/app-install-banners)
设置好清单后,您可以使用 Application 面板的 Manifest 面板对其进行检查。
![](https://box.kancloud.cn/e2c39d128a38b80476a93df36dbceda9_602x541.png)
* 要查看清单来源,请点击 **App Manifest** 标签下方的链接(上方屏幕截图中的 https://airhorner.com/manifest.json)。
* 按 **Add to homescreen** 按钮模拟 Add to Homescreen 事件。 如需了解详细信息,请参阅下一部分。
* **Identity** 和 **Presentation** 部分以一种对用户更加友好的方式显示了清单来源中的字段。
* **Icons** 部分显示了您已指定的每一个图标。
### 模拟 Add to Homescreen 事件
只有至少已经访问网站两次、访问至少间隔五分钟时才可以将网络应用添加到主屏幕上。 开发或调试您的 Add to Homescreen 工作流时,此条件非常不便。利用 App Manifest 窗格上的 Add to homescreen 按钮,您可以随时模拟 Add to Homescreen 事件。
您可以使用 [Google I/O 2016 Progressive Web App](https://events.google.com/io2016/) 测试此功能,该应用可以为 Add to Homescreen 提供相应支持。在应用打开时点击 **Add to Homescreen** 会提示 Chrome 显示“add this site to your shelf”横幅(桌面设备),而在移动设备上则会显示“add to homescreen”横幅。
![](https://box.kancloud.cn/730c59879579bb2e5b6cebc3f00adb63_1122x857.png)
**提示**:在模拟 Add to Homescreen 事件时请保持 **Console** 抽屉式导航栏处于打开状态。 Console 会告诉您清单是否存在任何问题,并记录与 Add to Homescreen 生命周期有关的其他信息。
**Add to Homescreen** 功能还不能模拟移动设备的工作流。 注意“add to shelf”提示在上方屏幕截图中的触发方式(即使 DevTools 处于 Device Mode)。 不过,如果您可以将应用成功添加到桌面设备文件架,那么在移动设备上也可以获得成功。
如果您希望测试真实的移动体验,则可以通过远程调试将一台真实的移动设备连接到 DevTools,然后点击 DevTools 上的 **Add to Homescreen**按钮,在连接的移动设备上触发“add to homescreen”提示。
<br>
## service worker
service worker是未来网络平台中的一种基础技术。它们是浏览器独立于网页在后台运行的脚本。这些脚本使您可以访问不需要网页或用户交互的功能,例如推送通知、后台同步和离线体验。
相关指南:
* [服务工作线程简介](https://developers.google.com/web/fundamentals/primers/service-worker)
* [推送通知:及时、相关且精确](https://developers.google.com/web/fundamentals/push-notifications)
**Application** 面板中的 **Service Workers** 面板是在 DevTools 中检查和调试service worker的主要地方。
![](https://box.kancloud.cn/0904f87920b120950b8a5a153d2cc0a5_718x415.png)
* 如果service worker已安装到当前打开的页面上,您会看到它将列示在此面板中。 例如,在上方的屏幕截图中,https://events.google.com/io2016/ 的作用域内安装了一个service worker。
* **Offline** 复选框可以将 DevTools 切换至离线模式。它等同于 Network 窗格中的离线模式,或者 Command Menu 中的 Go offline 选项。
* **Update on reload** 复选框可以强制service worker在每次页面加载时更新。
* **Bypass for network** 复选框可以绕过service worker并强制浏览器转至网络寻找请求的资源。
* **Update** 按钮可以对指定的service worker执行一次性更新。
* **Push** 按钮可以在没有负载的情况下模拟推送通知(也称为操作消息)。
* **Sync** 按钮可以模拟后台同步事件。
* **Unregister** 按钮可以注销指定的service worker。参阅清除存储,了解点击一次按钮即可注销服务工作线程并擦除存储和缓存的方式。
* **Source** 行可以告诉您当前正在运行的service worker的安装时间。 链接是service worker源文件的名称。点击链接会将您定向至service worker来源。
* **Status** 行可以告诉您service worker的状态。此行上的数字(上方屏幕截图中的 #1)指示service worker已被更新的次数。如果启用 update on reload 复选框,您会注意到每次页面加载时此数字都会增大。在状态旁边,您将看到 start 按钮(如果service worker已停止)或 stop 按钮(如果service worker正在运行)。service worker设计为可由浏览器随时停止和启动。 使用 stop 按钮明确停止service worker可以模拟这一点。停止服务工作线程是测试service worker再次重新启动时的代码行为方式的绝佳方法。它通常可以揭示由于对持续全局状态的不完善假设而引发的错误。
* **Clients** 行可以告诉您service worker作用域的原点。 如果您已启用 show all 复选框,focus 按钮将非常实用。 在此复选框启用时,系统会列出所有注册的service worker。 如果您点击正在不同标签中运行的service worker旁的 focus 按钮,Chrome 会聚焦到该标签。
如果service worker导致任何错误,将显示一个名为 **Errors** 的新标签。
![](https://box.kancloud.cn/01842d3ecf902289b722e68a3a62ec8c_508x296.png)
<br>
## service worker缓存
Cache Storage 面板提供了一个已使用(service worker)Cache API 缓存的只读资源列表。
![](https://box.kancloud.cn/41d702ef789a16d63ae263df8dc41cca_1558x686.png)
请注意,第一次打开缓存并向其添加资源时,DevTools 可能检测不到更改。 重新加载页面后,您应当可以看到缓存。
如果您打开了两个或多个缓存,您将看到它们列在 Cache Storage 下拉菜单下方。
![](https://box.kancloud.cn/a36143d0cdbdd865474a415eb34b3cea_806x208.png)
<br>
## 清除存储
开发 Progressive Web App 时,Clear Storage 面板是一个非常实用的功能。 利用此面板,只需点击一次按钮即可注销service worker并清除所有缓存与存储。 参阅下面的部分了解详情。
相关指南:
* [清除存储](https://developers.google.com/web/tools/chrome-devtools/iterate/manage-data/local-storage#clear-storage)
<br>
## 其他 Application 面板指南
参阅下面的部分,获取有关 Application 面板其他窗格的更多帮助。
相关指南:
* [检查页面资源](https://developers.google.com/web/tools/chrome-devtools/iterate/manage-data/page-resources)
* [检查和管理本地存储与缓存](https://developers.google.com/web/tools/chrome-devtools/iterate/manage-data/local-storage)
<br>
## 参考资料
* [调试 Progressive Web App](https://developers.google.com/web/tools/chrome-devtools/progressive-web-apps)
- 第一部分 HTML
- meta
- meta标签
- HTML5
- 2.1 语义
- 2.2 通信
- 2.3 离线&存储
- 2.4 多媒体
- 2.5 3D,图像&效果
- 2.6 性能&集成
- 2.7 设备访问
- SEO
- Canvas
- 压缩图片
- 制作圆角矩形
- 全局属性
- 第二部分 CSS
- CSS原理
- 层叠上下文(stacking context)
- 外边距合并
- 块状格式化上下文(BFC)
- 盒模型
- important
- 样式继承
- 层叠
- 属性值处理流程
- 分辨率
- 视口
- CSS API
- grid(未完成)
- flex
- 选择器
- 3D
- Matrix
- AT规则
- line-height 和 vertical-align
- CSS技术
- 居中
- 响应式布局
- 兼容性
- 移动端适配方案
- CSS应用
- CSS Modules(未完成)
- 分层
- 面向对象CSS(未完成)
- 布局
- 三列布局
- 单列等宽,其他多列自适应均匀
- 多列等高
- 圣杯布局
- 双飞翼布局
- 瀑布流
- 1px问题
- 适配iPhoneX
- 横屏适配
- 图片模糊问题
- stylelint
- 第三部分 JavaScript
- JavaScript原理
- 内存空间
- 作用域
- 执行上下文栈
- 变量对象
- 作用域链
- this
- 类型转换
- 闭包(未完成)
- 原型、面向对象
- class和extend
- 继承
- new
- DOM
- Event Loop
- 垃圾回收机制
- 内存泄漏
- 数值存储
- 连等赋值
- 基本类型
- 堆栈溢出
- JavaScriptAPI
- document.referrer
- Promise(未完成)
- Object.create
- 遍历对象属性
- 宽度、高度
- performance
- 位运算
- tostring( ) 与 valueOf( )方法
- JavaScript技术
- 错误
- 异常处理
- 存储
- Cookie与Session
- ES6(未完成)
- Babel转码
- let和const命令
- 变量的解构赋值
- 字符串的扩展
- 正则的扩展
- 数值的扩展
- 数组的扩展
- 函数的扩展
- 对象的扩展
- Symbol
- Set 和 Map 数据结构
- proxy
- Reflect
- module
- AJAX
- ES5
- 严格模式
- JSON
- 数组方法
- 对象方法
- 函数方法
- 服务端推送(未完成)
- JavaScript应用
- 复杂判断
- 3D 全景图
- 重载
- 上传(未完成)
- 上传方式
- 文件格式
- 渲染大量数据
- 图片裁剪
- 斐波那契数列
- 编码
- 数组去重
- 浅拷贝、深拷贝
- instanceof
- 模拟 new
- 防抖
- 节流
- 数组扁平化
- sleep函数
- 模拟bind
- 柯里化
- 零碎知识点
- 第四部分 进阶
- 计算机原理
- 数据结构(未完成)
- 算法(未完成)
- 排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 搜索算法
- 动态规划
- 二叉树
- 浏览器
- 浏览器结构
- 浏览器工作原理
- HTML解析
- CSS解析
- 渲染树构建
- 布局(Layout)
- 渲染
- 浏览器输入 URL 后发生了什么
- 跨域
- 缓存机制
- reflow(回流)和repaint(重绘)
- 渲染层合并
- 编译(未完成)
- Babel
- 设计模式(未完成)
- 函数式编程(未完成)
- 正则表达式(未完成)
- 性能
- 性能分析
- 性能指标
- 首屏加载
- 优化
- 浏览器层面
- HTTP层面
- 代码层面
- 构建层面
- 移动端首屏优化
- 服务器层面
- bigpipe
- 构建工具
- Gulp
- webpack
- Webpack概念
- Webpack工具
- Webpack优化
- Webpack原理
- 实现loader
- 实现plugin
- tapable
- Webpack打包后代码
- rollup.js
- parcel
- 模块化
- ESM
- 安全
- XSS
- CSRF
- 点击劫持
- 中间人攻击
- 密码存储
- 测试(未完成)
- 单元测试
- E2E测试
- 框架测试
- 样式回归测试
- 异步测试
- 自动化测试
- PWA
- PWA官网
- web app manifest
- service worker
- app install banners
- 调试PWA
- PWA教程
- 框架
- MVVM原理
- Vue
- Vue 饿了么整理
- 样式
- 技巧
- Vue音乐播放器
- Vue源码
- Virtual Dom
- computed原理
- 数组绑定原理
- 双向绑定
- nextTick
- keep-alive
- 导航守卫
- 组件通信
- React
- Diff 算法
- Fiber 原理
- batchUpdate
- React 生命周期
- Redux
- 动画(未完成)
- 异常监控、收集(未完成)
- 数据采集
- Sentry
- 贝塞尔曲线
- 视频
- 服务端渲染
- 服务端渲染的利与弊
- Vue SSR
- React SSR
- 客户端
- 离线包
- 第五部分 网络
- 五层协议
- TCP
- UDP
- HTTP
- 方法
- 首部
- 状态码
- 持久连接
- TLS
- content-type
- Redirect
- CSP
- 请求流程
- HTTP/2 及 HTTP/3
- CDN
- DNS
- HTTPDNS
- 第六部分 服务端
- Linux
- Linux命令
- 权限
- XAMPP
- Node.js
- 安装
- Node模块化
- 设置环境变量
- Node的event loop
- 进程
- 全局对象
- 异步IO与事件驱动
- 文件系统
- Node错误处理
- koa
- koa-compose
- koa-router
- Nginx
- Nginx配置文件
- 代理服务
- 负载均衡
- 获取用户IP
- 解决跨域
- 适配PC与移动环境
- 简单的访问限制
- 页面内容修改
- 图片处理
- 合并请求
- PM2
- MongoDB
- MySQL
- 常用MySql命令
- 自动化(未完成)
- docker
- 创建CLI
- 持续集成
- 持续交付
- 持续部署
- Jenkins
- 部署与发布
- 远程登录服务器
- 增强服务器安全等级
- 搭建 Nodejs 生产环境
- 配置 Nginx 实现反向代理
- 管理域名解析
- 配置 PM2 一键部署
- 发布上线
- 部署HTTPS
- Node 应用
- 爬虫(未完成)
- 例子
- 反爬虫
- 中间件
- body-parser
- connect-redis
- cookie-parser
- cors
- csurf
- express-session
- helmet
- ioredis
- log4js(未完成)
- uuid
- errorhandler
- nodeclub源码
- app.js
- config.js
- 消息队列
- RPC
- 性能优化
- 第七部分 总结
- Web服务器
- 目录结构
- 依赖
- 功能
- 代码片段
- 整理
- 知识清单、博客
- 项目、组件、库
- Node代码
- 面试必考
- 91算法
- 第八部分 工作代码总结
- 样式代码
- 框架代码
- 组件代码
- 功能代码
- 通用代码