<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>技述 — JS.GRIPE</title><link>https://www.js.gripe/zh-TW/</link><description>Independent development, curious experiments and open-source collaboration, with AI as a tool for exploration.</description><language>zh-TW</language><lastBuildDate>Fri, 30 Oct 2026 01:04:41 GMT</lastBuildDate><atom:link href="https://www.js.gripe/zh-TW/rss.xml" rel="self" type="application/rss+xml"/><item><title>一個防火牆入口，多個業務來源</title><link>https://www.js.gripe/zh-TW/2026/10/edgeaegis-multiple-origins/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/edgeaegis-multiple-origins/</guid><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-29T00:00:00.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>EdgeAegis 在請求流入業務前執行原生 OWASP CRS。內部業務函式、VPS 與負載平衡主機名稱統一寫入一份回源設定，不同信任邊界使用獨立金鑰。</description><category>edgeaegis</category><content:encoded>&lt;p&gt;EdgeAegis 在請求流入業務前執行原生 OWASP CRS。內部業務函式、VPS 與負載平衡主機名稱統一寫入一份回源設定，不同信任邊界使用獨立金鑰。&lt;/p&gt;
&lt;h2&gt;真實終端與 HTTP 回應&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/edgeaegis-routing.3d240e2bb6009766.gif&quot; alt=&quot;EdgeAegis VM terminal&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;隔離虛擬機錄影使用 curl 存取兩個業務函式與三個具身分驗證的 HTTPS 來源。SQL 注入收到 403，來源存取紀錄沒有增加；示範用的五秒暫時封鎖隨後到期恢復。五秒 TTL 僅供實驗，並非正式環境預設值。&lt;/p&gt;
&lt;h2&gt;規則與回源分開設定&lt;/h2&gt;
&lt;p&gt;rules/config.yml 選擇原生規則、策略與白名單；origin/config.yml 將公開主機名稱與路徑對應到業務；secret/credentials.yml 存放獨立回源金鑰，只保留在私有部署庫。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm exec --package=edgeaegis -- edgeaegis init my-firewall
cd my-firewall
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;routes:
  - pattern: api.example/shop/*
    origin: function:shop
  - pattern: api.example/orders/*
    origin: https://192.0.2.10
    key: orders-vps
  - pattern: api.example/search/*
    origin: https://lb.example
    key: search-lb
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;內部業務也經過安全檢查&lt;/h2&gt;
&lt;p&gt;設定 function:&amp;lt;業務名稱&amp;gt; 後載入 origin/&amp;lt;平台&amp;gt;/&amp;lt;業務&amp;gt;/index.js。統一入口先檢查請求，再呼叫業務，並檢查業務回應。外部來源必須驗證自己對應的金鑰。&lt;/p&gt;
&lt;h2&gt;說清楚驗證範圍&lt;/h2&gt;
&lt;p&gt;規則更新前必須完成完整 CRS 編譯與執行檢查，未知語意會明確報錯。平台資源限制仍然適用；升級後的 WebSocket 訊息不受 SecLang 內容檢查，單 Worker 計數也不是全網共用計數。&lt;/p&gt;
&lt;p&gt;歡迎 Vibe Coding 與 Agent 安全報告。上傳程式碼前先執行相關測試；敏感問題透過私密管道回報，附受影響版本、去識別化重現、影響與真實測試證據。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/edgeaegis/&quot; rel=&quot;noopener noreferrer&quot;&gt;認識 EdgeAegis&lt;/a&gt; · &lt;a href=&quot;https://github.com/jsw-teams/edgeaegis#readme&quot; rel=&quot;noopener noreferrer&quot;&gt;README&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>AMA-1 開發紀錄：從乾淨基線到兩輪未見題測試</title><link>https://www.js.gripe/zh-TW/2026/10/ama1-genesis-two-round-review/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/ama1-genesis-two-round-review/</guid><pubDate>Sat, 17 Oct 2026 18:11:40 GMT</pubDate><dc:date>2026-10-17T18:11:40.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>AGY 實作、Codex 審核，並在反覆修復不足後介入補丁。85 項回歸通過，但兩輪路由準確率只有 37.5% 與 33.3%，最終目標仍未達成。</description><category>ama</category><category>AMA</category><category>本地AI</category><category>從零訓練</category><category>獨立測試</category><content:encoded>&lt;p&gt;我想做一個能夠逐步認識世界、認識自身局限，並透過工具和經過核驗的資料持續成長的本地助理。AMA 系列沿著這個方向做實驗：從乾淨資料與隨機初始化開始，控制資源占用，也把失敗紀錄留下來。&lt;/p&gt;
&lt;p&gt;這次 AMA-1 Genesis 從 v0.1 小原型開始。AGY 負責實作，由 Codex 發起並審查開發過程；兩輪獨立測試後，部分修復仍只涵蓋已知路徑，Codex 再按我的授權介入對應檔案。目前交付的是可執行的基礎原型，完整目標尚未實現。&lt;/p&gt;
&lt;h2&gt;先把目標與現況分開&lt;/h2&gt;
&lt;p&gt;長期方向有六個：從零訓練、自我模型與穩定人格、世界與物品認知、經過核驗的持續學習、輕量化與工具優先，以及能抵抗虛假資訊和提示注入的連網能力。順序仍是自我模型、物品知識、工具、學習修正，再到自然聊天與多模態。&lt;/p&gt;
&lt;p&gt;目前實際訓練的神經元件只有 &lt;strong&gt;516 個參數&lt;/strong&gt;，是基於字元二元組的線性路由分類器。24 筆合成訓練資料用於區分自我、世界、搜尋和其他請求。它還不是語言模型；SQLite 裡的物品屬性也不等於視覺辨識。&lt;/p&gt;
&lt;p&gt;人格風格參考凱爾希的冷靜、理性與獨立，但 AMA-1 保持自己的身分。主觀意識是長期探索問題，功能性的狀態報告不能證明主觀體驗。&lt;/p&gt;
&lt;h2&gt;AGY 寫程式，Codex 查實際發生的事&lt;/h2&gt;
&lt;p&gt;開始時先凍結原始檔案清單，再保存乾淨 Git 基線。沒有移植舊專案程式、資料或權重。審核查看原始碼、真實執行輸出、模型來源與能力邊界，歷史報告不能直接當作本輪證據。&lt;/p&gt;
&lt;p&gt;最初 16 項測試全數通過，額外檢查卻找到無效檢查點被接受、重複知識修正後仍矛盾、危險網址過濾不足，以及 CAPTCHA 被記為搜尋成功等問題。AGY 隨後加入型別化物品紀錄、事件記憶、工具註冊表、候選模型清單和回復操作，並補上測試。&lt;/p&gt;
&lt;p&gt;新路徑也有缺口：重複定義會遺失物品身分；屬性介面繞過審核；只驗雜湊仍可能啟用無效模型；損壞備份能覆蓋有效模型；固定搜尋端點也可能經由重新導向連到私有網路。網路重現使用模擬傳輸，沒有真的請求私網目標。&lt;/p&gt;
&lt;h2&gt;兩輪題目如何隔離&lt;/h2&gt;
&lt;p&gt;兩套題都先凍結並記錄雜湊，實作方被明確禁止讀取。訓練檔保持原來 24 筆，沒有加入測試題或答案。審核方檢查原文、大小寫與 Unicode 正規化後的重疊，並查看可見工具呼叫紀錄。&lt;/p&gt;
&lt;p&gt;這是實作方不可見的獨立評估，&lt;strong&gt;不能稱為嚴格實驗雙盲&lt;/strong&gt;：沒有作業系統權限隔離，審核方也知道題目。分類任務使用相同意圖類別，不能因此宣稱語義完全獨立。&lt;/p&gt;
&lt;p&gt;第一輪結果用來指導修復後，題集便轉為回歸集。第二輪首次使用另一套未公開題目。兩輪之後的針對性修復，只算回歸驗證。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;路由評估&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;正確數&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;準確率&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;多數類基線&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;第一輪&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;9/24&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;37.5%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第二輪&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;8/24&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;33.3%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;兩輪的訓練多數類基線均為 25%。這是路由分類成績，不能當成物品認知或語言理解成績。表情輸入仍可能被分為搜尋請求，信心分數也未獨立校準。模型建議不能因此獲得工具權限。&lt;/p&gt;
&lt;h2&gt;修復通過後，仍要保留失敗&lt;/h2&gt;
&lt;p&gt;第二輪繼續發現異常訓練參數、非法樣本導致部分權重已修改、控制字元網址、字串布林授權、別名遮蔽和備份譜系缺口。AGY 處理路由器與 URL 校驗；Codex 另行提交知識審核、權限、屬性修正、交易與回復補丁。&lt;/p&gt;
&lt;p&gt;最終完整回歸是 &lt;strong&gt;85 項通過，0 失敗、0 錯誤、0 略過，結束碼 0&lt;/strong&gt;。另外實際啟動了 17 次 CLI 命令，走通候選屬性、明確審核、別名保留、修正、計算與預設拒絕連網。&lt;/p&gt;
&lt;p&gt;Codex 介入後的測試屬於補丁作者驗證，不再冒充獨立審核。兩輪失敗、逐題預測、誤報與修復紀錄都保留在儲存庫。訓練準確率雖達 100%，未見題結果仍顯示能力不足；實際檢查點保持候選，沒有啟用為正式模型。&lt;/p&gt;
&lt;h2&gt;資源與連網，按測量範圍說話&lt;/h2&gt;
&lt;p&gt;獨立訓練程序觀測峰值約 17.72 MiB RSS，另一 CLI 程序樣本約 25.34 MiB。兩者是不同程序的單次樣本。物件卸載後 RSS 沒有下降，不能說記憶體已歸還作業系統。&lt;/p&gt;
&lt;p&gt;6GB 顯示記憶體仍是適配目標。CUDA 配置、保留、全域 GPU 占用與未來感知模型需求均未測。&lt;/p&gt;
&lt;p&gt;預設拒絕連網，明確同意後才能傳送查詢。結果只是候選連結，不自動入庫、不擷取下游頁面、不繞過 CAPTCHA。真實搜尋提供者成功本輪未驗證；跨來源核驗、所有權分群和完整 GEO 防禦仍待實現。&lt;/p&gt;
&lt;h2&gt;這一版留下了什麼&lt;/h2&gt;
&lt;p&gt;原始碼與審核快照已上傳到 &lt;a href=&quot;https://github.com/jsw-teams/train&quot; rel=&quot;noopener noreferrer&quot;&gt;jsw-teams/train&lt;/a&gt;。上傳採原遠端歷史的後繼提交，覆蓋目前檔案樹並保留舊提交。公開證據遮蔽本機路徑，完整原始執行日誌留在本地。資料、模型與凍結題集按精確位元組保存，避免換行轉換破壞雜湊。&lt;/p&gt;
&lt;p&gt;後續需要來源與授權可核查的代表性資料，以及新的隔離評估集。完整持續學習閉環、從零語言模型、自然聊天、照片辨識和語音都還沒完成。已公開或回饋過的題目，不能再作下一版的新盲測。&lt;/p&gt;
&lt;p&gt;可繼續看 &lt;a href=&quot;https://www.js.gripe/zh-TW/ama/&quot; rel=&quot;noopener noreferrer&quot;&gt;AMA 系列模型頁面&lt;/a&gt;、&lt;a href=&quot;https://github.com/jsw-teams/train/blob/48c1bb4c5bb1ba708d91892ad9ad2745c8d41c19/CODEX_REVIEW.md&quot; rel=&quot;noopener noreferrer&quot;&gt;本次審核報告&lt;/a&gt;、&lt;a href=&quot;https://github.com/jsw-teams/train/blob/48c1bb4c5bb1ba708d91892ad9ad2745c8d41c19/TEST_RESULTS.json&quot; rel=&quot;noopener noreferrer&quot;&gt;實際測試紀錄&lt;/a&gt; 與 &lt;a href=&quot;https://github.com/jsw-teams/train/blob/48c1bb4c5bb1ba708d91892ad9ad2745c8d41c19/data/MANIFEST.json&quot; rel=&quot;noopener noreferrer&quot;&gt;訓練資料清單&lt;/a&gt;。最終目標發布繼續保持阻塞。&lt;/p&gt;
</content:encoded></item><item><title>寫文建站主題二次開發：從共享版面到實際元素</title><link>https://www.js.gripe/zh-TW/2026/10/edgepress-theme-development/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/edgepress-theme-development/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T00:00:00.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>建立本地主題，修改 HTML 局部模板與樣式，保留既有服務和檢視器機制。</description><category>edgepress</category><category>EdgePress</category><category>使用筆記</category><content:encoded>&lt;p&gt;佈景主題改變網站的呈現，文章和頁面檔案繼續保存內容。先做一個本地主題，把共享版面搭好，再用同一份內容檢查寬螢幕和窄螢幕。&lt;/p&gt;
&lt;h2&gt;建立並選擇主題&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npx edgepress theme list
npx edgepress theme create my-theme
npx edgepress theme use my-theme
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;theme create&lt;/code&gt; 複製預設版面骨架，並為你建立空白的 &lt;code&gt;assets/style.css&lt;/code&gt;，視覺設計需要自己補齊。既有主題用 &lt;code&gt;theme use&lt;/code&gt; 切換，已發布的主題套件可以用 &lt;code&gt;npx edgepress theme install &amp;lt;package&amp;gt;&lt;/code&gt; 安裝。站點在 &lt;code&gt;config.yml&lt;/code&gt; 根層設定了 &lt;code&gt;theme:&lt;/code&gt; 時，以它選擇主題；較早的專案也可以使用建置設定的 &lt;code&gt;paths.theme&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;themes/my-theme/
  theme.json
  layouts/layout.html
  layouts/partials/head.html
  layouts/partials/header.html
  layouts/partials/footer.html
  assets/style.css
  assets/data-saver-theme.css
  package.json
  README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;先做共享版面&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;html lang=&quot;{{site.language}}&quot;&amp;gt;
&amp;lt;head&amp;gt;{{&amp;gt; head}}&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;a class=&quot;skip-link&quot; href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-theme-development/#main&quot;&amp;gt;{{site.skipToContent}}&amp;lt;/a&amp;gt;
  {{&amp;gt; header}}
  &amp;lt;main id=&quot;main&quot;&amp;gt;{{{page.content}}}&amp;lt;/main&amp;gt;
  {{&amp;gt; footer}}
  &amp;lt;script defer src=&quot;https://www.js.gripe/edgepress/language-select.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模板使用 HTML 和局部模板。&lt;code&gt;{{page.title}}&lt;/code&gt; 等一般佔位符會跳脫，&lt;code&gt;{{{page.content}}}&lt;/code&gt; 插入框架已經渲染的內容。保留 head 局部模板、同意管理、語言導覽和框架的本地執行程式碼，主題不需要複製這些瀏覽器實作。&lt;/p&gt;
&lt;p&gt;保留跳轉連結、唯一 main、可見鍵盤焦點和一個頁面級 H1。body 佔滿視窗高度，main 可以增長，短頁面的頁尾才能落在底部。長標題、文章、專案清單、空狀態和本地化 404 都要看一遍。&lt;/p&gt;
&lt;h2&gt;給實際元素寫樣式&lt;/h2&gt;
&lt;p&gt;顏色、字型、間距和響應式規則放在 &lt;code&gt;assets/style.css&lt;/code&gt;。內建字型變數是 &lt;code&gt;--edgepress-font-sans&lt;/code&gt;、&lt;code&gt;--edgepress-font-serif&lt;/code&gt;、&lt;code&gt;--edgepress-font-mono&lt;/code&gt;，字型資源在本地。除了文章正文，也要照顧頁面的列與儲存格、導覽、表格、程式碼、示範播放進度條和提示。不要用只能適應桌面的固定寬度。&lt;/p&gt;
&lt;p&gt;文章和頁面的圖片放在 &lt;code&gt;content/assets/&lt;/code&gt;，主題自有裝飾才放主題資源目錄。本地 CSS、JavaScript 和它們的依賴在建置時產生內容雜湊；雜湊資源快取一年，HTML 與未版本化中繼資料保持可重新驗證。&lt;/p&gt;
&lt;h2&gt;擴充互動與服務&lt;/h2&gt;
&lt;p&gt;小型本地互動可以寫在主題的 &lt;code&gt;assets/&lt;/code&gt;。建置外掛放在 &lt;code&gt;edgepress.config.mjs&lt;/code&gt; 指定的路徑裡，建置時作為受信任的 Node 程式碼執行。可選外部服務登記到 &lt;code&gt;config.yml&lt;/code&gt; 的扁平 &lt;code&gt;plugins.consent.services&lt;/code&gt; 清單，填好名稱、用途與資料揭露，取得目前服務同意後才請求。留言交給我提問，主題不再做一套留言系統。&lt;/p&gt;
&lt;p&gt;圖片、媒體圖庫和文件元素使用既有可重用檢視器。調整顏色時保留焦點、授權與延遲載入，不必複製播放器或文件引擎。&lt;/p&gt;
&lt;h2&gt;用實際內容檢查&lt;/h2&gt;
&lt;p&gt;執行 &lt;code&gt;npm run build&lt;/code&gt;、&lt;code&gt;npm run check&lt;/code&gt;，再看淺色與深色、鍵盤導覽、翻譯後的選單和手機版面。至少開啟一篇含程式碼與表格的文章、一個雙欄頁面、一段帶進度條的示範和一個文件預覽。建置通過說明結構有效，頁面是否好讀還需要實際查看。&lt;/p&gt;
&lt;p&gt;輕量文字版是主題的可選能力。新增時既要看版面，也要看實際請求：&lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-data-saving/&quot; rel=&quot;noopener noreferrer&quot;&gt;省流設定&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;寫作與 Pages&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-TW/theme-development/&quot; rel=&quot;noopener noreferrer&quot;&gt;主題元素參考&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>寫文建站可選省流設定：站點開關、主題資源與讀者選擇</title><link>https://www.js.gripe/zh-TW/2026/10/edgepress-data-saving/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/edgepress-data-saving/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T14:32:28.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>依實際欄位啟用文字版，說明主題資源、逐項服務同意和慢速載入驗證。</description><category>edgepress</category><category>EdgePress</category><category>使用筆記</category><content:encoded>&lt;p&gt;完整頁面載入太慢，或者讀者想省一點流量時，可以選擇文字版。它是可選功能，主題先提供可讀的輕量樣式，站點再開啟。預設仍顯示完整版，由讀者決定是否切換。&lt;/p&gt;
&lt;h2&gt;在站點設定裡開啟&lt;/h2&gt;
&lt;p&gt;把下面設定合併到 &lt;code&gt;config.yml&lt;/code&gt; 既有的 &lt;code&gt;site&lt;/code&gt; 裡，不要再新增一個同名根節點：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;site:
  dataSaver:
    enabled: true
    debug: false
    mode: auto
    detectSlowConnection: true
    respectBrowserPreference: false
    promptAfterMs: 5000
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;欄位&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;開啟等待與文字版流程，預設 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mode: auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;從完整版開始，讀者已有明確選擇時沿用其選擇。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detectSlowConnection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;首屏仍在等待資源時提供文字版入口，不依網路速度標籤自動切換。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;promptAfterMs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;延遲提示門檻，5000 表示五秒；有效範圍 100–60000。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;respectBrowserPreference: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不讓瀏覽器省流提示替讀者決定初始模式。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;debug: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;正式站點關閉空值 &lt;code&gt;?data-save&lt;/code&gt; 預覽入口。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;已儲存的讀者選擇優先於站點的自動起始模式。&lt;code&gt;mode: text&lt;/code&gt;、&lt;code&gt;mode: full&lt;/code&gt; 可以改變設定的起始偏好，上面的流程不需要它們。&lt;/p&gt;
&lt;h2&gt;由主題定義輕量呈現&lt;/h2&gt;
&lt;p&gt;在目前主題的 &lt;code&gt;theme.json&lt;/code&gt; 裡合併 &lt;code&gt;dataSaver&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;name&quot;: &quot;my-theme&quot;,
  &quot;renderer&quot;: &quot;layouts/layout.html&quot;,
  &quot;templateEngine&quot;: &quot;edgepress-partials-v1&quot;,
  &quot;dataSaver&quot;: {
    &quot;stylesheet&quot;: &quot;data-saver-theme.css&quot;,
    &quot;scripts&quot;: [],
    &quot;layoutStyles&quot;: [&quot;style.css&quot;]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;樣式表和指令碼路徑相對於主題的 &lt;code&gt;assets/&lt;/code&gt;。&lt;code&gt;layoutStyles&lt;/code&gt; 列出共享已發布 CSS，建置時去掉字型宣告和含 URL 的宣告，保留導覽、列、卡片和頁尾的實際版面；輕量樣式再補充字型和顏色。標題、文章摘要、時間、說明文字和鍵盤焦點都要能用。&lt;/p&gt;
&lt;p&gt;文字版使用系統字型，暫緩圖片、示範影片、文件引擎與可選服務元件。讀者可以單獨載入需要的媒體，也可以返回完整版。圖表和截圖仍需有用的文字說明，省流不能把理解文章所需的資訊一起省掉。&lt;/p&gt;
&lt;h2&gt;服務同意與載入分開&lt;/h2&gt;
&lt;p&gt;同意服務不等於下載全部元件。服務請求仍然需要目前逐項同意，以及載入該元件的實際需求；遠端文件還要允許 CORS。保留扁平服務清單和每項資料揭露，不使用分類總開關。&lt;/p&gt;
&lt;p&gt;主題動態媒體需要在賦值 URL 之前呼叫 &lt;code&gt;window.edgepressDataSaver?.deferMedia(element, activate, description)&lt;/code&gt;，由 &lt;code&gt;activate&lt;/code&gt; 在實際請求時賦值；省流能力關閉時也要有正常載入的後備分支。完整版的非必要指令碼加上 &lt;code&gt;data-data-optional&lt;/code&gt;。先給圖片設定 &lt;code&gt;src&lt;/code&gt; 再隱藏，已經來不及避免請求。&lt;/p&gt;
&lt;h2&gt;檢查等待畫面與跳轉&lt;/h2&gt;
&lt;p&gt;把實際資源傳輸限制到約 100 KB/s，開啟新頁面，在完整版樣式和媒體尚未載入完時切換文字版。檢查等待畫面的控制項能否用鍵盤操作，進度是否來自已完成資源，晚到的資源是否保持讀者選擇，文章跳轉後是否沿用選擇。查看字型、圖片、影片與元件的請求紀錄，僅看元素隱藏無法證明省了流量。&lt;/p&gt;
&lt;p&gt;也要檢查返回完整版、手機頁尾邊界和停用 JavaScript 的頁面。&lt;code&gt;debug: true&lt;/code&gt; 允許空值 &lt;code&gt;?data-save&lt;/code&gt; 測試入口；關閉時會跳轉到目前語言的靜態 404 頁面。這種瀏覽器跳轉不能證明託管平台回傳了 HTTP 404。測試後保持 debug 為 false。&lt;/p&gt;
&lt;p&gt;各站的命令入口放在自己的 &lt;code&gt;tools/&lt;/code&gt;，回歸測試放在 &lt;code&gt;tests/&lt;/code&gt;。本站可執行 &lt;code&gt;npm run test:data-saver&lt;/code&gt; 和 &lt;code&gt;npm run verify:performance&lt;/code&gt;；後者使用冷快取、gzip、100 KB/s 和 150 ms 延遲，分別記錄首次內容繪製與正文可讀時間。通用實作由固定版本的寫文建站相依套件提供，佈景主題開發者可以按&lt;a href=&quot;https://github.com/jsw-teams/edgepress/blob/main/tools/verification/README.md&quot; rel=&quot;noopener noreferrer&quot;&gt;公開工具說明&lt;/a&gt;設定自己的頁面路徑與語言，不需要取得本站原始碼。驗證使用本機匿名模擬回應，不代表線上服務或發布帳號已經檢查。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;寫作與 Pages&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-theme-development/&quot; rel=&quot;noopener noreferrer&quot;&gt;佈景主題二次開發&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>在寫文建站頁面裡閱讀文件</title><link>https://www.js.gripe/zh-TW/2026/10/doc-views-inline-reading/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/doc-views-inline-reading/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T00:00:00.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>加入本機文件，保留閱讀控制項，並檢查完整版與文字版的實際呈現。</description><category>doc-views</category><content:encoded>&lt;p&gt;文件檢視器讓讀者在文章或頁面裡閱讀 Word、PDF、PowerPoint 和 Excel。我把原始文件放進 &lt;code&gt;content/assets/documents/&lt;/code&gt;，再引用它的站內路徑。預覽在原處展開，不移動鍵盤焦點；標題由文件元素顯示一次。&lt;/p&gt;
&lt;p&gt;文章在 Markdown 內文裡單獨放一行。下面的路徑需要換成你已經加入的檔案：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;!document[專案報告](/documents/project-report.pdf)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JSON 頁面則把文件元素放進某個儲存格的元素陣列：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;type&quot;: &quot;document&quot;,
  &quot;title&quot;: &quot;專案報告&quot;,
  &quot;src&quot;: &quot;/documents/project-report.pdf&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽用連續閱讀區域展示分開的頁面，試算表保留工作表切換。周圍控制項跟隨網站配色，文件內容保留自身顏色。不同格式的解析成本不同，我會檢查實際樣本，不把所有檔案都當成能持續串流讀取、保持固定記憶體的內容。&lt;/p&gt;
&lt;p&gt;文字版暫緩載入檢視器，讀者需要時再請求。遠端檔案直連需要目前有效的服務同意，來源還須允許 CORS；同意服務不會自動下載全部文件或元件。建置後在本機檢查捲動、鍵盤焦點、手機寬度，以及完整版與文字版之間的切換。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/doc-views/&quot; rel=&quot;noopener noreferrer&quot;&gt;文件檢視器與範例&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;JSON Pages&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>網站收錄與審核說明</title><link>https://www.js.gripe/zh-TW/2026/10/website-submissions-review/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/website-submissions-review/</guid><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-09T11:16:45.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>了解 JS.GRIPE 友鏈目錄的收錄原則，並透過本文下方留言區推薦個人網站、部落格或獨立專案。</description><category>site-notice</category><category>友鏈</category><category>網站收錄</category><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/links/&quot; rel=&quot;noopener noreferrer&quot;&gt;友鏈目錄&lt;/a&gt; 想收集一些值得慢慢閱讀的網站：個人首頁、認真寫作的部落格、獨立專案，以及其他有自己想法的小站。這裡不是流量排行榜，也不是付費宣傳或自動交換連結的地方。不論技術、科學、藝術或日常記錄，都歡迎推薦。&lt;/p&gt;
&lt;h2&gt;在文章下方留言區提交&lt;/h2&gt;
&lt;p&gt;請直接&lt;strong&gt;在本文下方留言區留言&lt;/strong&gt;，盡量提供以下資訊：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;網站名稱&lt;/strong&gt;：希望顯示在目錄中的名稱。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;網站網址&lt;/strong&gt;：以 &lt;code&gt;https://&lt;/code&gt; 或 &lt;code&gt;http://&lt;/code&gt; 開頭、可公開瀏覽的連結。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;簡短介紹&lt;/strong&gt;：用一兩句話說明網站主要分享什麼。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;圖示資訊（可選）&lt;/strong&gt;：若希望使用圖示，請說明是否擁有著作權或使用授權。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;留言區由 &lt;strong&gt;我提問（iask）&lt;/strong&gt; 提供。請先在隱私設定中同意載入留言服務，再依提示使用 GitHub 登入。&lt;strong&gt;留言是公開的&lt;/strong&gt;，請勿留下私人聯絡方式、密碼或其他敏感資料。若留言服務暫時無法使用，也可以透過&lt;a href=&quot;https://www.js.gripe/zh-TW/contact/&quot; rel=&quot;noopener noreferrer&quot;&gt;聯絡頁面&lt;/a&gt;提交。&lt;/p&gt;
&lt;p&gt;你可以推薦自己的網站，也可以分享真正喜歡的站點。不過，推薦別人的網站不代表你有權授權使用對方的圖示。&lt;/p&gt;
&lt;h2&gt;審核原則&lt;/h2&gt;
&lt;p&gt;所有投稿均由我人工查看。我更重視內容是否真實、有持續探索的價值或鮮明的個人特色，而不是流量、主題領域或技術組合。&lt;strong&gt;不要求加入本站的反向連結&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;垃圾廣告、冒充他人的站點、惡意下載、誘導跳轉，以及其他不適合目錄展示的內容，可能不予收錄或遭到移除。&lt;strong&gt;提交不保證收錄&lt;/strong&gt;，也不承諾固定審核或回覆時間。&lt;/p&gt;
&lt;p&gt;通過審核的條目會作為靜態頁面內容維護。如需圖示，只會在確認使用權後儲存在本站，不會讓訪客瀏覽目錄時自動向投稿網站請求圖示。&lt;/p&gt;
&lt;h2&gt;資訊更正與移除&lt;/h2&gt;
&lt;p&gt;如果已收錄的網站更名、轉向不合適的頁面，或者你希望更正、移除條目，請透過&lt;a href=&quot;https://www.js.gripe/zh-TW/contact/&quot; rel=&quot;noopener noreferrer&quot;&gt;聯絡頁面&lt;/a&gt;告知；也可以在下方補充留言，但請勿公開敏感資訊。&lt;/p&gt;
&lt;p&gt;外部網站有各自的隱私規則。普通點擊外部連結前，本站會先顯示目標站點提示。&lt;/p&gt;
&lt;p&gt;歡迎分享你認為值得一看的網路角落。&lt;/p&gt;
</content:encoded></item><item><title>按自己的節奏看影片，看清圖片細節</title><link>https://www.js.gripe/zh-TW/2026/10/media-viewer-play-and-inspect/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/media-viewer-play-and-inspect/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-30T01:04:41.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>進度條獨立一行，目前時間與總時長放在一起。拖曳跳到實際播放位置。示範會停留顯示跳轉後的時間，以及已選中的 2 倍速，讓播放變化看得清楚。</description><category>media-viewer</category><content:encoded>&lt;p&gt;進度條獨立一行，目前時間與總時長放在一起。拖曳跳到實際播放位置。示範會停留顯示跳轉後的時間，以及已選中的 2 倍速，讓播放變化看得清楚。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/media-videojs10.da5382978c5b7462.gif&quot; alt=&quot;按自己的節奏看影片，看清圖片細節&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;需要細節時，再開啟原圖&lt;/h2&gt;
&lt;p&gt;卡片和貼文先請求最佳化預覽，點擊詳情圖後才開啟完整原圖。可以放大、拖曳查看，關閉叉號位於圖片之外，返回後焦點回到原來的圖片。&lt;/p&gt;
&lt;h2&gt;元件負責互動，網站負責內容&lt;/h2&gt;
&lt;p&gt;Video.js 10 HTML 元件與 hls.js 本機打包，畫廊只掛載選中的附件，切換時釋放之前的播放。接入網站提供資源網址、同意設定與主題配色，元件本身不負責發表或儲存。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/media-viewer/&quot; rel=&quot;noopener noreferrer&quot;&gt;專案與說明&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>圖片和影片放在一起：發表故事，再分享給別人</title><link>https://www.js.gripe/zh-TW/2026/10/ishare-publish-and-share/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/ishare-publish-and-share/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T14:11:57.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>先寫故事，在下方加入照片與影片，再發表同一篇貼文。置中的進度視窗分別顯示實際傳輸量、附件處理和貼文發布；發表成功後，直接查看貼文、分享或進入個人主頁。</description><category>ishare</category><content:encoded>&lt;p&gt;先寫故事，在下方加入照片與影片，再發表同一篇貼文。置中的進度視窗分別顯示實際傳輸量、附件處理和貼文發布；發表成功後，直接查看貼文、分享或進入個人主頁。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/ishare-workflow-zh.50679b78cbd481f1.gif&quot; alt=&quot;圖片和影片放在一起：發表故事，再分享給別人&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;分享完整故事，也能分開插入附件&lt;/h2&gt;
&lt;p&gt;「連結」提供公開貼文網址；「嵌入程式碼」包含配文、作者與附件畫廊，支援 oEmbed 的網站也能從分享連結發現完整嵌入。「Markdown」則提供逐張圖片的連結，以及影片播放頁連結。寫文建站先註冊對應服務，訪客同意後，可見的嵌入會自動載入。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/ishare-sharing-zh.b321f3274981714e.gif&quot; alt=&quot;把貼文連結貼進文章，在網站裡查看嵌入畫廊&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;放進寫文建站的文章&lt;/h2&gt;
&lt;p&gt;在 config.yml 原有服務清單中追加愛分享項目。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;plugins:
  consent:
    services:
      - id: ishare
        provider: oembed
        enabled: true
        name: 愛分享
        backendUrl: https://ishare.js.gripe
        purpose: 在你同意後顯示作者分享的照片與影片。
        dataCategories: 請求的媒體與 IP 位址。
        recipient: ishare
        retention: 直到發佈者刪除貼文。
        privacyUrl: https://ishare.js.gripe/privacy/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文章正文寫入嵌入語法，將範例 URL 換成自己複製的貼文連結。儲存後執行 edgepress server，從首頁點擊進入文章；訪客同意愛分享後，就能一起看到配文與附件畫廊。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;!embed[ishare](https://ishare.js.gripe/s/0726bea158a144129dd3b70468f1a0fc)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pages 的 text 區塊使用相同的 &lt;code&gt;!embed[ishare](URL)&lt;/code&gt; 語法。未授權時保留主題佔位區；授權後在接近視口時載入。&lt;/p&gt;
&lt;h2&gt;歷史放在個人主頁&lt;/h2&gt;
&lt;p&gt;從頭像選單進入「我的主頁」。訪客看到已發表的貼文，只有本人能看到刪除按鈕和是否展示在平台首頁的開關。個人中心另行處理顯示名稱、自我介紹與資料權利。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/ishare/&quot; rel=&quot;noopener noreferrer&quot;&gt;專案與說明&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>用寫文建站寫文章、編排 Pages</title><link>https://www.js.gripe/zh-TW/2026/10/edgepress-content-and-project-guides/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/edgepress-content-and-project-guides/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T15:08:30.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>從目前指令和檔案結構開始，寫文章、讀懂頁面包含關係，再產生靜態網站。</description><category>edgepress</category><category>EdgePress</category><category>使用筆記</category><content:encoded>&lt;p&gt;我用寫文建站把寫作和版式留在一般檔案裡。文章寫 Markdown，首頁和專案頁寫 JSON 版面，建置後得到 &lt;code&gt;dist/&lt;/code&gt; 裡的靜態 HTML 與本地資源。日常發一篇文章，不需要為網站維護資料庫。&lt;/p&gt;
&lt;h2&gt;先讓專案執行起來&lt;/h2&gt;
&lt;p&gt;使用目前原始碼儲存庫時，準備 Node.js 22.12 或更新版本，在專案根目錄執行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm ci
npm run new -- post &quot;A quiet afternoon&quot;
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新增指令會印出產生的檔案路徑。用編輯器開啟它，保留兩道 &lt;code&gt;---&lt;/code&gt; 之間的中繼資料，在第二道分隔線後寫正文。預覽會在儲存原始檔後重新建置；建立文章時用一次指令，之後就在編輯器裡修改。&lt;/p&gt;
&lt;p&gt;若要開始一個新站，使用本站固定的已發布 GitHub 原始碼版本，在空目錄裡初始化：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;mkdir my-site
cd my-site
npm install edgepress@https://codeload.github.com/jsw-teams/edgepress/tar.gz/ac42e0046d022a318e4eef21e56e2e459584b2a5 --save-exact
npx edgepress init
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;npm 發布版本可能與 GitHub 最新原始碼不同。站點的依賴版本和鎖定檔應一起保留；已經透過依賴使用寫文建站的網站，繼續用自己的 npm 指令碼，不必再全域安裝一份。&lt;/p&gt;
&lt;h2&gt;分清要改哪個檔案&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;config.yml                    (site, theme, privacy, consent services)
edgepress.config.mjs           (paths, locales, permalink, build plugins)
content/posts/&amp;lt;post-id&amp;gt;/en.md   (article metadata + Markdown)
content/pages/&amp;lt;page-id&amp;gt;/en.json   (page metadata + rows and elements)
content/assets/images/walk.jpg (published as /images/walk.jpg)
themes/&amp;lt;name&amp;gt;/                 (shared layouts and visual styles)
dist/                         (generated output)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;站名、標準網址、導覽、頁尾和隱私資訊放在 &lt;code&gt;config.yml&lt;/code&gt;；建置路徑、啟用語言與文章路徑格式放在 &lt;code&gt;edgepress.config.mjs&lt;/code&gt;。語言檔名用小寫：頁面用 &lt;code&gt;en.json&lt;/code&gt;、&lt;code&gt;zh-cn.json&lt;/code&gt;，文章用 &lt;code&gt;en.md&lt;/code&gt;、&lt;code&gt;zh-cn.md&lt;/code&gt;，&lt;code&gt;lang&lt;/code&gt; 要符合已啟用的語言。每篇文章或每個頁面有自己的目錄，譯文放在同一個目錄裡。&lt;/p&gt;
&lt;h2&gt;寫一篇文章&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: A quiet afternoon
date: 2026-10-11T10:00:00+08:00
lang: en
category: blog
tags: [walk, photography]
---

We stopped by the water.

## A small detail

![Reflections by the shore](/images/walk.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指令會填入目前時間和站點語言，上面只是檔案結構範例。佈景主題已經顯示文章標題，正文從段落開始，章節用 &lt;code&gt;##&lt;/code&gt;，不用再放一個同名一級標題。照片先儲存到 &lt;code&gt;content/assets/images/walk.jpg&lt;/code&gt;，再用 &lt;code&gt;/images/walk.jpg&lt;/code&gt; 引用。&lt;/p&gt;
&lt;p&gt;一個 &lt;code&gt;category&lt;/code&gt; 決定文章歸屬。本站的 &lt;code&gt;blog&lt;/code&gt;、&lt;code&gt;uncategorized&lt;/code&gt; 進入見聞觀點，&lt;code&gt;edgepress&lt;/code&gt;、&lt;code&gt;ishare&lt;/code&gt;、&lt;code&gt;iask&lt;/code&gt;、&lt;code&gt;media-viewer&lt;/code&gt; 進入產品筆記。&lt;code&gt;tags&lt;/code&gt; 用來描述文章，不決定首頁清單。&lt;/p&gt;
&lt;h2&gt;從外往裡看一個頁面&lt;/h2&gt;
&lt;p&gt;頁面（列清單）→ 列（欄數，儲存格清單）→ 儲存格（依序排列的元素）→ 元素（類型，內容）。下面是一份完整的雙欄頁面：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;title&quot;: &quot;Project notes&quot;,
  &quot;lang&quot;: &quot;en&quot;,
  &quot;slug&quot;: &quot;notes&quot;,
  &quot;blocks&quot;: [
    {
      &quot;columns&quot;: 2,
      &quot;cells&quot;: [
        [
          {
            &quot;type&quot;: &quot;heading&quot;,
            &quot;level&quot;: 2,
            &quot;text&quot;: &quot;What I am making&quot;
          },
          {
            &quot;type&quot;: &quot;text&quot;,
            &quot;text&quot;: &quot;A small tool for everyday writing.&quot;
          }
        ],
        [
          {
            &quot;type&quot;: &quot;post-list&quot;,
            &quot;title&quot;: &quot;Notes&quot;,
            &quot;category&quot;: &quot;edgepress&quot;,
            &quot;count&quot;: 3
          }
        ]
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;儲存為 &lt;code&gt;content/pages/notes/en.json&lt;/code&gt;。中繼資料與 blocks 同在一個 JSON 物件裡，不加 YAML 分隔線，也不寫 Markdown 內文。VS Code 能識別並折疊 blocks、每一列、cells、每個儲存格與元素；本機 &lt;code&gt;$schema&lt;/code&gt; 提供欄位說明與結構檢查。&lt;code&gt;columns: 2&lt;/code&gt; 對應兩個儲存格陣列，元素依序顯示。section 的 blocks 放子元素，長段落用 paragraphs，程式碼字串內換行用 \n。舊 Markdown/YAML 頁面仍可建置，同一頁面的每種語言只保留一種格式。&lt;/p&gt;
&lt;h2&gt;預覽之後再發布&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt; 驗證並產生網站，&lt;code&gt;npm run check&lt;/code&gt; 把頁面報告寫入 &lt;code&gt;tools/reports/&lt;/code&gt;。本地檢查首頁、文章、語言連結和手機版面，再把 &lt;code&gt;dist/&lt;/code&gt; 交給既有託管與部署流程。產生的 HTML 是結果；需要修正時，回到原始檔裡修改。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-theme-development/&quot; rel=&quot;noopener noreferrer&quot;&gt;佈景主題二次開發&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-data-saving/&quot; rel=&quot;noopener noreferrer&quot;&gt;可選省流設定&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-TW/edgepress/quick-start/&quot; rel=&quot;noopener noreferrer&quot;&gt;專案與快速入門&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>我提问：選用的網站討論服務</title><link>https://www.js.gripe/zh-TW/2026/10/reporelay-introduction/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/10/reporelay-introduction/</guid><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-07T02:08:42.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>我提問負責討論介面與後端。網站在 config.yml 註冊可選服務，由讀者決定是否載入。發表時使用 GitHub 登入，閱讀公開討論無需登入。文字可以搭配圖片與黑熊、熊貓表情，表情在編輯時就直接顯示在輸入框裡。</description><category>iask</category><category>github-app</category><category>open-source</category><content:encoded>&lt;p&gt;我提問負責討論介面與後端。網站在 config.yml 註冊可選服務，由讀者決定是否載入。發表時使用 GitHub 登入，閱讀公開討論無需登入。文字可以搭配圖片與黑熊、熊貓表情，表情在編輯時就直接顯示在輸入框裡。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/iask-workflow-zh.9fc8bb73f6746d70.gif&quot; alt=&quot;我提问：選用的網站討論服務&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;介面跟隨網站配色、可用寬度與語言。Cloudflare 與 Netlify 提供平台入口，Vercel 另需持久 PostgreSQL。現行設定與登入回呼請以部署說明為準。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jsw-teams/iask&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub&lt;/a&gt; / &lt;a href=&quot;https://github.com/jsw-teams/iask/blob/main/docs/edgepress.md&quot; rel=&quot;noopener noreferrer&quot;&gt;Documentation&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>寫文建站文章的 Markdown 與嵌入寫法</title><link>https://www.js.gripe/zh-TW/2026/09/markdown-syntax-guide/</link><guid isPermaLink="true">https://www.js.gripe/zh-TW/2026/09/markdown-syntax-guide/</guid><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T14:11:57.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-TW</dc:language><description>實際文章會用到的正文語法、本地媒體與需同意的文件及分享嵌入。</description><category>edgepress</category><category>EdgePress</category><category>使用筆記</category><content:encoded>&lt;p&gt;寫文建站文章由 YAML 中繼資料和後面的 Markdown 正文組成。先用指令產生檔案，再編輯第二道 &lt;code&gt;---&lt;/code&gt; 之後的正文。下面集中列出一篇實際筆記會用到的寫法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;## What I noticed

A paragraph with **emphasis**, a [link](https://example.org/) and `inline code`.

- A short list
- Another point

&amp;gt; A quoted observation.

| Step | Result |
| --- | --- |
| Build | Static HTML |

- [x] Draft
- [ ] Preview

![A photograph](/images/walk.jpg)

!document[Report](/documents/report.pdf)

!embed[ishare](https://ishare.js.gripe/s/EXAMPLE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正文支援標題、段落、強調、連結、清單、引用、程式碼圍欄、GFM 表格和工作清單。程式碼放在三道反引號之間，並註明語言。文章標題已由頁面顯示，正文章節從 &lt;code&gt;##&lt;/code&gt; 開始。&lt;/p&gt;
&lt;p&gt;媒體先放在 &lt;code&gt;content/assets/&lt;/code&gt;，再引用站點根路徑。圖片開啟共享檢視器；明確指定的原圖位址在點擊後請求。本地文件由可重用文件檢視器自動預覽；外部文件需要登記服務、目前同意與 CORS。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;!embed[ishare](URL)&lt;/code&gt; 獨佔一行，EXAMPLE 要換成實際發布的分享連結。使用前在 &lt;code&gt;plugins.consent.services&lt;/code&gt; 註冊服務，請求等待同意和實際載入需求。同樣的擴充行也能寫在 Pages 的 text 元素裡，不要把嵌入放進文章前置資料。&lt;/p&gt;
&lt;p&gt;Pages 使用結構化元素，不要把整篇 Markdown 文章貼進文字欄位。排版參考&lt;a href=&quot;https://www.js.gripe/zh-TW/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;完整 Pages 範例&lt;/a&gt;。寫作時用 &lt;code&gt;npm run dev&lt;/code&gt; 預覽，發布前建置。&lt;/p&gt;
</content:encoded></item></channel></rss>