Shopline 客製化語法探針

對應計畫書 §6 答案 #2 與 P7。這一頁本身不會去碰 zoila.tw—— 那是有真實訂單在跑的店,硬規則第 4 條。操作方式一律是在後台新增一個測試分頁, 把下面的程式碼貼進客製化語法區塊,然後回來把結果填進表格。

要驗的四件事

項目貼什麼看什麼
A. 內嵌 <script type="module"> 探針 1 頁面上有沒有出現「MODULE OK」。沒有 → Shopline 濾掉 module script,Demo C 要改走 iframe。
B. 外部 script 來源 探針 2 能不能從外部網域載入 JS。被 CSP 擋 → 主控台會出現 Refused to load the script。
C. <iframe> 探針 3 iframe 有沒有被移除;有的話 frame-ancestors / X-Frame-Options 是否放行。
D. 自訂元素 + WebGL 探針 4 選物間能不能在客製化語法區塊裡真的跑起來。這是拓撲 A 成不成立的最終判準。

探針 1 — 內嵌 module script

<div id="probe-1">(等待)</div>
<script type="module">
  document.getElementById('probe-1').textContent = 'MODULE OK · ' + new Date().toISOString();
</script>

探針 2 — 外部 script

<div id="probe-2">(等待)</div>
<script>
  var s = document.createElement('script');
  s.src = 'https://<你的 demo 網域>/probe.js';
  s.onload  = function(){ document.getElementById('probe-2').textContent = 'EXTERNAL OK'; };
  s.onerror = function(){ document.getElementById('probe-2').textContent = 'EXTERNAL BLOCKED'; };
  document.head.appendChild(s);
</script>

探針 3 — iframe

<iframe src="https://<你的 demo 網域>/showroom.html?item=ceramic-mug-01&style=pixel"
        style="width:100%;aspect-ratio:16/10;border:0;border-radius:12px"
        allow="xr-spatial-tracking; accelerometer; gyroscope"></iframe>

iframe 是拓撲 B 的退路:就算 script 被濾掉,只要 iframe 活著, 商品頁按鈕仍然可以叫出選物間,只是換花色要靠 postMessage 回傳。

探針 4 — 完整選物間(拓撲 A)

<script type="module" src="https://<你的 demo 網域>/assets/element.js"></script>
<pixel-showroom inline assets="https://<你的 demo 網域>/assets/"
                item="ceramic-mug-01" data-style="pixel"
                style="display:block;width:100%;aspect-ratio:16/10"></pixel-showroom>

結果(實測後回填)

探針結果備註
A 內嵌 module script待測
B 外部 script待測
C iframe待測
D 自訂元素 + WebGL待測
CSP 標頭實際內容待測從 DevTools → Network → 文件回應標頭抄下來

不管結果如何都不致命

正式產品本來就走拓撲 B(並列式):Shopline 商品頁上只放一顆按鈕, 選物間跑在自己的站台上,靠深連結 ?item=…&variant=…&style=… 對接。探針只影響「能不能順便做到拓撲 A」。

本機自我驗證

下面這塊是把探針 4 的程式碼跑在自己站台上的樣子——它證明的是「元件本身沒問題」, 真正的變因只有 Shopline 的過濾規則。