iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
自我挑戰組

與AI搶奪意識ing系列 第 16

嵌入式功能QA SEO 解套方式 JS SDK

  • 分享至 

  • xImage
  •  

Q:現在ifram會被google seo降級?
A:
是的,使用 的內容在 Google SEO 上確實有一些限制,可能會影響 SEO 表現,以下是關鍵說明:

SEO 對 的實際影響
iframe 中的內容不被索引或排名加分
Google 通常不會將 iframe 中的內容視為主頁內容的一部分,也不會幫這些內容排名。
換句話說,如果你的網站主頁是靜態頁,只有嵌入 的方式嵌入了動態內容,這些內容對 SEO 幾乎沒有幫助。

用戶體驗與可存取性差
Google 的 Page Experience (頁面體驗) 算法會評估內容的可存取性。
如果重要內容在 iframe 中,而且手機上顯示不好,或造成 CLS(Layout Shift),會被降分。

影響 Page Speed 評分
iframe 會引入額外的 HTTP request、延遲 DOM ready,對 Lighthouse 測速不利。
Google 強調 Core Web Vitals(核心網頁指標),iframe 不當使用會拖慢 LCP、FID 等指標。

缺乏語意標記
SEO 友善的內容應包含 ~、、 等語意標籤,iframe 中的內容無法被主頁繼承。

總結

需要的話我可以幫你改寫成你要貼給工程師的版本,或幫你想 iframe 替代方案(例如 React component、postMessage 通訊方案等)。是否要繼續?

Q:兩個都簡單解釋
A:
替代方案

  1. JS SDK / React Component 嵌入(推薦)
    用 JavaScript 提供一段可以 import 或 的方式,讓主站直接渲染內容。
    內容會出現在主頁 DOM,Google 可以讀到,SEO 有加分。
    可設計成 iframe 的效果(隔離 CSS)但實際上是 DOM。

  2. postMessage 通訊(進階替代)
    如果非得用 iframe(例如安全性考量),可以搭配 window.postMessage 技術,讓 iframe 跟主頁交換資料。
    主頁可依據回傳內容更新 meta tag、JSON-LD 或 DOM,讓 SEO 引擎能抓到。

🔧 實作要點:
iframe 裡的內容發送 postMessage 給主頁
主頁收到後,把關鍵內容插入主頁 DOM

Q:你先給我圖示 讓我了解js sdk
A:
[1] 使用者頁面(如 Blogger)

┌───────────────────────────────┐
│ │
│ │
│ ← 這是嵌入點 │
│ │
│ │
│ │
│ │
│ 專案.mount(...) │
│ │
│ │
└───────────────────────────────┘


[2] SDK 載入執行(js 檔案)


[3] 呼叫 API 拿資料
→ GET /api/product?id=xxx
→ GET /api/auth/session


[4] SDK 把資料組成 HTML
→ 用 JS 建立 DOM 元素
→ 插入到 #專案-product 裡


[5] 使用者看到內容,SEO 也看得到
✅ DOM 上有完整內容
✅ 不像 iframe 被忽略

資料照樣從 API 來 → 你原本的後端可共用
用戶看到的內容直接出現在主頁 DOM 裡
Google 爬蟲看得到這些內容,有助於 SEO
可控制樣式、事件、互動,不被 iframe 限制

Q:寫個案例給我看 解釋原理
A:

  1. Blogger 主頁載入時:
    ├─ SDK 載入
    ├─ 執行 專案.mount('#專案-product', {...})
  2. SDK 發送 API 請求:
    GET /products/abc123 → 後端回傳 JSON
  3. SDK 把資料組成 HTML → 插入
  4. 使用者在主頁上就能看到商品 → 可點擊購買
  5. Google SEO 可看到這些 DOM 內容(因為不是 iframe)

Q:說明什麼是SDK?
A:
SDK = Software Development Kit
SDK 就是一包工具,讓別人可以很方便地把你的功能整合進他們的網站或應用程式。

