非常教程

AngularJS参考手册

Service Worker

快速起步

本文档解释了如何在 CLI 项目中启用对 Angular Service Worker 的支持。稍后它会用一个简单的范例来向你展示 Service Worker 实践,包括加载和基础的缓存功能。

前提条件

对下列知识有基本的了解:

  • Angular Service Worker 简介.
  • Angular v6,也包括 Angular CLI v6。

为你的项目添加 Service Worker

要让你的项目支持 Angular Service Worker,可以使用 CLI 命令 ng add @angular/pwa。它会添加 service-worker 包,并建立必要的支持文件,小心翼翼地配置你的应用,以便使用 Service Worker。

content_copyng add  @angular/pwa --project *project-name*

上述命令完成了如下步骤:

  1. 把 @angular/service-worker 添加到你的项目中。
  2. 在 CLI 中启用 Service Worker 的构建支持。
  3. 在应用模块中导入并注册 Service Worker。
  4. 修改 index.html 文件:
    • 包含要添加到 manifest.json 文件中的链接。
    • theme-color 添加 meta 标签。
  5. 创建图标文件,以支持安装渐进式应用(PWA)。
  6. 创建一个名叫 ngsw-config.json 的 Service Worker 配置文件,它会用来指定缓存的行为以及其它设定。 Now, build the project:

现在,构建本项目:

content_copyng build --prod

现在,这个 CLI 项目就可以使用 Angular Service Worker 了。

Service Worker 实战:向导

本节用一个范例应用来演示一下 Service Worker 实战。

http-server 启动开发服务器

由于 ng serve 对 Service Worker 无效,所以必须用一个独立的 HTTP 服务器在本地测试你的项目。 你可以使用任何 HTTP 服务器。下面这个例子使用来自 npm 中的 http-server 包。 为了减小端口冲突的可能性,我们在一个专用端口上进行测试。

要想使用 http-server 服务器,进入包含这些 web 文件的目录,并启动开发服务器:

