<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hugo on Wayne X.Y. Blog</title>
    <link>/tags/hugo/</link>
    <description>Recent content in Hugo on Wayne X.Y. Blog</description>
    <generator>Hugo</generator>
    <language>zh-TW</language>
    <lastBuildDate>Tue, 10 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/tags/hugo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>在 Hugo 部落格中加入互動式旅行地圖 (Leaflet &#43; JSON)</title>
      <link>/zh/2026/03/10/travel-map-leaflet-hugo/</link>
      <pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate>
      <guid>/zh/2026/03/10/travel-map-leaflet-hugo/</guid>
      <description>&lt;h1 id=&#34;在-hugo-部落格中加入互動式旅行地圖-leaflet--json&#34;&gt;在 Hugo 部落格中加入互動式旅行地圖 (Leaflet + JSON)&lt;/h1&gt;&#xA;&lt;p&gt;最近想在部落格的 Travel 頁面頂部加上一個可以標記去過哪些地方的互動式地圖，幾經思考後決定使用開源且輕量的 Leaflet.js，搭配自訂的 JSON 檔案來管理景點和顏色。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-實作目標&#34;&gt;🗺️ 實作目標&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在 &lt;a href=&#34;/life/travel/&#34;&gt;&lt;code&gt;/life/travel&lt;/code&gt;&lt;/a&gt; 的頂部固定一個地圖，顯示去過的國家與地點。&lt;/li&gt;&#xA;&lt;li&gt;透過 JSON 檔案集中管理景點資料 (包含中英文名稱、經緯度、以及專屬顏色)。&lt;/li&gt;&#xA;&lt;li&gt;使用 Leaflet.js 渲染地圖，並根據 JSON 自動計算邊界縮放 (&lt;code&gt;fitBounds&lt;/code&gt;) 以容納所有標記。&lt;/li&gt;&#xA;&lt;li&gt;將地圖封裝成 Hugo Shortcode &lt;code&gt;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&#34;&#xA;    integrity=&#34;sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=&#34; crossorigin=&#34;&#34; /&gt;&#xA;&lt;script src=&#34;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&#34;&#xA;    integrity=&#34;sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=&#34; crossorigin=&#34;&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;div id=&#34;travel-map&#34; style=&#34;height: 400px; width: 100%; border-radius: 8px; margin-bottom: 2rem; z-index: 1;&#34;&gt;&lt;/div&gt;&#xA;&#xA;&lt;script&gt;&#xA;    document.addEventListener(&#34;DOMContentLoaded&#34;, function () {&#xA;        &#xA;        delete L.Icon.Default.prototype._getIconUrl;&#xA;        L.Icon.Default.mergeOptions({&#xA;            iconRetinaUrl: &#39;https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png&#39;,&#xA;            iconUrl: &#39;https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png&#39;,&#xA;            shadowUrl: &#39;https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png&#39;,&#xA;        });&#xA;&#xA;        var travelData = [{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:25.033,&#34;lng&#34;:121.5654,&#34;name_en&#34;:&#34;Taipei (Taiwan)&#34;,&#34;name_zh&#34;:&#34;台北 (台灣)&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.5902,&#34;lng&#34;:130.4017,&#34;name_en&#34;:&#34;Fukuoka City&#34;,&#34;name_zh&#34;:&#34;福岡市&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.2662,&#34;lng&#34;:131.3537,&#34;name_en&#34;:&#34;Yufuin&#34;,&#34;name_zh&#34;:&#34;由布院&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.2794,&#34;lng&#34;:131.5015,&#34;name_en&#34;:&#34;Beppu&#34;,&#34;name_zh&#34;:&#34;別府&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.173,&#34;lng&#34;:131.226,&#34;name_en&#34;:&#34;Kokonoe&#34;,&#34;name_zh&#34;:&#34;九重&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.0805,&#34;lng&#34;:131.1441,&#34;name_en&#34;:&#34;Kurokawa Onsen&#34;,&#34;name_zh&#34;:&#34;黑川溫泉&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:32.8062,&#34;lng&#34;:130.7058,&#34;name_en&#34;:&#34;Kumamoto&#34;,&#34;name_zh&#34;:&#34;熊本&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.1654,&#34;lng&#34;:130.4137,&#34;name_en&#34;:&#34;Yanagawa&#34;,&#34;name_zh&#34;:&#34;柳川&#34;},{&#34;color&#34;:&#34;red&#34;,&#34;lat&#34;:33.5215,&#34;lng&#34;:130.5348,&#34;name_en&#34;:&#34;Dazaifu&#34;,&#34;name_zh&#34;:&#34;太宰府&#34;}];&#xA;    var lang = &#34;zh&#34;;&#xA;&#xA;    var map = L.map(&#39;travel-map&#39;, {&#xA;        scrollWheelZoom: true&#xA;    });&#xA;&#xA;    L.tileLayer(&#39;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#39;, {&#xA;        attribution: &#39;&amp;copy; &lt;a href=&#34;https://www.openstreetmap.org/copyright&#34;&gt;OpenStreetMap&lt;/a&gt; contributors&#39;&#xA;    }).addTo(map);&#xA;&#xA;    var bounds = [];&#xA;&#xA;    if (travelData &amp;&amp; travelData.length &gt; 0) {&#xA;        travelData.forEach(function (loc) {&#xA;            var name = lang === &#34;en&#34; ? loc.name_en : loc.name_zh;&#xA;            var markerOptions = {};&#xA;            if (loc.color) {&#xA;                markerOptions.icon = new L.Icon({&#xA;                    iconUrl: &#39;https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-&#39; + loc.color + &#39;.png&#39;,&#xA;                    shadowUrl: &#39;https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png&#39;,&#xA;                    iconSize: [25, 41],&#xA;                    iconAnchor: [12, 41],&#xA;                    popupAnchor: [1, -34],&#xA;                    shadowSize: [41, 41]&#xA;                });&#xA;            }&#xA;            var marker = L.marker([loc.lat, loc.lng], markerOptions).addTo(map)&#xA;                .bindPopup(&#34;&lt;b&gt;&#34; + name + &#34;&lt;/b&gt;&#34;);&#xA;            bounds.push([loc.lat, loc.lng]);&#xA;        });&#xA;        map.fitBounds(bounds, { padding: [50, 50] });&#xA;    } else {&#xA;        map.setView([23.6978, 120.9605], 5); &#xA;    }&#xA;});&#xA;&lt;/script&gt;&lt;/code&gt; 方便在不同語系頁面重複使用。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;-建立資料檔-data-layer&#34;&gt;💾 建立資料檔 (Data Layer)&lt;/h2&gt;&#xA;&lt;p&gt;首先，在 Hugo 專案的 &lt;code&gt;data/&lt;/code&gt; 目錄下建立一個 &lt;code&gt;travel.json&lt;/code&gt;，之後如果有新增旅程，只要修改這裡就可以，不用動到程式碼：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo 圖片管理比較：GitHub vs Cloudflare R2</title>
      <link>/zh/2026/02/03/storing-asset/</link>
      <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
      <guid>/zh/2026/02/03/storing-asset/</guid>
      <description>&lt;h1 id=&#34;hugo-圖片管理比較github-vs-cloudflare-r2&#34;&gt;Hugo 圖片管理比較：GitHub vs Cloudflare R2&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/zh/2026/02/01/setup-hugo-blog/&#34;&gt;在架設 Hugo 部落格後&lt;/a&gt;，也註冊了自己的網域，便開始開心的透過 &lt;code&gt;git push&lt;/code&gt; 更新網站。但稍微看了 repository 存放的內容，想想卻覺得圖片一起 push 好像怪怪的XD。之後如果持續更新維護，圖片勢必會增加，到時候會佔用太多空間。而且假如換個開發環境，在 pull 下來時，就要重新下載一堆圖片在 local。&lt;/p&gt;&#xA;&lt;p&gt;決定稍微研究一下，並比較原本 GitHub page 的做法，以及目前透過 Cloudflare R2 的做法。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;原存放在-static-資料夾與網站同步部署&#34;&gt;原：存放在 static/ 資料夾（與網站同步部署）&lt;/h2&gt;&#xA;&lt;p&gt;這是 Hugo 的傳統標準作法，圖片會隨著你的程式碼一起推送到 GitHub。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-運作原理&#34;&gt;1. 運作原理&lt;/h3&gt;&#xA;&lt;p&gt;Hugo 會將 &lt;code&gt;static/&lt;/code&gt; 資料夾內的所有內容，在編譯時原封不動地搬移到網站根目錄。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-實作方式&#34;&gt;2. 實作方式&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;檔案路徑&lt;/strong&gt;：將圖片放在 &lt;code&gt;/static/images/test.jpg&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Markdown 語法&lt;/strong&gt;：&#xA;&lt;code&gt;![圖片描述](/images/test.jpg)&lt;/code&gt; （路徑開頭的 &lt;code&gt;/&lt;/code&gt; 代表網站根目錄）。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-優缺點分析&#34;&gt;3. 優缺點分析&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;優點&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;離線寫作&lt;/strong&gt;：不需要網路就能預覽圖片，圖片與文章內容生命週期一致。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;版本控制&lt;/strong&gt;：圖片的異動也會紀錄在 Git 歷史中。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;儲存庫肥大&lt;/strong&gt;：隨著圖片增加，GitHub Repository 的體積會迅速增長，長期下來會影響效能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;現使用-cloudflare-r2&#34;&gt;現：使用 Cloudflare R2&lt;/h2&gt;&#xA;&lt;p&gt;為了避免 GitHub 儲存庫容量被圖片佔用太多，決定使用 Cloudflare R2，並且提供了 10GB 免費儲存空間，以目前來說非常足夠。&lt;/p&gt;&#xA;&lt;p&gt;⚠️ 注意：雖然說有免費額度，但還是需要先填寫付款資訊才能啟用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Hugo &#43; Cloudflare Pages 打造個人自動化部落格</title>
      <link>/zh/2026/02/01/setup-hugo-blog/</link>
      <pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate>
      <guid>/zh/2026/02/01/setup-hugo-blog/</guid>
      <description>&lt;h1 id=&#34;使用-hugo--cloudflare-pages-打造個人自動化部落格&#34;&gt;使用 Hugo + Cloudflare Pages 打造個人自動化部落格&lt;/h1&gt;&#xA;&lt;p&gt;想要建立一個速度極快、且每次寫完文章只要 &lt;code&gt;git push&lt;/code&gt; 就能自動更新的網站嗎？這篇文章將帶你利用 &lt;strong&gt;Hugo&lt;/strong&gt; 靜態網站產生器，搭配 &lt;strong&gt;Cloudflare Pages&lt;/strong&gt; 的自動化部署服務，建構個人部落格。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-為什麼選擇這個組合&#34;&gt;🛠 為什麼選擇這個組合？&lt;/h2&gt;&#xA;&lt;p&gt;原本使用 github page 進行架設，但由於 repo 必須公開，因此決定改用 cloudflare pages 連接 github repo，設定上也比想像中簡單，並且在 每次&lt;code&gt;git push&lt;/code&gt; 後會自動執行 gtihub actions 以及更新網站，確保網頁運作正常。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;第一步在本地端架設-hugo-站點&#34;&gt;第一步：在本地端架設 Hugo 站點&lt;/h2&gt;&#xA;&lt;p&gt;首先，我們要在你的電腦上建立網站的雛型，並挑選一個主題。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-安裝-hugo&#34;&gt;1. 安裝 Hugo&lt;/h3&gt;&#xA;&lt;p&gt;請根據你的作業系統執行安裝指令：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;macOS (Homebrew):&lt;/strong&gt; &lt;code&gt;brew install hugo&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Windows (PowerShell):&lt;/strong&gt; &lt;code&gt;winget install Hugo.Hugo.Extended&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;驗證安裝:&lt;/strong&gt; 開啟終端機輸入 &lt;code&gt;hugo version&lt;/code&gt;，確認看到版本號。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-建立新專案&#34;&gt;2. 建立新專案&lt;/h3&gt;&#xA;&lt;p&gt;開啟終端機，輸入以下指令建立網站資料夾：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site my-blog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; my-blog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-加入網站主題-theme&#34;&gt;3. 加入網站主題 (Theme)&lt;/h3&gt;&#xA;&lt;p&gt;前往 &lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;Hugo Themes&lt;/a&gt; 挑選主題。這裡以本站使用的 &lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;Clean White&lt;/a&gt; 為例：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
