- คู่มือการเรียนรู้แบบอินเทอร์แอ็กทีฟ ที่สร้างขึ้นเพื่อช่วยให้วิศวกรเว็บและผู้ใช้ทั่วไปเข้าใจ หลักการทำงานภายในของเบราว์เซอร์ ได้อย่างเป็นธรรมชาติ
- แสดงภาพแต่ละขั้นตอนตั้งแต่การป้อนในแถบที่อยู่ไปจนถึง การสร้างคำขอ HTTP, การแก้ชื่อ DNS, การเชื่อมต่อ TCP, การแยกวิเคราะห์ HTML, การสร้าง DOM, ไปจนถึงเรนเดอริงไปป์ไลน์
- แต่ละขั้นประกอบด้วย ตัวอย่างที่สามารถพิมพ์หรือปรับแต่งได้ด้วยตัวเอง ทำให้ทดลองและสัมผัสกระบวนการสื่อสารผ่านเครือข่ายและการเรนเดอร์ได้จริง
- แสดงให้เห็นอย่างชัดเจนถึง บทบาทของ DOM และความแตกต่างของขั้นตอน Layout–Paint–Composite พร้อมให้ตรวจสอบองค์ประกอบที่มีผลต่อประสิทธิภาพได้ด้วยภาพ
- เป็น สื่อการเรียนรู้ที่ช่วยทำความเข้าใจแนวคิดสำคัญอย่างเป็นระบบ สำหรับนักพัฒนาที่ต้องการเรียนรู้โครงสร้างของเบราว์เซอร์หรือเข้าใจการปรับแต่งประสิทธิภาพเว็บ
ภาพรวม
- คู่มือนี้สร้างขึ้นสำหรับผู้ที่ใช้งานเว็บทุกวันแต่ ยังไม่เข้าใจชัดเจนว่าเบราว์เซอร์ทำงานอย่างไร
- ช่วยเติมเต็มข้อจำกัดของสื่อเดิมที่มักจะเทคนิคจ๋าเกินไปหรือผิวเผินเกินไป
- ออกแบบมาให้เรียนรู้รายละเอียดทางเทคนิคได้อย่างเป็นธรรมชาติผ่าน ตัวอย่างอินเทอร์แอ็กทีฟขนาดเล็ก
- มีการละรายละเอียดอย่างเวอร์ชัน HTTP, SSL/TLS และการทำงานเชิงลึกของ DNS โดย เน้นเฉพาะแนวคิดหลักให้กระชับ
- โปรเจกต์นี้เผยแพร่เป็น โอเพนซอร์ส และสามารถเสนอแนวทางปรับปรุงผ่าน GitHub ได้
เบราว์เซอร์และ URL
- ทุกสตริงที่ผู้ใช้ป้อนในแถบที่อยู่จะถูกแปลงภายในเป็น รูปแบบ URL
- หลังจากกด Enter จะมี อินเทอร์เฟซสำหรับทดลองใช้งาน ที่ให้ตรวจสอบกระบวนการแปลงได้โดยตรง
การแปลง URL เป็นคำขอ HTTP
การแก้ที่อยู่เซิร์ฟเวอร์ (DNS)
- เบราว์เซอร์ไม่สามารถใช้ ชื่อโดเมน อย่าง
example.com ได้โดยตรง
- ต้องแปลงเป็น ที่อยู่ IP ผ่านระบบ DNS ก่อน จึงจะสื่อสารกับเซิร์ฟเวอร์ได้
- เมื่อป้อนโดเมนในช่องป้อนข้อมูล จะสามารถดู ผลลัพธ์ของการแก้ DNS (ที่อยู่ IP) ได้
การตั้งค่าการเชื่อมต่อ TCP
- หลังจากได้ IP จาก DNS แล้ว เบราว์เซอร์จะใช้ โปรโตคอล TCP เพื่อสร้างการเชื่อมต่อกับเซิร์ฟเวอร์อย่างเชื่อถือได้
- การเชื่อมต่อถูกสร้างขึ้นผ่านกระบวนการ 3-way handshake
- SYN: ไคลเอนต์ขอเชื่อมต่อ
- SYN-ACK: เซิร์ฟเวอร์ตอบกลับและยืนยัน
- ACK: ไคลเอนต์ยืนยันขั้นสุดท้าย
- TCP ช่วยคงการสื่อสารที่เสถียรด้วย การรับประกันลำดับข้อมูลและการส่งซ้ำ
- สามารถทดลอง ความเสถียรของการส่งข้อมูล ได้ด้วยการตัดเครือข่ายหรือปรับแต่งแพ็กเก็ต
คำขอและการตอบกลับ HTTP
- หลังจากเชื่อมต่อ TCP แล้ว เบราว์เซอร์จะ ส่งคำขอ HTTP และเซิร์ฟเวอร์จะ ส่งการตอบกลับ HTTP กลับมา
- มีการ แสดงภาพการเคลื่อนที่ของคำขอและการตอบกลับ ทำให้สังเกตการไหลของแพ็กเก็ตได้
- เมื่อการตอบกลับมาถึง เบราว์เซอร์จะแยก เฮดเดอร์และเนื้อหา แล้วเริ่มเรนเดอร์ HTML
การแยกวิเคราะห์ HTML และการสร้าง DOM tree
- เบราว์เซอร์จะส่งไบต์ของ HTML ไปยัง parser เพื่อสร้าง DOM tree
- เมื่อป้อน HTML ตัวอย่าง จะสามารถเห็นภาพกระบวนการที่แท็กอย่าง
<h1>, <p> ถูกแปลงเป็น DOM node ได้อย่างชัดเจน
- การแยกวิเคราะห์เกิดขึ้นแบบ streaming จึงสามารถสร้างโหนดได้แม้เอกสารจะมายังไม่ครบทั้งหมด
- เมื่อพบแท็ก
<script> การแยกวิเคราะห์จะหยุดชั่วคราวเพื่อรันสคริปต์
- DOM ที่เสร็จสมบูรณ์จะรวมกับ CSS เพื่อสร้าง render tree
ความสำคัญของ DOM
- DOM (Document Object Model) คือโมเดลเอกสารภายในหน่วยความจำของเบราว์เซอร์ และเป็น
โครงสร้างหลักที่ HTML parser, CSS selector engine และ JavaScript runtime ใช้ร่วมกัน
- การเปลี่ยนแปลง DOM จะสะท้อนทันทีไปยัง layout, style และการโต้ตอบของผู้ใช้
- มี ฟีเจอร์พรีวิว ที่จะแสดงการเปลี่ยนแปลงของ DOM แบบเรียลไทม์เมื่อแก้ไขโค้ด JavaScript
Layout, Paint, Composite
- เมื่อ DOM และ CSS พร้อมแล้ว เบราว์เซอร์จะเริ่ม rendering pipeline
- Layout(Reflow) : คำนวณขนาดและตำแหน่งขององค์ประกอบ
- Paint: เติมพิกเซล
- Composite: รวมเลเยอร์บน GPU
- การเปลี่ยนสีจะรันเฉพาะ Paint ใหม่อีกครั้ง แต่การเปลี่ยนขนาดจะ ต้องรันทั้ง Layout และ Paint ใหม่
- สามารถคลิกเพื่อตรวจสอบได้ว่าแต่ละขั้นมีการรันใหม่หรือไม่
- แสดงให้เห็นด้วยภาพว่า หน้าเว็บที่มีการคำนวณ Layout มากจะเรนเดอร์ช้า
สรุป
- เป็น คู่มือที่ให้เรียนรู้ผ่านการลงมือสัมผัสจริง ครบตั้งแต่การป้อนที่อยู่จนถึงการเรนเดอร์
- เมื่อทำครบทุกขั้นตอน จะสามารถสร้าง mental model ที่ชัดเจนเกี่ยวกับหลักการทำงานของเบราว์เซอร์ ได้
- โปรเจกต์นี้เป็น โอเพนซอร์ส และสามารถเสนอการปรับปรุงผ่าน issue หรือ Pull Request บน GitHub ได้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ไม่ใช่ทุกเบราว์เซอร์ที่มี DOM มาตั้งแต่แรก
ในยุคแรกมี WorldWideWeb (Nexus, 1990), Erwise (1992), ViolaWWW (1992), Lynx (1992), NCSA Mosaic (1993), Netscape 1.0 (1994), IE 1.0 (1995) เป็นต้น
Lynx ยังคงตั้งใจคงสถานะเป็น เบราว์เซอร์แบบไม่มี DOM มาจนถึงทุกวันนี้
AOL 1.0–2.0 ใช้เอนจินแบบคงที่ (AOLPress) ที่ไม่มีออบเจ็กต์ให้โปรแกรมเข้าไปควบคุมได้
การโต้ตอบกับ DOM เริ่มทำได้ตั้งแต่ Netscape 2.0 (1995), IE 3.0 (1996), AOL 3.0 (1996), Opera 3.0 (1997)
หลังจากนั้น Netscape 4.0 (
document.layers) และ IE 4.0 (document.all) ก็ใช้โมเดลคนละแบบกันDOM มาตรฐาน ตัวแรกคือ W3C DOM Level 1 (1998) โดย IE 5.0 (1999) รองรับบางส่วน และ Konqueror 2.0 (2000) กับ Netscape 6.0 (2000) เริ่มรองรับครบถ้วน
Safari 1.0 (2003), Firefox 1.0 (2004), Chrome 1.0 (2008) รองรับ DOM มาตรฐานมาตั้งแต่ต้น และปัจจุบันยึดตาม WHATWG DOM Living Standard
เพราะตีความและเรนเดอร์ข้อความ HTML โดยตรง จึงใช้ RAM น้อยมาก
เป็นโปรเจ็กต์ที่ยอดเยี่ยม
ถ้าเป็นผู้อ่าน HN ก็น่าจะชอบอ่าน High-Performance Browser Networking และ Every Layout ควบคู่กันไปด้วย
ทั้งสองอย่างเป็นแหล่งข้อมูลชั้นยอดที่เจาะลึกเรื่อง ประสิทธิภาพเว็บและโครงสร้าง CSS
บทที่ 4 ทำให้เข้าใจ โครงสร้างเฟรมของ TLS จนสามารถใช้แก้ปัญหา latency ในที่ทำงานเก่าได้
ส่วนที่พูดถึง trade-off ของการปรับขนาดเฟรม TLS ก็น่าสนใจมาก
ถึงอาจไม่ได้มีโอกาสใช้บ่อย แต่ก็ทำให้รู้ว่ามีการจูนรายละเอียดระดับเครือข่ายแบบนี้ได้
เป็นแนวทางที่น่าสนใจ เหมือนได้ลอง browser.engineering โดยไม่ต้องติดตั้งอะไร
ตอนยกตัวอย่างเบราว์เซอร์กับเซิร์ฟเวอร์ ถ้าเพิ่ม ไอคอนแบบภาพ (เช่น เดสก์ท็อป/เซิร์ฟเวอร์) น่าจะช่วยให้เข้าใจง่ายขึ้น
ตอนนี้กำลังรวบรวมฟีดแบ็กอยู่ และข้อเสนอเรื่องไอคอนก็เป็นไอเดียที่ดี น่าจะลองพิจารณาดู
ชอบมากจน บุ๊กมาร์ก ไว้แล้ว
แต่ก็เสียดายที่ยังไม่มีส่วนของ กระบวนการโหลด resource อย่างรูปภาพ สไตล์ชีต และสคริปต์ ที่อิงจาก HTML/DOM
ส่วนนี้สำคัญต่อการทำความเข้าใจว่าทำไมสไตล์ของหน้าถึงพังหรือภาพถึงไม่ขึ้น
ตอนนี้กำลังคิดอยู่ว่าจะเพิ่มบล็อกเหล่านี้อย่างไรโดยไม่ทำให้ซับซ้อนเกินไป
เมื่อหน้าต่างเบราว์เซอร์แคบลง (ต่ำกว่า 1170px) มี ปัญหาที่ส่วนสารบัญซ้อนทับขึ้นมาบนเนื้อหา
น่าจะเกลาตรรกะการ parse URL เพิ่มอีกนิด
ผู้ใช้ส่วนใหญ่อาจไม่เจอปัญหา แต่เบราว์เซอร์ก็มีการจัดการเป็นพิเศษเมื่อป้อน protocol scheme อื่นนอกเหนือจาก
https://หรือhttp://น่าจะดีถ้าดักเคสพวกนี้ไว้ด้วย
อ้างอิง: List of URI schemes
เป็นโปรเจ็กต์ที่ยอดเยี่ยม
อยากรู้ว่าในขั้นต่อไปมีแผนเพิ่มรายละเอียดของ กระบวนการ reflow หรือไม่
ค่อนข้างเสียดายที่เกินครึ่งหน้าพูดถึง network request
ทั้งที่ส่วนซับซ้อนจริง ๆ ของเบราว์เซอร์อยู่ที่ pipeline การ parse และ render
ตอนนี้ยังไม่แน่ใจว่าควรลงลึกตรงส่วนไหนบ้าง เลยปล่อยออกมาก่อนแล้วค่อยรับฟีดแบ็ก
อาจเป็นคำถามนอกเรื่อง แต่สงสัยว่าถ้าตัด DNS lookup ออกไปเลย แล้วให้ทำงานด้วย ชื่อโดเมนที่มนุษย์อ่านได้ เท่านั้นจะเป็นอย่างไร
แนวคิดคือทำให้อินเทอร์เน็ตทั้งระบบกลายเป็นสวิตช์ขนาดมหึมาตัวเดียว
จำได้ว่าเคยเห็นผู้ก่อตั้ง Tailscale เขียนถึงแนวคิดคล้าย ๆ กันไว้
งานเจ๋งมาก