content_copycd dist/*project-name*
http-server -p 8080

最初的加载

在服务器运行起来之后,你可以在浏览器中访问 http://localhost:8080/。你的应用像通常一样加载。

提示: 当测试 Angular Service Worker 时,最好使用浏览器中的隐身或隐私窗口,以确保 Service Worker 不会从以前的残留状态中读取数据,否则可能导致意外的行为。

模拟网络出问题

要想模拟网络出问题的情况,可以为你的应用禁用网络交互。在 Chrome 中:

  1. 选择 Tools > Developer Tools (从右上角的 Chrome 菜单)。
  2. 进入 Network 页
  3. 勾选 Offline 复选框。

快速起步

现在,本应用不能再和网络进行交互了。

对于那些不使用 Angular Service Worker 的应用,现在刷新将会显示 Chrome 的“网络中断”页,提示“没有可用的网络连接”。

有了 Angular Service Worker,本应用的行为就不一样了。刷新时,页面会正常加载。

如果你看看 Network 页,就会发现 Service Worker 是激活的。

快速起步

注意,在 “Size” 列中,请求的状态是 (from ServiceWorker)。 这表示该资源不是从网络上加载的,而是从 Service Worker 的缓存中。

什么被缓存了?

注意,浏览器要渲染的所有这些文件都被缓存了。 ngsw-config.json 样板文件被配置成了要缓存 CLI 用到的那些文件:

  • index.html.
  • favicon.ico.
  • 构建结果(JS 和 CSS 包)。
  • assets 下的所有文件。

修改你的应用

现在,你已经看到了 Service Worker 如何缓存你的应用,接下来的步骤讲它如何进行更新。

  1. 如果你正在隐身窗口中测试,请打开第二个空白页。这会让该隐身窗口和缓存的状态在测试期间持续活着。
  2. 关闭该应用的页面,而不是整个窗口。这也会同时关闭开发者工具。
  3. 关闭 http-server
  4. 接下来,对应用进行一些修改,并且观察 Service Worker 安装这些更新。
  5. 打开 src/app/app.component.html 供编辑。
  6. 把文本 Welcome to {{title}}! 改为 Bienvenue à {{title}}!
  7. 再次构建并运行此服务器:
content_copyng build --prod
cd dist
http-server -p 8080

在浏览器中更新你的应用

现在,看看浏览器和 Service Worker 如何处理这个更新后的应用。

  1. 再次在同一个窗口中打开 http://localhost:8080,发生了什么?

快速起步

错在哪里?哪里也没错,真的。Angular Service Worker 正在做自己的工作,并且用它已经安装过的版本提供服务,虽然,已经有新版本可用了。由于更关注速度,所以 Service Worker 并不会在启动它已经缓存过的版本之前先等待检查更新。

如果你看看 http-server 的 log,就会发现 Service Worker 请求了 /ngsw.json 文件,这是 Service Worker 正在检查更新。

  1. 刷新页面。

快速起步

Service Worker 在后台安装好了这个更新后的版本,下次加载或刷新页面时,Service Worker 就切换到最新的版本了。

AngularJS

Angular 是一个开发平台。它能帮你更轻松的构建 Web 应用。Angular 集声明式模板、依赖注入、端到端工具和一些最佳实践于一身,为你解决开发方面的各种挑战。

AngularJS目录

1.快速上手 | quick start
2.语言服务
3.安全
4.环境准备与部署
5.Service Worker
6.保持最新
7.从 AngularJS 升级
8.服务端渲染
9.Visual Studio 2015 快速上手
10.风格指南
11.国际化
12.测试
13.路由与导航
14. 教程 | Tutorial
15.架构
16.组件与模板
17.表单
18.可观察对象与RxJS
19.引导启动
20.Angular 模块
21.依赖注入
22.HttpClient
23.词汇表
24.AngularJS 应用
25.AngularJS 模块
26.AngularJS 事件
27.AngularJS HTML DOM
28.AngularJS 过滤器
29.AngularJS 控制器
30.AngularJS 指令
31.AngularJS 表达式
32.AngularJS 简介
33.AngularJS 参考手册
34.AngularJS 实例
35.AngularJS 输入验证
36.AngularJS 表单
37.AngularJS SQL
38.AngularJS 表格
39.AngularJS Http
40.AngularJS 包含
41.AngularJS Bootstrap
42.AngularJS API
43.AngularJS ng-checked 指令
44.AngularJS ng-change 指令
45.AngularJS ng-blur 指令
46.AngularJS ng-bind-template 指令
47.AngularJS ng-bind-html 指令
48.AngularJS ng-bind 指令
49.AngularJS ng-app 指令
50.AngularJS Scope(作用域)
51.AngularJS ng-model 指令
52.AngularJS ng-dblclick 指令
53.AngularJS ng-cut 指令
54.AngularJS ng-csp 指令
55.AngularJS ng-copy 指令
56.AngularJS ng-controller 指令
57.AngularJS ng-cloak 指令
58.AngularJS ng-click 指令
59.AngularJS ng-class-odd 指令
60.AngularJS ng-class-even 指令
61.AngularJS ng-class 指令
62.AngularJS ng-keyup 指令
63.AngularJS ng-keypress 指令
64.AngularJS ng-keydown 指令
65.AngularJS ng-init 指令
66.AngularJS ng-include 指令
67.AngularJS ng-if 指令
68.AngularJS ng-href 指令
69.AngularJS ng-hide 指令
70.AngularJS ng-focus 指令
71.AngularJS ng-disabled 指令
72.AngularJS ng-non-bindable 指令
73.AngularJS ng-mouseup 指令
74.AngularJS ng-mouseover 指令
75.AngularJS ng-mousemove 指令
76.AngularJS ng-mouseleave 指令
77.AngularJS ng-mouseenter 指令
78.AngularJS ng-mousedown 指令
79.AngularJS ng-model-options 指令
80.AngularJS ng-model 指令
81.AngularJS ng-list 指令
82.AngularJS ng-style 指令
83.AngularJS ng-srcset 指令
84.AngularJS ng-src 指令
85.AngularJS ng-show 指令
86.AngularJS ng-selected 指令
87.AngularJS ng-repeat 指令
88.AngularJS ng-readonly 指令
89.AngularJS ng-paste 指令
90.AngularJS ng-options 指令
91.AngularJS ng-open 指令
92.AngularJS ng-value 指令
93.AngularJS ng-switch 指令
94.AngularJS ng-submit 指令
95.AngularJS 服务(Service)
96.AngularJS Select(选择框)
97.AngularJS 动画
98.AngularJS 依赖注入