Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[[#table-of-contents|← 回目錄]]


Part F:緊急救援

部署後出問題,從上往下檢查,不要反過來:

順序檢查指令
DNSdig 網域 +short
RoutesCloudflare 面板 → Workers Routes
部署狀態Cloudflare → Deployments
config.ymlgrep "repo:" public/admin/config.yml
頁面標題grep "Layout title=" src/pages/*.astro
殘留檔案ls .github/workflows/deploy.yml
程式碼最後才檢查

詳見 [[#trouble-deploy-order|§7.17 部署除錯優先順序]]

Part G:Email Routing — 免費專業信箱

Cloudflare Email Routing 讓你用 info@你的網域 收信,自動轉到你的 Gmail。

前提條件

條件檢查
網域 DNS 在 Cloudflare 管理nameserver 指向 Cloudflare
Cloudflare Proxy 已開DNS 記錄旁是橘雲圖示
有一個真實信箱當目的地Gmail / Yahoo 任何 Email

限制

Email Routing 只能收信(轉到 Gmail),不能直接寄信。要從 info@你的網域 寄出,在 Gmail 設定「寄件地址」(免費,5 分鐘)。

設定步驟

① Cloudflare 面板 → 你的網域 → Email → Email Routing → Get started
② Add destination → 輸入你的 Gmail → 收驗證信 → 點確認連結
③ 回到 Cloudflare → Routes → Add route
   → Custom address: 填 info(前面框,不要 @,系統自動帶網域)
   → Action: Send to an email
   → Destination: 輸入你的 Gmail
④ 點儲存 → 完成

驗收測試

用另一個信箱寄一封信到 info@你的網域,看你的 Gmail 收到沒。

測試結果對策
✅ 收到完成
⚠️ 收到但在垃圾郵件正常。 新網域前幾封信可能被 Gmail 歸類為可疑。手動點「這不是垃圾郵件」,用幾次就會改善
❌ 沒收到檢查 MX 記錄 → dig 你的網域 MX +short → 應回傳 route.mx.cloudflare.net

從 Gmail 寄出(選配)

Gmail → 右上齒輪 → 查看所有設定 → 帳戶和匯入
→ 「以這個地址寄送郵件」→ 新增另一個電子郵件地址
→ 輸入 info@你的網域
→ SMTP 伺服器: smtp.gmail.com
→ 你的 Gmail 帳號 + 應用程式密碼
→ 驗證 → 完成

設定完後做的

動作說明
把網站聯絡頁的 mailto 改成 info@你的網域專業感 +100
測試寄信 → 確認 Gmail 收到30 秒
告知客戶他的專業信箱「你好,你的信箱是 info@你的網域」

關於 mailto 按鈕的注意事項

手機點「聯絡我」按鈕時,如果沒裝郵件 App 會跳「沒有預設郵件程式」。這是 mailto: 連結的原罪,不是網站 bug。未來可用 Formspree 表單服務取代(免費 50 封/月)。

[[#table-of-contents|← 回目錄]]


第 3 章:定義好規則,才開始寫程式

👤 你:定義設計規則、審核規範表🤖 AI:建 AGENTS.md + 視覺規範表,跑審計腳本

這章是你跟 AI 的「前置合約」。規則訂清楚,後面 10 章就不會偏離。 在所有頁面開始前必須先定義視覺規範。 一但前置對了 → 全部對。一但前置錯了 → 無止盡修 bug。

A. 前置作業哲學

在兩個真實專案(ming-travel-blog、ming-website)中,學到最重要的一件事:所有後續的 bug,都是因為一開始沒有定義清楚規則。

踩過的坑根因如果前置有規範
修了 4 次光暈問題全站用了 5 種不同 shadow 公式先規定「只用一種 0_0_20px」
修了 4 次 transition 不生效global.css 有 !important 100ms 覆蓋先規定「禁止 !important 全局覆蓋」
修了聯絡頁 3 次格式每次從零設計卡片布局先規定「參考模板 contact.astro」
改了 N 次價格格式K 縮寫 vs 完整數字混用先規定「永遠完整數字」

核心服務哲學:客戶永遠不用改變他們自己的習慣。是我們要做到他們無須學習成本就能達成。

這句話貫穿整份手冊的設計決策:

  • 後台上傳照片會卡?→ 瀏覽器自動壓縮,不是叫客戶先壓縮
  • 手機上看不到表格?→ 自動換成卡片格式,不是叫客戶轉橫向
  • 不會 Markdown?→ 後台使用說明頁有完整教學,不是叫客戶去 Google

結論:先把規則寫死,OpenCode 從第一行程式碼就照著走。 規則不是限制,是讓每個人(你、AI、客戶)都知道邊界在哪裡。邊界內自由發揮,邊界外不會發生。


B. 開始前必填的視覺規範表

OpenCode 在寫任何程式碼之前,必須先產出這張表給你確認:

#項目範例
1主色___#E27D60(暖橘)或 #06B6D4(青色)
2輔色___#E8A87C#fcd34d
3亮背景色___#FDFBF7
4暗背景色___#1C1917
5標題字體___Inter(粗體)
6內文字體___Noto Sans TC
7卡片圓角___rounded-2xl
8hover 光暈公式___hover:shadow-[0_0_20px_rgba(主色,0.15)] dark:hover:shadow-[0_0_20px_rgba(主色,0.25)]
9transition 時間1200ms全站只用這一個值
10badge 光暈風格___rounded-md + dark:shadow-[0_0_15px_rgba(255,255,255,0.1)]
11背景 blur 規格___<div class="absolute ... w-[300px] h-[300px] blur-[80px] bg-[主色]/5 ... -z-10"></div>

規則:這張表填完,你確認後,才能開始寫第一行程式碼。每次建新頁面都從這張表取值。

B2. 手機優先設計原則(必須在開始設計前確定)

#原則CSS / HTML 寫法說明
1對比表桌上 <table> + 手機直式卡片,用 hidden md:block / md:hidden 切換不要讓客戶左右滑表格
2方案卡片grid-cols-1 md:grid-cols-3手機單欄、桌面三欄
3聯絡頁左右區塊左側 flex flex-col h-full、右側表單 flex-1確保手機上兩邊等高
4CTA 按鈕w-full sm:w-auto手機全寬、桌面自適應
5手機最小字體@media (max-width: 768px) { font-size: 17px }不讓客戶瞇眼讀內容
6背景 blur 數量每個區塊最多 1 個 <div class="absolute ... blur-[80px] ...">手機效能考量

每次開始新頁面時,在提示詞中加入:

「手機版和桌面版都要考慮。
對比表在手機上用直式卡片,不要用左右滑動表格。
方案卡片在手機上單欄、桌面三欄。
確保所有頁面在手機上字體不小於 16px。」

C. 技術規範(寫入 AGENTS.md)

以下 6 條規則必須寫入每個專案的 AGENTS.md,OpenCode 每次 session 都會讀到:

#規則違反的後果
1禁止 global.css 有 !important 全局 transition-duration所有 per-element duration 設定失效,除錯極難
2禁止價格用 K 縮寫視覺不專業、客戶混淆
3行銷頁禁技術名(GitHub、Astro、Sveltia、Home Assistant…)客戶比價、覺得「不就是買零件」
4建完每頁就跑審計腳本(見段落 D)及早發現不一致
5push 前跑全站審計確認 shadow / duration / tech-name 全部一致
6每次結束存 PROJECT_NOTES下次 session 才能接續

D. 審計腳本(建完每頁就跑)

# 1. shadow 公式審計 — 應該只有 1 種輸出(0_0_20px)