🌐 หน้า WebUI ของ Chromium ใน iBrowe
หน้า WebUI ใน iBrowe (ซึ่งพัฒนาต่อยอดจาก Chromium) ใช้ระบบพื้นฐานเดียวกันสำหรับการจัดการเส้นทาง (routing), การคอมไพล์ (compiling) และการปรับแต่งประสิทธิภาพ (optimizing) ของโมดูล HTML/JS โดยโมดูลเหล่านี้สามารถอ้างอิงไฟล์ได้ทั้งแบบ relative (เช่น …/my_module.html) หรือ absolute ผ่าน URL ภายในระบบ (เช่น ibrowe://settings/my_module.html)
ทรัพยากร (resources) ทั้งหมดจำเป็นต้องสามารถเข้าถึงได้ผ่านทั้ง HTTP และ FileSystem ในระหว่างกระบวนการ build โดยแต่ละ URL ที่ขึ้นต้นด้วย ibrowe:// จะถูกแมป (map) ไปยังเส้นทางไฟล์ (file path) ที่เกี่ยวข้อง โดยใช้คำสั่ง optimize_web_ui ในระบบ build ของ GN
🧱 ขั้นตอนการ Build โดยทั่วไปสำหรับ WebUI ที่พัฒนาบน Chromium
สำหรับ WebUI ส่วนใหญ่ (เช่น ibrowe://settings) กระบวนการในระบบ GN pipeline จะประกอบด้วยขั้นตอนดังนี้:
- Closure Compiler → ทำการตรวจสอบประเภทตัวแปร (type-checking) สำหรับไฟล์ JavaScript modules
- Grit Tool → รวมทรัพยากรต่าง ๆ (resources) ให้อยู่ในไฟล์ .pak ผ่านไฟล์ manifest นามสกุล .grd
- Unpacking → แยกเนื้อหาในไฟล์ .pak ไปยังโฟลเดอร์ staging สำหรับขั้นตอนต่อไป
- optimize_web_ui → ทำการรวมไฟล์โมดูลต่าง ๆ ให้อยู่ในไฟล์เดียว (flatten) และย่อขนาดไฟล์ (minify) เพื่อเพิ่มประสิทธิภาพ
- Repacking → สร้างไฟล์ .pak ที่ถูกปรับแต่งและย่อขนาดแล้วอีกครั้งด้วย Grit
🔁 การแมป URL ไปยัง Path บน Filesystem
เพื่อให้สามารถแปลงเส้นทาง เช่น ibrowe://resources/… ไปยังตำแหน่งไฟล์จริงในระบบไฟล์ (filesystem) สคริปต์ optimize_web_ui.py จะใช้ตาราง mapping ที่ตั้งค่าไว้ล่วงหน้า เช่น:
_URL_MAPPINGS = [ (‘chrome://resources/cr_components/’, _CR_COMPONENTS_PATH), (‘chrome://resources/cr_elements/’, _CR_ELEMENTS_PATH), (‘chrome://resources/css/’, _CSS_RESOURCES_PATH), (‘chrome://resources/html/’, _HTML_RESOURCES_PATH), (‘chrome://resources/js/’, _JS_RESOURCES_PATH), (‘chrome://resources/polymer/v1_0/’, _POLYMER_PATH), (‘chrome://brave-resources/’, _BR_RESOURCES_PATH) # ใน iBrowe จะเปลี่ยนเป็น ibrowe-resources ]
สำหรับ path ที่ไม่ใช่ core เช่น ibrowe://history การ mapping จะถูกกำหนดโดยตรงในไฟล์ GN build เช่น:
optimize_webui(“build”) { host = “history” input = rebase_path(“.”, root_build_dir) … }
ซึ่งจะเป็นการแจ้งให้ระบบ build ทราบว่า ให้แมป URL ibrowe://history/xyz.html ไปยังโฟลเดอร์หรือไฟล์ที่สอดคล้องกันใน filesystem
🧪 Debug Builds vs Release Builds
🔧 Debug Builds
- ในโหมด Debug จะให้บริการไฟล์แบบแยกกัน (Serve individual files) เช่น ibrowe://settings/module1.js
- จะไม่มีการรวมไฟล์ (flattening) หรือย่อไฟล์ (minification)
- เหมาะสำหรับการดีบัก (debug) เพื่อตรวจสอบการโหลดโมดูลในรูปแบบดิบ (raw)
🚀 Release Builds
- ในโหมด Release หน้า WebUIs จะถูกปรับแต่งให้มีประสิทธิภาพสูงสุด ด้วยการใช้คำสั่ง optimize_web_ui
- ไฟล์ต่าง ๆ จะถูก รวม (flattened) และ ย่อขนาด (minified) ให้อยู่ใน bundle เดียว
- จำเป็นต้องทำการทดสอบเพิ่มเติม เพื่อให้แน่ใจว่าเว็บทำงานได้ถูกต้องทั้งในโหมด Debug และ Release
🐾 WebUIs เฉพาะของ iBrowe WebUI ที่สร้างขึ้นมาเฉพาะสำหรับ iBrowe (ไม่ได้สืบทอดมาจาก Chromium โดยตรง) จะ ไม่ใช้ optimize_web_ui แต่จะพึ่งพา Webpack ซึ่งมีความสามารถดังนี้:
- รองรับทั้ง TypeScript และ JavaScript
- การแก้ปัญหาเรื่องเส้นทางโมดูล (module resolution) และการลบโค้ดส่วนที่ไม่ถูกใช้ (tree-shaking)
- การแบ่งโค้ดออกเป็นส่วนย่อย ๆ (code splitting) หรือรวมเป็นไฟล์เดียว (bundling)
- การย่อโค้ด (minification) เพื่อลดขนาดไฟล์
- การสร้างไฟล์ .grd แบบไดนามิกจากคำสั่ง import ต่าง ๆ
📚 ศึกษาข้อมูลเพิ่มเติมได้ที่: https://github.com/brave/brave-browser/wiki/Javascript-and-Typescript-Bundling
เนื้อหานี้ดัดแปลงและปรับปรุงมาจากเอกสารของ Brave เกี่ยวกับ Chromium WebUI: https://github.com/brave/brave-browser/wiki
โดยในเนื้อหานี้ ได้เปลี่ยนการอ้างอิงจาก chrome:// และ brave:// ให้เป็น ibrowe:// ตามการใช้งานใน iBrowe