跳至主要内容

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。你的內容安全策略仍須允許這些地址。

相關頁面​