[翻译]入门angular的 Service Workers

原文

前期准备

如下的基础知识:


从5angular.0.0开始,在任意cli项目中,你可以很容易的开启Angular service worker。这文档是介绍怎么去在新的或旧的项目中启用Angular service worker。会通过一个简单的例子是展示service worker的行为与基本缓存。

在新项目中添加service worker

如果你要生成一个新的cli项目,你可以使用cli去配置Angular service worker:

ng new my-project --service-worker

--service-worker命令会去做所有的配置并添加需要依赖的包。想了解更多,可查看下面的关于如何在旧项目添加service worker的说明

在旧项目中添加service worker

添加步骤:

  1. 添加service worker的包依赖。
  2. 在cli配置中启用service worker。
  3. 导入和注册service worker。
  4. 新建配置文件,定义缓存的行为和其它设定。
  5. 编译项目。

步骤1:添加service worker的包依赖。使用yarn包管理工具:

yarn add @angular/service-worker

步骤2:在cli配置中启用service worker:

要开启Angular service worker,cli必须在编译时生成Angular service worker的配置。要在旧项目中通知cli去做这一步,必须把.angular-cli.json文件里的 serviceWorker的值改成true

ng set apps.0.serviceWorker=true

步骤3:导入和注册service worker:

src/app/app.module.ts中:

import  {  [ServiceWorkerModule](https://angular.io/api/service-worker/ServiceWorkerModule)  }  from  '@angular/service-worker';  
import  { environment }  from  '../environments/environment';

@NgModule({ 
declarations:  [  AppComponent  ], 
imports:  [  
   BrowserModule,  
   ServiceWorkerModule.register('/ngsw-worker.js',  {enabled: environment.production})  
   ], 
   providers:  [ ],
   bootstrap:  [AppComponent]
 })  
export  class  AppModule  {  }

ngsw-worker.js文件是cli编译生成的service worker脚本,最后能在dist/里找到。

步骤4: 新建配置文件, ngsw-config.json

angular cli需要名为ngsw-config.json的service worker配置文件。这文件定义了如何去缓存文件与数据资源。

你可以使用cli产生的通用配置版本

或者,将以下内容保存为src/ ngsw-config.json:

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "app",
    "installMode": "prefetch",
    "resources": {
      "files": [
        "/favicon.ico",
        "/index.html"
      ],
      "versionedFiles": [
        "/*.bundle.css",
        "/*.bundle.js",
        "/*.chunk.js"
      ]
    }
  }, {
    "name": "assets",
    "installMode": "lazy",
    "updateMode": "prefetch",
    "resources": {
      "files": [
        "/assets/**"
      ]
    }
  }]
}

步骤 5: 编译项目

ng build --prod

产生的项目就是启用了Angular service worker了.

Service worker 的展示说明

此模块通过一个示例来展示说明service worker

使用http-server构建服务器

因为ng serve 不会启动service worker,你必须使用另一个http服务器去本地测试你的项目。你可以使用任何的HTTP服务器。下面例子是使用http-server,可以通过npm安装。为了减少冲突的可能性,将在一个专用的端口测试。
要使用http-server开启服务,要移动到打包文件的文件夹内然后启动web服务:

cd dist
http-server -p 8080

初次加载

服务启动中,你可以在浏览器访问http://localhost:8080/。你的应用应该是正常运行。

提示:当测试Angular service workers,最好是在浏览器中使用无痕或私有窗口,这能保证service worker不会从以前的留下的缓存中读取数据,造成意外的状况。

模拟网络问题

要模拟网络问题,可禁止应用的网络连接。在Chrome内:

  1. Select Tools > Developer Tools (开发人员工具).
  2. 进入Network分页.
  3. 勾选the Offline 项.

Now the app has no access to network interaction.
现在应用没法访问网络了。

对于那些没有使用Angular service worker的应用,刷新页面会显示 "There is no Internet connection"的页面。

添加了Angular service worker的应用不一样。刷新后,页面正常显示。
如果你查看Network 分页的信息,你就能验证service worker是在工作。

什么被缓存

会发现所有用来渲染app的文件都被缓存了。给cli使用的通用ngsw-config.json就是定义了缓存这些特定的资源:

  • index.html.
  • favicon.ico.
  • 编译的文件 (JS and CSS bundles).
  • assets文件夹里的所有文件.

修改你的应用

现在你已经看到service worker如何缓存你的应用,下一步是理解更新如何工作。

  1. 如果你在一个无痕窗口中测试,打开另一个分页。这会使状态和缓存不会再测试中消失。
  2. 关闭应用的分页,但不是浏览器。这也会关闭了开发者工具。
  3. 关闭http-server的服务。
  4. 下一步,修改应用,查看service worker安装更新。
  5. 打开src/app/app.component.html并编辑
  6. 修改文本 Welcome to {{title}}! 为 Bienvenue à {{title}}!.
  7. 再次编译并启动服务
ng build --prod
cd dist
http-server -p 8080

在浏览器中更新你的应用

现在观察浏览器和service worker是如何处理更新了的应用

  1. 在同一浏览器再次打开http://localhost:8080 。发生什么?

    哪里出错了?实际是没有的。Angular service worker就在执行它的工作,展示它已安装的应用的版本。尽管有一个可用的更新。为了提高速度,service worker会在完成展示已缓存的应用后才去检查更新。

如果你查看http-server的日志,你就可以看到service worker请求/ngsw.json。这是service worker在检查更新。

  1. 刷新页面.

service worker在后台安装了更新的app版本,下次页面加载或重加载时,service worker就展示最新的版本。

更多的关于 Angular service workers

你可能对以下感兴趣

你们的赞赏是我的无限动力

如果觉得文章对你有点用的话,麻烦拿出手机,这里有一个你我都有的小福利(每天一次): 打开支付宝首页搜索“8601304”,即可领红包。谢谢支持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350