Browser Caching

กลไกที่ browser เก็บสำเนาไฟล์ (CSS, JS, รูปภาพ) ไว้ในเครื่องผู้ใช้ เพื่อไม่ต้องโหลดจาก server ใหม่ทุกครั้ง ทำให้เว็บเปิดเร็วขึ้น

วิธีทำงาน

sequenceDiagram
    participant U as 👤 ผู้ใช้
    participant B as 🌐 Browser
    participant S as 🖥️ Server

    Note over U,S: ครั้งแรก — ยังไม่มี cache
    U->>B: เปิด admyhusky.dev
    B->>S: ขอ styles.css
    S-->>B: styles.css (v2.0.1)
    B->>B: เก็บ cache ไว้ในเครื่อง
    B-->>U: แสดงเว็บ ✅

    Note over U,S: ครั้งต่อไป — มี cache แล้ว
    U->>B: เปิด admyhusky.dev
    B->>B: เจอ styles.css ใน cache
    B-->>U: แสดงเว็บทันที ⚡ (ไม่ต้องโหลดใหม่)

ปัญหา: ผู้ใช้ไม่เห็นเวอร์ชันใหม่

พอเราอัปเดตไฟล์บน server แต่ชื่อไฟล์ยังเหมือนเดิม (styles.css) → browser ไม่รู้ว่ามีการเปลี่ยนแปลง → ยังใช้ไฟล์เก่าจาก cache

sequenceDiagram
    participant U as 👤 ผู้ใช้
    participant B as 🌐 Browser
    participant S as 🖥️ Server

    Note over S: dev อัปเดต styles.css (v2.0.2)
    U->>B: เปิด admyhusky.dev
    B->>B: เจอ styles.css ใน cache (v2.0.1)
    B-->>U: แสดงเว็บด้วยไฟล์เก่า ❌
    Note over U: เห็น bug ที่แก้ไปแล้ว!

Cache-Busting — บังคับให้โหลดไฟล์ใหม่

เทคนิคทำให้ browser เห็นไฟล์เป็น URL ใหม่ → โหลดใหม่จาก server

sequenceDiagram
    participant U as 👤 ผู้ใช้
    participant B as 🌐 Browser
    participant S as 🖥️ Server

    Note over S: dev อัปเดต styles.css + เปลี่ยน ?v=2.0.2
    U->>B: เปิด admyhusky.dev
    B->>B: หา styles.css?v=2.0.2 ใน cache
    B->>B: ไม่เจอ! (เคยเก็บแค่ ?v=2.0.1)
    B->>S: ขอ styles.css?v=2.0.2
    S-->>B: styles.css ตัวใหม่ (v2.0.2)
    B->>B: เก็บ cache ใหม่
    B-->>U: แสดงเว็บเวอร์ชันใหม่ ✅

วิธีที่ 1: Query String

ตัวอย่างจริงจาก admyhusky.dev — ก่อนแก้ vs หลังแก้:

<!-- ก่อน — ไม่มี version, IG browser ใช้ cache เก่า -->
<link rel="stylesheet" href="styles.css">
<script src="data.js"></script>
<script type="text/babel" src="sections.jsx"></script>
<script type="text/babel" src="app.jsx"></script>
 
<!-- หลัง — เพิ่ม ?v=2.0.3 ทุกไฟล์ -->
<link rel="stylesheet" href="styles.css?v=2.0.3">
<script src="data.js?v=2.0.3"></script>
<script type="text/babel" src="sections.jsx?v=2.0.3"></script>
<script type="text/babel" src="app.jsx?v=2.0.3"></script>

Browser เห็น styles.css?v=2.0.3 เป็นคนละ URL กับ styles.css → โหลดใหม่ทันที แม้ใน IG in-app browser

วิธีที่ 2: Hash ในชื่อไฟล์

<!-- build tool สร้างชื่อไฟล์ที่มี hash -->
<link rel="stylesheet" href="styles.a3f8b2.css">

ทุกครั้งที่เนื้อหาเปลี่ยน hash จะเปลี่ยนตาม — ใช้กับ build tool เช่น Webpack, Vite

วิธีที่ 3: HTTP Headers

Server กำหนดผ่าน response header:

Cache-Control: max-age=31536000    # cache ได้ 1 ปี
ETag: "abc123"                      # ถ้าเนื้อหาเปลี่ยน ETag จะเปลี่ยน

In-App Browser Cache

app อย่าง Instagram, LINE, Facebook มี browser ในตัว (WebView) ที่มี cache แยกจาก Safari/Chrome

graph TB
    subgraph iPhone["📱 iPhone ของผู้ใช้"]
        S["🧭 Safari<br/>cache ชุด A"]
        IG["📷 IG in-app browser<br/>cache ชุด B"]
        LINE["💬 LINE in-app browser<br/>cache ชุด C"]
    end

    SV["🖥️ Server<br/>admyhusky.dev<br/>styles.css v2.0.2"]

    S -->|"โหลดใหม่ → เห็น v2.0.2 ✅"| SV
    IG -->|"ใช้ cache เก่า → เห็น v2.0.1 ❌"| SV
    LINE -->|"โหลดใหม่ → เห็น v2.0.2 ✅"| SV

    style S fill:#34C759,color:#fff
    style IG fill:#FF3B30,color:#fff
    style LINE fill:#34C759,color:#fff

ตัวอย่างจริง: เปิด admyhusky.dev ผ่านลิงก์ใน IG → เห็น bug เก่า (Claude bubble แตก) แต่พอเปิดใน Safari → เห็นเวอร์ชันใหม่ที่แก้แล้ว เพราะ cache คนละชุดกัน

  • ล้าง cache ใน Safari ไม่ได้ล้าง cache ของ IG browser
  • แก้ได้โดย force close app หรือใช้ cache-busting จากฝั่ง server

Cache-Busting ทำให้เว็บช้าไหม?

ไม่ — browser ยัง cache ไฟล์ตามปกติ แค่เปลี่ยน version number ตอน deploy ใหม่เท่านั้น

สถานการณ์สิ่งที่เกิด
เข้าครั้งแรกโหลดจาก server + เก็บ cache
เข้าครั้งต่อไป (version เดิม)ใช้จาก cache ไม่โหลดใหม่
Deploy version ใหม่โหลดใหม่เพราะ URL เปลี่ยน

Key Points

  • Browser cache ช่วยให้เว็บเร็วขึ้นโดยเก็บสำเนาไฟล์ไว้ในเครื่อง
  • Cache-busting คือการเปลี่ยน URL (เช่น ?v=2.0.2) เพื่อบังคับโหลดใหม่
  • In-app browser (IG, LINE) มี cache แยกจาก Safari/Chrome
  • Cache-busting ไม่ทำให้เว็บช้า เพราะ cache ยังทำงานปกติ

References