跳到主要内容

CDN 版本管理

SDK 通过一个带版本的路径提供五个文件。网页只需引用第一个文件;它会在挂载产品时加载其余文件。

https://cdn.kaleidr.com/embed/v1/kaleidr.js the loader: window.Kaleidr and <kaleidr-map>
https://cdn.kaleidr.com/embed/v1/chat.js the chat panel
https://cdn.kaleidr.com/embed/v1/viewer.js the viewer's iframe loader
https://cdn.kaleidr.com/embed/v1/tile.js the tile iframe loader
https://cdn.kaleidr.com/embed/v1/editor.js the editor
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>

产品包在该产品首次挂载到页面时请求,每个页面最多请求一次。只显示 Viewer 的页面不会下载 chat.js 或 editor.js。

v1 的含义​

v1 代表的是接口约定,而不是一次具体构建。

  • 每个 URL 对应一个文件,新版本会直接替换该地址上的文件。
  • 不提供补丁版本路径,也没有按内容哈希命名的路径。你无法固定到 /embed/v1.2.3/kaleidr.js,因为该路径不存在。
  • 修复和向后兼容的新增功能会发布到 /embed/v1/,网页无需修改就会收到更新。

Kaleidr.version 是用于诊断的字符串,不是可以指定下载的构建版本号。

v1 中保持稳定的内容​

稳定项含义
五个 URL它们将持续可访问。
window.Kaleidrmount、init、enable 和 version 保持文档规定的行为。
挂载选项与元素属性已公开的选项会保持其名称和含义。
控制句柄每个句柄都包含 setCamera、setTheme、setStyle 和 destroy。不支持的方法只输出警告而不执行操作;不会抛出异常,也不会被删除。
两种 iframe 消息kaleidr-embed:ready 和 kaleidr-embed:error 保持其文档规定的字段。

v1 内允许发生的变化:

  • 新增内容。 可能出现新的选项、属性、句柄方法、消息字段、错误代码和流事件。代码必须忽略不认识的内容,例如未知消息字段、未知 code 和未知事件。
  • 外观。 聊天面板、编辑器和地图控件的外观可能改变。
  • 未公开的行为。 文档未描述的任何内容都可能变化,包括 SDK 与 iframe 之间的其他 kaleidr-embed: 消息、产品包定义的全局变量,以及控制台消息的确切文字。

HTTP API 在 /inference-api/b2b/v1/ 也遵循相同原则:只有破坏兼容性的变更才会推出 v2。变更记录在更新日志中。

如何发布破坏性变更​

可能破坏现有 v1 集成的变更不会发布到 /embed/v1/,而是作为并行的新主版本提供:

https://cdn.kaleidr.com/embed/v2/kaleidr.js
https://cdn.kaleidr.com/embed/v2/<product>.js

现有 v1 脚本标签会继续加载 v1 文件。阅读变更并准备升级后,修改脚本标签中的路径即可切换到新主版本。加载器只会请求与自己主版本一致的产品包。

缓存​

每个文件都会携带以下缓存配置提供服务

Cache-Control: public, max-age=300

并且 CDN 的副本会在每次发布时替换。

问题回答
新版本多快能到达访客?大约五分钟内。如果浏览器在此前五分钟内取得旧文件,在缓存过期前仍会继续使用它。
每打开一个页面都要重新下载 SDK 吗?不需要。取得文件后的五分钟内会使用浏览器缓存,随后再次向 CDN 检查。
可以自行缓存更长时间吗?不可以。代理、service worker 或构建流程长期保留副本,会在更新后继续提供过时代码。
可以添加子资源完整性校验(integrity="sha384-…")吗?不可以。每次发布都会改变文件哈希,浏览器会拒绝哈希不匹配的脚本,使嵌入组件在下一次发布后无法加载。
可以将 kaleidr.js 复制进自己的打包文件吗?不可以,原因相同。应直接引用 URL。

如果网站的 service worker 会缓存跨来源脚本,请将 https://cdn.kaleidr.com 排除在缓存优先策略之外,或采用会重新验证的缓存策略。

