Cyrus
16
8 月

第 33 章:JavaScript SEO 與 Log File 分析

第 33 章:JavaScript SEO 與 Log File 分析

Cyrus

JavaScript SEO 的重要性

在 SPA(Single Page Application)和前端框架(React、Vue、Angular)日益普及的時代,JavaScript SEO 成為技術 SEO 中最具挑戰性的領域。核心問題很簡單:

Google 能不能看到你的內容?

傳統網站:伺服器直接返回 HTML → Googlebot 直接讀取 ✅
JS 渲染網站:伺服器返回空的 HTML 框架 → 需要 JS 執行後才有內容 ⚠️

Google 如何處理 JavaScript

Googlebot 的「兩階段」索引流程

第一階段:爬取與解析
  → Googlebot 讀取 HTML,提取連結和資源(CSS/JS)

第二階段:渲染(延遲執行)
  → 將 JS 檔案送去 Web Rendering Service(WRS)
  → 使用 Chromium 執行 JS
  → 讀取最終渲染後的 DOM
  → 提取內容和連結

關鍵問題: 第一階段和第二階段之間存在時間差。Google 可能在第一階段就開始索引,也可能幾天甚至幾週後才進行第二階段的 JS 渲染。

2026 年現狀: Google 的 JS 渲染能力已大幅提升,但仍不是即時的。對於時效性內容,完全依賴 JS 渲染有風險。

三種渲染策略與 SEO 影響

1. CSR(Client-Side Rendering,用戶端渲染)

伺服器 → 空的 HTML(只有 <div id="root"></div>)→ 瀏覽器下載 JS → JS 執行 → 渲染內容
面向 評估
SEO 友善度 ❌ 有風險
首次載入速度 ❌ 較慢(需先載入 JS)
開發體驗 ✅ 前後端分離,開發效率高
Google 索引延遲 ⚠️ 數天至數週
社群媒體爬蟲 ❌ Facebook/Twitter 無法讀取 JS 內容

2. SSR(Server-Side Rendering,伺服器端渲染)

伺服器 → 執行 JS → 生成完整 HTML → 回傳給瀏覽器
面向 評估
SEO 友善度 ✅ 最佳
首次載入速度 ✅ 快速(直接回傳 HTML)
伺服器負載 ⚠️ 較高
開發複雜度 ⚠️ 需要 Node.js 伺服器
框架支援 Next.js、Nuxt.js、Remix、SvelteKit

3. SSG(Static Site Generation,靜態網站生成)

建置階段 → 預先渲染所有頁面 → 輸出純 HTML 檔案 → 部署到 CDN
面向 評估
SEO 友善度 ✅ 最佳
載入速度 ✅ 最快(純 HTML + CDN)
動態內容 ⚠️ 需在建置時決定,無法即時變更
框架支援 Next.js、Gatsby、Astro、Hugo、11ty

JavaScript SEO 實戰檢查

檢查 1:Google 看到的 vs 使用者看到的

使用以下工具對比:

工具 用途
Google Search Console → URL 檢查 查看 Google 渲染後的「螢幕擷圖」
Rich Results Test 查看 Google 能否讀取結構化資料
View Page Source (右鍵 → 檢視網頁原始碼) 查看「第一階段」Google 讀到的 HTML
Inspect Element (開發者工具) 查看 JS 渲染後的完整 DOM
Chrome DevTools → JavaScript 停用測試 模擬 Googlebot 第一階段爬取

核心檢查清單

☐ 關閉 JS 後,頁面主要內容是否存在?
☐ 關閉 JS 後,導覽連結是否可用?
☐ 關閉 JS 後,<title> 和 <meta description> 是否存在?
☐ 關閉 JS 後,canonical 標籤是否存在?
☐ 關閉 JS 後,結構化資料是否存在?
☐ 關閉 JS 後,<h1> 標題是否存在?
☐ 關閉 JS 後,內部連結是否可被發現?

實用方法: 在 Chrome 中安裝「Web Developer」擴充 → Disable JavaScript → 重新載入頁面,觀察內容是否仍然存在。

JavaScript 框架 SEO 最佳實踐

Next.js(React)

