Cross-Tab & Files
ประสานงานข้ามแท็บและบันทึกไฟล์
หัวข้อที่มีชื่อว่า “ประสานงานข้ามแท็บและบันทึกไฟล์”แอปพลิเคชันเว็บสมัยใหม่มักทำงานในหลายแท็บพร้อมกัน เมื่อแท็บหนึ่งอัปเดตข้อมูล แท็บอื่นจะรู้ได้อย่างไร? เมื่อแอปต้องเขียนไฟล์ขนาดใหญ่จะหลีกเลี่ยงการเขียนทับงานของแท็บอื่นได้อย่างไร? โมดูลนี้จะตอบคำถามทั้งสองข้อ
browser มี API สี่ตัวที่ทำงานร่วมกัน:
- BroadcastChannel — รับ-ส่งข้อความแบบ publish/subscribe ระหว่างทุกแท็บ (และ worker) บน origin เดียวกัน
storageevent — เกิดขึ้นในแท็บอื่นเมื่อมีการเขียนlocalStorage; กลไกการแจ้งเตือนดั้งเดิมก่อน BroadcastChannel- Web Locks — primitive สำหรับ mutual-exclusion ที่ทำให้การเข้าถึง resource ทำงานเป็น serial ป้องกัน race condition
- File System Access / OPFS — อ่านและเขียนไฟล์จริง (หรือ sandbox ส่วนตัวของ origin) ด้วย API แบบ async
วิธีที่แท็บสื่อสารกัน
หัวข้อที่มีชื่อว่า “วิธีที่แท็บสื่อสารกัน”flowchart LR
subgraph Origin["Same origin (scheme + host + port)"]
TabA["Tab A\n(writer)"] -->|postMessage| BC["BroadcastChannel\n'app-updates'"]
BC -->|onmessage| TabB["Tab B\n(listener)"]
BC -->|onmessage| TabC["Tab C\n(listener)"]
TabA -->|setItem| LS[(localStorage)]
LS -->|storage event| TabB
LS -->|storage event| TabC
end เนื้อหาของโมดูลนี้
หัวข้อที่มีชื่อว่า “เนื้อหาของโมดูลนี้”| บทเรียน | สิ่งที่จะเรียนรู้ |
|---|---|
| หน้านี้ | API ทั้งสี่สำหรับ cross-tab และไฟล์ และเวลาที่ควรใช้แต่ละตัว |
broadcastchannel | new BroadcastChannel(name), postMessage, onmessage, close; เทียบกับ storage event |
web-locks | navigator.locks.request, โหมด exclusive กับ shared, ifAvailable, locks.query() |
cross-tab-state | รวม BroadcastChannel + localStorage/IndexedDB สำหรับ shared state; leader election ด้วย Web Locks |
file-system-access-opfs | showOpenFilePicker / showSaveFilePicker (ต้องใช้ gesture) และ OPFS navigator.storage.getDirectory() |
เปรียบเทียบด่วน
หัวข้อที่มีชื่อว่า “เปรียบเทียบด่วน”| API | การส่งข้อมูล | ต้อง gesture | ทำงานใน workers | เก็บถาวร |
|---|---|---|---|---|
| BroadcastChannel | แท็บอื่น | ไม่ | ใช่ | ไม่ |
storage event | แท็บอื่น | ไม่ | ไม่ | ไม่ |
| Web Locks | แท็บเดียวกัน | ไม่ | ใช่ | ไม่ |
| File System Access | — | ใช่ (picker) | ไม่ | ใช่ |
| OPFS | — | ไม่ | ใช่ | ใช่ |
ตัวอย่างข้อความ cross-tab แรก
หัวข้อที่มีชื่อว่า “ตัวอย่างข้อความ cross-tab แรก”โค้ดด้านล่างสร้าง BroadcastChannel แล้ว post และรับข้อความในหน้าเดียวกัน ในแอปจริง sender และ receiver อยู่คนละแท็บ