前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于 Angular PWA 应用中的 ngsw.json 文件

关于 Angular PWA 应用中的 ngsw.json 文件

作者头像
Jerry Wang
发布2022-08-07 15:02:55
1.2K0
发布2022-08-07 15:02:55
举报

将 Angular Service Worker 想象为安装在最终用户的 Web 浏览器中的前向缓存(Forward Cache)或内容交付网络 (CDN) 边缘。Service Worker 响应 Angular 应用程序对本地缓存中的资源或数据的请求,而无需等待网络。

与任何缓存一样,Service Worker 缓存具有内容过期和更新方式的规则。

关于应用版本的概念

在 Angular Service Worker 这个特殊的上下文中,版本是代表 Angular 应用程序的特定构建的资源集合。 每当部署应用程序的新 build 时,Service Worker 都会将该构建,视为应用程序的新版本。 即使只更新一个文件也是如此。 在任何给定时间,Service Worker 可能在其缓存中拥有多个版本的应用程序,并且可能同时为它们提供服务。

为了保持应用程序的完整性,Angular Service Worker 将所有文件组合成一个版本。 分组为一个版本的文件通常包括 HTML、JS 和 CSS 文件。 这些文件的分组对于完整性至关重要,因为 HTML、JS 和 CSS 文件经常相互引用并依赖于特定内容。 例如,一个 index.html 文件可能有一个引用 bundle.js 的 <script> 标记,它可能会尝试从该脚本中调用函数 startApp()。 每次提供此版本的 index.html 时,都必须提供相应的 bundle.js。 例如,假设 startApp() 函数在两个文件中都重命名为 runApp()。 在这种情况下,将调用 startApp() 的旧 index.html 与定义 runApp() 的新包一起提供是无效的。

这种文件完整性在延迟加载模块时尤其重要。 一个 JS 包可能会引用许多惰性块,并且惰性块的文件名对于应用程序的特定构建是唯一的。 如果正在运行的版本 X 的应用程序尝试加载延迟块,但服务器已经更新到版本 X + 1,则延迟加载操作将失败。

应用程序的版本标识由所有资源的内容决定,如果其中任何一个发生变化,它就会发生变化。 实际上,版本由 ngsw.json 文件的内容决定,该文件包括所有已知内容的哈希值。 如果任何缓存文件发生更改,则 ngsw.json 中文件的哈希值会更改。 此更改导致 Angular Service Worker 将活动的文件集视为新版本。

一个典型的 ngsw.json 例子:

代码语言:javascript
复制
{
  "configVersion": 1,
  "index": "/index.html",
  "assetGroups": [
    {
      "name": "app",
      "installMode": "prefetch",
      "updateMode": "prefetch",
      "urls": [
        "/favicon.ico",
        "/index.html",
        "/inline.5646543f86fbfdc19b11.bundle.js",
        "/main.3bb4e08c826e33bb0fca.bundle.js",
        "/polyfills.55440df0c9305462dd41.bundle.js",
        "/styles.1862c2c45c11dc3dbcf3.bundle.css"
      ],
      "patterns": []
    },
    {
      "name": "assets",
      "installMode": "lazy",
      "updateMode": "prefetch",
      "urls": [],
      "patterns": []
    }
  ],
  "dataGroups": [],
  "hashTable": {
    "/inline.5646543f86fbfdc19b11.bundle.js": "1028ce05cb8393bd53706064e3a8dc8f646c8039",
    "/main.3bb4e08c826e33bb0fca.bundle.js": "ae15cc3875440d0185b46b4b73bfa731961872e0",
    "/polyfills.55440df0c9305462dd41.bundle.js": "c3b13e2980f9515f4726fd2621440bd7068baa3b",
    "/styles.1862c2c45c11dc3dbcf3.bundle.css": "3318b88e1200c77a5ff691c03ca5d5682a19b196",
    "/favicon.ico": "84161b857f5c547e3699ddfbffc6d8d737542e01",
    "/index.html": "cfdca0ab1cec8379bbbf8ce4af2eaa295a3f3827"
  }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于应用版本的概念
相关产品与服务
内容分发网络 CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档