// 在需要 SEO 的頁面使用 SSR 或 SSG
export async function getServerSideProps(context) {
  // SSR: 每次請求都在伺服器端渲染
  const data = await fetch(`https://api.example.com/page/${context.params.id}`);  
  return { props: { data } };
}

export async function getStaticProps() {
  // SSG: 建置時生成靜態 HTML
  const data = await fetch('https://api.example.com/pages');
  return { props: { data } };
}

Nuxt.js(Vue)

// nuxt.config.js
export default {
  ssr: true,  // 啟用 SSR
  target: 'server',  // 或 'static' 用於 SSG
}

通用建議

做法 說明
動態 <title> 和 meta 使用 react-helmet(React)或 vue-meta(Vue)確保每個頁面的 meta 標籤正確
歷史路由模式 使用 History API(而非 hash /#/),確保 URL 乾淨
Lazy Loading 謹慎使用 確保主要內容不在 lazy load 中
避免 window / document 直接呼叫 SSR 環境中沒有這些物件,會報錯
關鍵 CSS 內聯 確保首屏樣式直接內嵌,不依賴 JS 下載

Log File 分析入門

什麼是 Log File?

伺服器日誌檔記錄了每一次被存取的請求,包括誰訪問了什麼、什麼時候、結果如何。對於 SEO 來說,最重要的是 Googlebot 的爬取紀錄

# Apache / Nginx 典型的 Log 格式
66.249.66.1 - - [23/Jul/2026:14:30:00 +0800] "GET /blog/seo-guide HTTP/1.1" 200 15240 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Log File 能回答的 SEO 問題

問題 Log 提供的答案
Googlebot 爬了哪些頁面?頻率多少? 每個 URL 的爬取時間和頻率
Googlebot 是否浪費時間在無意義頁面? 爬取非重要頁面的比例
多少請求返回 404 / 500 等錯誤? 每個狀態碼的請求數量和 URL
哪個爬蟲最活躍? 按 User-Agent 分類統計
靜態資源是否被大量爬取? JS/CSS/圖片被 Googlebot 請求的頻率
是否有意外的爬蟲在大量請求? 異常的爬蟲行為

Log File 分析的 SEO 價值

Googlebot 的爬取總量 = Crawl Budget

你應該確保:
- Googlebot 大部分時間在爬「重要頁面」
- Googlebot 沒有浪費時間在404、重定向、低品質頁面
- 重要新內容被快速發現和爬取

Log File 分析工具

免費工具

工具 說明
Screaming Frog Log File Analyser 最常用的 SEO Log 分析工具,支援視覺化報表
Google Search Console 查看「檢索統計資料」報告(簡單版 crawl stats)
ELK Stack(Elasticsearch + Logstash + Kibana) 開源大數據 Log 分析平台
GoAccess 終端機即時 Log 分析工具

專業付費工具

工具 特點
Botify 企業級 Log 分析,結合爬取數據和 Log 數據
Oncrawl 整合 Log、爬取、排名數據的 SEO 平台
Splunk 大型企業的 Log 管理平台

實務建議: 對大多數網站來說,Screaming Frog Log File Analyser 已足夠。每年一次深度 Log 分析就能發現大量優化機會。

Log File 分析實戰流程

第一步:取得 Log 檔案

  • 從主機面板(cPanel / Plesk)下載
  • 透過 SSH 存取 /var/log/nginx/access.log/var/log/apache2/access.log
  • 使用 CDN 的話,Cloudflare / CloudFront 都有 Log 下載功能

第二步:過濾 Googlebot

# Linux 命令列過濾 Googlebot
grep "Googlebot" access.log > googlebot-requests.log

第三步:分析��取模式

  • 哪些 URL 被爬取最多 / 最少?
  • 哪些目錄 被過度爬取(例如搜尋結果頁、篩選頁)?
  • 哪些重要頁面 長時間未被爬取?
  • 新內容 被發現的速度如何?
  • 錯誤回應(4xx/5xx)的比例?

第四步:制定優化行動

發現 行動
Googlebot 浪費時間在搜尋結果頁 robots.txt 阻止搜尋結果頁
重要產品頁很少被爬取 改善內部連結結構
大量 5xx 錯誤 修復伺服器效能問題
圖片 URL 被大量爬取 確保圖片有正確的 <img> 標籤
新文章多天未被爬取 檢查 Sitemap 更新和內部連結

Crawl Budget 優化策略

Crawl Budget(爬取預算) = Google 每天願意爬取你網站的頁面數量。

影響 Crawl Budget 的因素

因素 說明
網站規模 小網站通常有充足的爬取預算
網站健康度 大量錯誤會降低 Google 的爬取意願
內容新鮮度 頻繁更新的網站獲得更多爬取預算
網站速度 回應越快的網站,Google 爬取效率越高
反向連結 更多高品質反向連結 → 更多爬取

優化清單

1. 確保重要頁面載入速度快(< 2 秒)
2. 消除低品質頁面(thin content、自動生成頁面)
3. 用 robots.txt 阻止無效 URL 空間(搜尋結果、篩選組合)
4. 使用正確的 HTTP 狀態碼(不要 soft 404)
5. 減少重定向鏈
6. 確保 Sitemap 準確且即時更新
7. 透過內部連結引導 Googlebot 到重要內容
8. 合併分散在多個 URL 的內容

總結檢查清單

任務 說明
☐ 關閉 JS 後檢查頁面內容 確保主要內容在無 JS 環境中可見
/ meta description 是否伺服器端渲染</td> <td>不在 JS 中動態注入</td> </tr> <tr> <td>☐ Canonical 是否伺服器端輸出</td> <td>確保 Google 第一階段就能��取</td> </tr> <tr> <td>☐ 結構化資料是否伺服器端輸出</td> <td>JSON-LD 在 <code><head></code> 中預先存在</td> </tr> <tr> <td>☐ 內部連結是否在 HTML 中</td> <td>不是透過 JS onclick 事件跳轉</td> </tr> <tr> <td>☐ URL 使用 History API</td> <td>不使用 <code>#</code> hash 路由</td> </tr> <tr> <td>☐ 考慮 SSR / SSG</td> <td>評估是否適合改用 Next.js / Nuxt.js / SSG</td> </tr> <tr> <td>☐ 取得 Log 檔案並分析</td> <td>每年至少一次 Log 分析</td> </tr> <tr> <td>☐ 追蹤 Googlebot 爬取模式</td> <td>使用 Screaming Frog Log Analyser</td> </tr> <tr> <td>☐ 優化 Crawl Budget</td> <td>阻止無效 URL 空間,加速重要頁面回應</td> </tr> <tr> <td>☐ 定期檢查 GSC 爬取統計</td> <td>關注每日爬取頁面數和錯誤率</td> </tr> </tbody> </table> <p>| ← <a href="32-301-302轉址與HTTP狀態碼.md">第 32 章:301/302 轉址與 HTTP 狀態碼</a> | <a href="../索引.md">回索引</a> | <a href="34-技術SEO總覽與檢查清單.md">第 34 章:技術 SEO 總覽與檢查清單 →</a> |</p> </div> </div> </div></div></div></div></div></section><section class="wpb_row vc_row-fluid"><div class="container"><div class="row"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper " > <div class="wpb_text_column wpb_content_element" > <div class="wpb_wrapper"> <p>延伸閱讀:<a href="https://cyruschan.com/seo-manual/">網站 SEO 學習與操作手冊</a></p> </div> </div> </div></div></div></div></div></section> </div> </div> </div><!-- .entry-content --> </div> <div class="post-info"> <span class="post-user"><i class="fa fa-user"></i><a href="https://cyruschan.com/author/widercyruschan/" rel="author">widercyruschan</a></span> <span class="post-category"><i class="fa fa-folder"></i><a href="https://cyruschan.com/category/seo/" rel="category tag">網站 SEO</a></span> <span class="post-comment"><i class="fa fa-comment"></i><span class="comments_number">0 comments</span></span> <div class="share-holder"> <h4>Share:</h4> <div class="social-links rounded-share-icons"> <a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://cyruschan.com/seo-chapter-33/" title="Facebook"><i class="fa fa-facebook"></i></a> <a target="_blank" href="https://twitter.com/intent/tweet?text=第 33 章:JavaScript SEO 與 Log File 分析&url=https://cyruschan.com/seo-chapter-33/" title="Twitter"><i class="fa fa-twitter"></i></a> </div> </div> <div class="clearfix"></div> </div> </article> </div> <div class="post-controls clearfix"> <nav class="navigation post-navigation" aria-label="文章"> <h2 class="screen-reader-text">文章導覽</h2> <div class="nav-links"><div class="nav-previous"><a href="https://cyruschan.com/seo-chapter-32/" rel="prev"><span class="post-title"><em>Older Post</em><strong>第 32 章:301/302 轉址與 HTTP 狀態碼完整指南</strong></span></a></div><div class="nav-next"><a href="https://cyruschan.com/seo-chapter-34/" rel="next"><span class="post-title"><em>Newer Post</em><strong>第 34 章:技術 SEO 總覽與檢查清單</strong></span></a></div></div> </nav> </div> <div class='comments-box'><h4>0 comments<h4></div> <div class="leave-reply grey-section form"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title"><h4>Leave a reply</h4> <small><a rel="nofollow" id="cancel-comment-reply-link" href="/seo-chapter-33/#respond" style="display:none;">取消回覆</a></small></h3><p class="must-log-in">很抱歉,必須<a href="https://cyruschan.com/cyrus/?redirect_to=https%3A%2F%2Fcyruschan.com%2Fseo-chapter-33%2F">登入</a>網站才能發佈留言。</p> </div><!-- #respond --> </div><!-- //LEAVE A COMMENT --> </div> </div> </div> </div> <!-- END CONTENT BLOG --> <!-- footer begin --> <footer > <div class="main-footer"> <div class="container"> <div class="row"> <div class="col-md-4 col-sm-4"> <div id="custom_html-1" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><img src="https://cyruschan.com/wp-content/uploads/2026/07/white_logo-1.png" alt=""><br/><br/> 多年的網頁設計製作經驗,提供全面的跨平台宣傳推廣和網路行銷服務。致力於幫助客戶在數字時代取得成功。還提供全面的跨平台宣傳推廣和網路行銷服務。透過搜索引擎優化(SEO)、社交媒體行銷、內容創作等策略,幫助客戶增加品牌曝光度、提高網站流量和增加銷售機會。熟悉各種行業的市場趨勢,並根據客戶的目標制定個性化的行銷計劃。</div></div></div><!-- end col-lg-3 --> <div class="col-md-4 col-sm-4"> <div id="recent-posts-2" class="widget widget_recent_entries"> <h3>LATEST NEWS</h3> <ul> <li> <a href="https://cyruschan.com/seo-appendix-c/">附錄 C:SEO 學習資源推薦</a> </li> <li> <a href="https://cyruschan.com/seo-appendix-b/">附錄 B:SEO 專業術語中英對照表</a> </li> <li> <a href="https://cyruschan.com/seo-appendix-a/">附錄 A:SEO 常用工具清單</a> </li> <li> <a href="https://cyruschan.com/seo-chapter-86/">第 86 章:SEO 十大迷思破解</a> </li> <li> <a href="https://cyruschan.com/seo-chapter-85/">第 85 章:SEO 常見問題 FAQ 全集</a> </li> </ul> </div></div><!-- end col-lg-3 --> <div class="col-md-4 col-sm-4"> <div id="custom_html-2" class="widget_text widget widget_custom_html"><h3>Contact Us</h3><div class="textwidget custom-html-widget"><address> <span><strong>Email:</strong><a href="mailto:info@cyruschan.com">info@cyruschan.com</a></span> <span><strong>Web:</strong><a target="_blank" href="#">http://CyrusChan.com/</a></span> </address></div></div></div><!-- end col-lg-3 --> </div> </div> </div> <div class="subfooter "> <div class="container"> <div class="row"> <div class="col-md-6"> © Copyright 2023 - Power by <a href="https://www.cyruschan.com/">CyrusChan.com</a> </div> <div class="col-md-6 text-right"> <div class="social-icons"> <ul> <li><a target="_blank" href="https://www.facebook.com/"><i class="fa fa-facebook"></i></a></li> <li><a target="_blank" href="https://twitter.com/"><i class="fa fa-twitter"></i></a></li> <li><a target="_blank" href="https://plus.google.com"><i class="fa fa-google-plus"></i></a></li> <li><a target="_blank" href="#"><i class="fa fa-dribbble"></i></a></li> <li><a target="_blank" href="#"><i class="fa fa-rss"></i></a></li> </ul> </div> </div> </div> </div> </div> <a id="back-to-top" href="#" class="show"></a> </footer> </div><!-- #wrapper --> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/archi-child/*","/wp-content/themes/archi/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script type="text/javascript"> window.jQuery = window.$ = jQuery; (function($) { "use strict"; /* Enable/Disable Animate Scroll on Desktop and Mobile */ jQuery(document).ready(function() {'use strict'; new WOW().init(); }); })(jQuery); </script> <script type="text/html" id="wpb-modifications"> window.wpbCustomElement = 1; </script> <script type='text/javascript'> (function () { var c = document.body.className; c = c.replace(/woocommerce-no-js/, 'woocommerce-js'); document.body.className = c; })(); </script> <script id="wp-hooks-js" src="https://cyruschan.com/wp-includes/js/dist/hooks.min.js?ver=7496969728ca0f95732d"></script> <script id="wp-i18n-js" src="https://cyruschan.com/wp-includes/js/dist/i18n.min.js?ver=781d11515ad3d91786ec"></script> <script id="wp-i18n-js-after"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); //# sourceURL=wp-i18n-js-after </script> <script id="swv-js" src="https://cyruschan.com/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.1.6"></script> <script id="contact-form-7-js-translations"> ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2025-12-02 18:51:57+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=1; plural=0;","lang":"zh_TW"},"This contact form is placed in the wrong place.":["\u9019\u4efd\u806f\u7d61\u8868\u55ae\u653e\u5728\u932f\u8aa4\u7684\u4f4d\u7f6e\u3002"],"Error:":["\u932f\u8aa4:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); //# sourceURL=contact-form-7-js-translations </script> <script id="contact-form-7-js-before"> var wpcf7 = { "api": { "root": "https:\/\/cyruschan.com\/wp-json\/", "namespace": "contact-form-7\/v1" } }; //# sourceURL=contact-form-7-js-before </script> <script id="contact-form-7-js" src="https://cyruschan.com/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.1.6"></script> <script id="woocommerce-js-extra"> var woocommerce_params = {"ajax_url":"/wp-admin/admin-ajax.php","wc_ajax_url":"/?wc-ajax=%%endpoint%%","i18n_password_show":"\u986f\u793a\u5bc6\u78bc","i18n_password_hide":"\u96b1\u85cf\u5bc6\u78bc"}; //# sourceURL=woocommerce-js-extra </script> <script data-wp-strategy="defer" id="woocommerce-js" src="https://cyruschan.com/wp-content/plugins/woocommerce/assets/js/frontend/woocommerce.min.js?ver=11.0.1"></script> <script id="eztoc-scroll-scriptjs-js-extra"> var eztoc_smooth_local = {"scroll_offset":"30","add_request_uri":"","add_self_reference_link":""}; //# sourceURL=eztoc-scroll-scriptjs-js-extra </script> <script id="eztoc-scroll-scriptjs-js" src="https://cyruschan.com/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js?ver=2.0.85"></script> <script id="eztoc-js-cookie-js" src="https://cyruschan.com/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js?ver=2.2.1"></script> <script id="eztoc-jquery-sticky-kit-js" src="https://cyruschan.com/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js?ver=1.9.2"></script> <script id="eztoc-js-js-extra"> var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"\u003Cspan class=\"\"\u003E\u003Cspan class=\"eztoc-hide\" style=\"display:none;\"\u003EToggle\u003C/span\u003E\u003Cspan class=\"ez-toc-icon-toggle-span\"\u003E\u003Csvg style=\"fill: #999;color:#999\" xmlns=\"http://www.w3.org/2000/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"\u003E\u003Cpath d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003Csvg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"\u003E\u003Cpath d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"/\u003E\u003C/svg\u003E\u003C/span\u003E\u003C/span\u003E","chamomile_theme_is_on":""}; //# sourceURL=eztoc-js-js-extra </script> <script id="eztoc-js-js" src="https://cyruschan.com/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js?ver=2.0.85-1785394944"></script> <script id="hostinger-reach-subscription-block-view-js-extra"> var hostinger_reach_subscription_block_data = {"endpoint":"https://cyruschan.com/wp-json/hostinger-reach/v1/contact","nonce":"aaec75f41f","translations":{"thanks":"Thanks for subscribing.","error":"Something went wrong. Please try again."}}; //# sourceURL=hostinger-reach-subscription-block-view-js-extra </script> <script id="hostinger-reach-subscription-block-view-js" src="https://cyruschan.com/wp-content/plugins/hostinger-reach/frontend/dist/blocks/subscription-view.js?ver=1784726832"></script> <script async data-wp-strategy="async" fetchpriority="low" id="comment-reply-js" src="https://cyruschan.com/wp-includes/js/comment-reply.min.js?ver=7.0.4"></script> <script id="archi-wow-js-js" src="https://cyruschan.com/wp-content/themes/archi/js/wow.min.js?ver=7.0.4"></script> <script id="archi-total-js" src="https://cyruschan.com/wp-content/themes/archi/js/total1.js?ver=7.0.4"></script> <script id="archi-scripts-js" src="https://cyruschan.com/wp-content/themes/archi/js/designesia.js?ver=7.0.4"></script> <script id="sourcebuster-js-js" src="https://cyruschan.com/wp-content/plugins/woocommerce/assets/js/sourcebuster/sourcebuster.min.js?ver=11.0.1"></script> <script id="wc-order-attribution-js-extra"> var wc_order_attribution = {"params":{"lifetime":1.0e-5,"session":30,"base64":false,"ajaxurl":"https://cyruschan.com/wp-admin/admin-ajax.php","prefix":"wc_order_attribution_","allowTracking":true},"fields":{"source_type":"current.typ","referrer":"current_add.rf","utm_campaign":"current.cmp","utm_source":"current.src","utm_medium":"current.mdm","utm_content":"current.cnt","utm_id":"current.id","utm_term":"current.trm","utm_source_platform":"current.plt","utm_creative_format":"current.fmt","utm_marketing_tactic":"current.tct","session_entry":"current_add.ep","session_start_time":"current_add.fd","session_pages":"session.pgs","session_count":"udata.vst","user_agent":"udata.uag"}}; //# sourceURL=wc-order-attribution-js-extra </script> <script id="wc-order-attribution-js" src="https://cyruschan.com/wp-content/plugins/woocommerce/assets/js/frontend/order-attribution.min.js?ver=11.0.1"></script> <script id="googlesitekit-events-provider-contact-form-7-js" src="https://cyruschan.com/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-contact-form-7-0310812e6aa65ef3c958.js" defer></script> <script id="googlesitekit-events-provider-woocommerce-js-before"> window._googlesitekit.wcdata = window._googlesitekit.wcdata || {}; window._googlesitekit.wcdata.products = []; window._googlesitekit.wcdata.add_to_cart = null; window._googlesitekit.wcdata.currency = "USD"; window._googlesitekit.wcdata.eventsToTrack = ["add_to_cart","purchase"]; //# sourceURL=googlesitekit-events-provider-woocommerce-js-before </script> <script id="googlesitekit-events-provider-woocommerce-js" src="https://cyruschan.com/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-woocommerce-454120fdf8df4537b59f.js" defer></script> <script id="wpb_composer_front_js-js" src="https://cyruschan.com/wp-content/plugins/js_composer/assets/js/dist/js_composer_front.min.js?ver=8.7.3"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://cyruschan.com/wp-includes/js/wp-emoji-release.min.js?ver=7.0.4"}} </script> <script type="module"> /*! This file is auto-generated */ var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); //# sourceURL=https://cyruschan.com/wp-includes/js/wp-emoji-loader.min.js </script> <script></script></body> </html>