你做了一套 專案 商品系統,
你不希望每個商家都要自己串 API、寫 HTML、處理事件。
所以你提供一段 JavaScript SDK,商家只要貼這段,
你幫他搞定資料抓取、畫面呈現、按鈕點擊,他什麼都不用管。

(OS:這完全就是我要的東西啊!!!!)

SDK 的類型(常見三種)

類型 說明 範例
JavaScript SDK 嵌在網站裡 Facebook SDK、LINE Pay SDK、你現在做的 專案 SDK
iOS / Android SDK 給手機 App 用 Google Maps SDK、Apple Pay SDK
Backend SDK 提供 Server 串接用 Firebase Admin SDK、Stripe Python SDK

如果你會寫 API,那你做 SDK 就像是幫這些 API 包成一顆「外掛」,讓別人直接用,不用學你 API 的細節。

Q:他可以做到之前提到的,判斷目前瀏覽器有沒有存商家登入後台的紀錄並且顯示相關功能嗎?
A:
✅ 可以,完全沒問題。JS SDK 完全可以做到判斷商家是否登入,並顯示額外的功能。

JS SDK 執行時在「瀏覽器端」,可以偵測本地 cookie(只要是同網域、httpOnly = false 的)。
若你 API 是 cookie-based 驗證(例如 Django session),只要 SDK 跟 API 同網域或允許 CORS,就可以順利驗證。
商家登入後台的狀態如果存在 cookie 裡(或 localStorage),SDK 可以直接抓來判斷。
你要的這個功能 —「顯示管理工具給商家用戶」— JS SDK 完全可以做到,甚至比 iframe 做法還靈活。

Q:js sdk有沒有什麼限制
A:
安全性
⚠️ 無法保護機密資料
SDK 在前端執行,不能放 API key、密碼、商家機密邏輯。所有邏輯都能被看見、修改。

跨網域 Cookie 存取
⚠️ 無法直接存取不同網域的 Cookie
如果 SDK 與 API 網域不同,要用 CORS + credentials: include,而且後端要設定 Access-Control-Allow-Credentials。

不同平台支援
⚠️ 一些平台(如 LINE 官方帳號)可能禁止外部 script
Blogger、WordPress 可嵌入,但某些平台會擋 JS。要測試平台支援程度。

依賴主頁 DOM 結構
⚠️ SDK 要自己處理插入位置、CSS 衝突
若用戶頁面 CSS 影響太多,SDK 插入的內容可能跑版,要做好隔離(例如加前綴 class)。

無法保證 DOM ready 時機
⚠️ 如果 SDK 載入太早,DOM 還沒準備好
必須確保 document.querySelector() 抓得到,建議用 DOMContentLoaded 或延遲執行。

SEO 影響有限
⚠️ 雖然比 iframe 好,但還是有些 SEO 抓不到 JS 執行結果
Google 會抓到 JS 渲染的 DOM,但不是保證;避免把所有內容都動態載入。

Q:這些有解套方式嗎?
A:
✅ 如何避開這些限制?

安全性
把敏感資料、交易邏輯放在後端 API,SDK 只做畫面渲染和事件觸發

跨網域 Cookie
SDK 發送請求時加上 credentials: 'include',API 網域設置 CORS

DOM ready 問題
SDK 執行時要確認 DOM 已載入,或用 window.onload

SEO
可搭配 SSR 網站使用;或盡量在主頁直接渲染關鍵文字內容

CSS 衝突
用唯一前綴 class,例如 tp-card, tp-button,或用 Shadow DOM(進階)

Q:跨網域cookie看來是有解法,這是指 如果我今天在專案登入,他存的登入驗證在blogger頁面上是取不到的?
A:
完全正確,也問到關鍵了!
這正是 JS SDK 常見的一個「跨網域 Cookie 認證問題」,下面來解釋得更清楚一點。
是的,如果你的商家在 專案 的後台登入(專案網域),然後到 Blogger 頁面,預設情況下,SDK 是無法拿到那個登入 cookie 的。