加载器和产品包分别发布​

五个文件独立发布。因此发布后短时间内,网页可能使用较新的 kaleidr.js 和浏览器缓存的旧产品包,或相反。SDK 已兼容这种情况:

  • 加载器会把选项传递给产品包,并允许旧包不认识新增的选项。

  • 如果调用产品支持、但缓存的产品包尚不具备的句柄方法,该调用不会产生效果,控制台会提示:

    [kaleidr] setStyle() IS supported on product "tile", but this mount did not expose it, so the call did nothing. …

    绕过缓存刷新页面即可获取最新产品包。缓存副本到期后,这种情况也会自动消失。

Viewer 和 Tile iframe 中的页面由 https://map-embed.kaleidr.com 提供,也会单独发布。网页如何缓存 SDK 不会影响这些页面。

自行托管​

你可以从自己的来源提供全部五个文件,例如让所有脚本都使用第一方来源。需要了解其中的代价:自行托管的副本不会自动获得修复。 API 和 iframe 内部页面仍会由 Kaleidr 更新,长期不更新的副本会逐渐与它们不兼容。

自行托管的步骤:

  1. 将全部五个文件镜像到 https://your-origin/embed/v1/。路径固定,仅允许改变来源。

  2. 在加载器运行前告诉它产品包所在的位置:

    <script>window.__KALEIDR_EMBED_BASE__ = 'https://cdn.example.com';</script>
    <script src="https://cdn.example.com/embed/v1/kaleidr.js"></script>

    或者在每次挂载时使用 base 选项或 base 属性。

  3. 定期重新镜像文件,并像 Kaleidr 一样以较短的缓存时长提供副本。

哪些来源可以用于覆盖 base​

加载器不会从任意来源获取产品包。只有当覆盖设置(页面全局值、base 选项或 base 属性)的来源属于以下情况时才会生效:

  • Kaleidr CDN(https://cdn.kaleidr.com);
  • kaleidr.js 本身的加载来源;或
  • 当前网页自己的来源。

只有加载器和产品包来自同一个来源,自行托管才会正常工作。 第 2 步即为这种设置:kaleidr.js 来自 https://cdn.example.com,因此 https://cdn.example.com 可作为 base。也允许从网页自身来源加载产品包。

任何其他值都会被忽略,包括其他 kaleidr.com 主机。嵌入组件仍会挂载,但产品包从 https://cdn.kaleidr.com 加载,控制台会显示:

[kaleidr] base "https://other.example.net" is IGNORED — bundles load from https://cdn.kaleidr.com. A base must be the Kaleidr CDN, the origin kaleidr.js was loaded from, or this page's own origin.

因此以下两种配置不受支持:

  • kaleidr.js 从 https://cdn.kaleidr.com 加载,base 却指向第三方来源。此时应同时从该第三方来源加载加载器。
  • 加载器位于你的一个来源,产品包位于另一个来源,且二者都不是当前网页的来源。请从同一个来源提供全部五个文件。

如果这个警告出现在仅允许自家脚本来源的内容安全策略页面中,那么到 https://cdn.kaleidr.com 的产品包请求将被阻止,页面无法显示内容。应修正 base,而非安全策略。

自行托管会改变及不会改变的内容:

  • 只自行托管 kaleidr.js 并不够。不覆盖 base 时,加载器仍会从 https://cdn.kaleidr.com 获取产品包。
  • 只使用 base 的来源部分,设置中的路径会被丢弃,并从该来源的 /embed/v1/ 请求产品包。
  • window.__KALEIDR_EMBED_BASE__ 必须是字符串,其他值会被忽略。
  • 自行托管仅改变脚本的来源。会话交换仍发送到 https://api.kaleidr.com,Viewer 和 Tile iframe 仍从 https://map-embed.kaleidr.com 加载,Editor 底图仍来自 https://tile.kaleidr.com。你的内容安全策略仍须允许这些地址。

相关页面​