解法:
跨網域 Cookie + CORS 認證設計
要讓 SDK 能「跨網域存取登入狀態」,你需要這樣設計:
✅ SDK 發 request 時這樣寫:
fetch('https://api.專案.com/api/auth/session', {
credentials: 'include' // 👈 告訴瀏覽器「要帶上 cookie」
});

✅ API Server(例如 Django)要加上這些 CORS 設定:
Access-Control-Allow-Origin: https://abc.blogspot.com
Access-Control-Allow-Credentials: true
Allow-Origin:必須設定成 精確的網域(不能是 *)
Allow-Credentials:必須設為 true,瀏覽器才會帶 cookie

✅ 並且登入時設定 Cookie 屬性(Set-Cookie)如下:
Set-Cookie: sessionid=xxx; Path=/; Secure; HttpOnly; SameSite=None
📌 SameSite=None 是關鍵:這表示「允許跨站點請求攜帶這個 cookie」

(OS:這問題我問得不好,有種預設立場FU,好險他給了我解套方式,看來還是可以解套)

Q:複習一下cookie的原理
A:
Cookie 是瀏覽器自動幫你「保存和夾帶」的小型資料,屬於特定網域,主要用來做「身份驗證」。

  1. 使用者登入 平台
    → 瀏覽器發送 POST /api/login

  2. 伺服器驗證成功後回傳:
    Set-Cookie: sessionid=abc123; Path=/; HttpOnly; Secure

  3. 之後只要在 專案 網域下發 request,
    瀏覽器會自動帶上這個 cookie:
    Cookie: sessionid=abc123

    ✅ 一張圖幫你總結 Cookie 認證流程

        [1] 使用者登入 專案
     ┌─────────────┐
     │ POST /login │
     └────┬────────┘
          │
          ▼
    

Server 回應:
Set-Cookie: sessionid=abc123; SameSite=None; Secure

    [2] Blogger 網頁嵌入 SDK
    ┌────────────────────────────┐
    │ fetch('/api/auth/session') │
    │ credentials: 'include'     │
    └─────────────┬──────────────┘
                  │
                  ▼
     瀏覽器自動帶 cookie:sessionid=abc123

結論
Cookie 是由伺服器透過 Set-Cookie 設定的
使用者登入成功後伺服器會設定

Cookie 屬於「網域」→ 其他網域預設不能用
所以跨站 SDK 不能自動拿到除非有設計

如果要讓 SDK(別的網域)取到 Cookie → SameSite=None + Secure + CORS
這是你目前最重要的配置關鍵!

Q:瀏覽器還有哪些像這樣可以存物件的型態LocalStorage?cookie?這算存物件嗎?
A:
✅ 各瀏覽器儲存方式總結:
Cookie: 小型資料夾,❌ 無法直接存物件,只能存字串,自動送出,4KB 限制,可設 HttpOnly
LocalStorage: 鍵值對儲存,✅ 可存物件(要轉字串),永久保存,不會自動送出
SessionStorage: 鍵值對儲存,✅ 可存物件(要轉字串),同一分頁有效,關頁即清除
IndexedDB: NoSQL 資料庫,✅ 可直接存 JS Object,支援大型資料、查詢、非同步操作
Cache Storage: HTTP 快取,✅ 可存整個 Response/Request,進階用法,常用於離線應用
Web SQL(已淘汰): SQL 資料庫,✅ 可存結構化表格資料,但已被淘汰,建議改用 IndexedDB

✅ 建議使用場景對應:
使用者登入驗證: ✅ Cookie
儲存使用者偏好 / 最近瀏覽: ✅ LocalStorage
暫存單頁表單進度: ✅ SessionStorage
儲存大量資料 / 離線商品清單: ✅ IndexedDB
快取 API / 做離線 PWA: ✅ Cache API


上一篇
我在製作專案功能API的路上
下一篇
ngrok嵌入被降等http,X-Frame-Options 的deny問題
系列文
與AI搶奪意識ing21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言