- เฟรมเวิร์กเดสก์ท็อปแอปที่พัฒนาด้วย TypeScript โดยใช้ Bun สำหรับเมนโปรเซส และ Zig สำหรับเนทีฟไบน์ดิง
- รองรับ macOS, Windows, Ubuntu ทั้งหมด พร้อมสร้างตัวติดตั้ง การอัปเดตอัตโนมัติ และอาร์ติแฟกต์แพตช์แบบส่วนต่างโดยอัตโนมัติ
- ให้ ชุดความสามารถเดสก์ท็อปแบบครบถ้วน เช่น การควบคุมหน้าต่าง เมนู คีย์ลัด คลิปบอร์ด กล่องโต้ตอบ ที่เก็บเซสชัน ฯลฯ พร้อมการทำเว็บวิวที่เสถียรบนพื้นฐาน OOPIF
- โครงสร้างภายในใช้ FFI และโมเดลหน่วยความจำที่ใช้ร่วมกันของ Bun เพื่อคงประสิทธิภาพไว้แม้ในสภาพแวดล้อมหลายโปรเซส
- ผู้พัฒนาที่เคยเจอข้อจำกัดของ Electron และ Tauri ได้เรียนรู้ Zig, C, C++, Objective-C ตลอด 2 ปี และพัฒนาขึ้นเอง
- ตั้งเป้าเป็น เวิร์กโฟลว์แบบรวมศูนย์ ที่เริ่มเขียนโค้ดได้ภายใน 5 นาที และดีพลอยได้ภายใน 10 นาที
ภาพรวมและเป้าหมายของโปรเจกต์ Electrobun
- โครงสร้างที่รันเมนโปรเซสด้วย Bun บันเดิล TypeScript ของเว็บวิว และเขียนเนทีฟไบน์ดิงด้วย Zig
- ทั้งเมนโปรเซสและเว็บวิวเขียนด้วย TypeScript แต่ยังคง การแยกโปรเซส (isolation) พร้อมให้การสื่อสาร RPC ที่รวดเร็วและมีการกำหนดชนิด
- ขนาดแอปบันเดิลแบบ self-extract อยู่ที่ประมาณ 12MB (เมื่อใช้ระบบเว็บวิว โดยส่วนใหญ่เป็นขนาดของ Bun runtime)
- การอัปเดตแบบส่วนต่างบนพื้นฐาน bsdiff สามารถลดขนาดแพตช์ได้เหลือน้อยสุดถึง 14KB
- มีเป้าหมายเพื่อมอบ เวิร์กโฟลว์แบบรวมหนึ่งเดียว ที่เริ่มเขียนโค้ดได้ใน 5 นาที และดีพลอยเสร็จได้ใน 10 นาที
- เริ่มโปรเจกต์จากเทมเพลตได้ด้วยคำสั่ง
npx electrobun init
เบื้องหลังการพัฒนา
- ผู้พัฒนาเริ่มสร้างเดสก์ท็อปแอปมาตั้งแต่ยุค Visual Basic 6 และมีประสบการณ์ส่งมอบผลิตภัณฑ์สตาร์ตอัปหลายตัวให้ผู้ใช้นับพันคนในยุค Adobe AIR
- แม้จะทำงานเป็นวิศวกรช่วงเริ่มต้นของสตาร์ตอัปมากว่า 20 ปี และสร้าง-ขยายผลิตภัณฑ์ระดับยูนิคอร์นมาแล้ว สภาพแวดล้อมการพัฒนาเดสก์ท็อปกลับถดถอยลง
- ระหว่างสร้าง co(lab) ซึ่งเป็นไฮบริดของเว็บเบราว์เซอร์ + โค้ดเอดิเตอร์ + PTY เทอร์มินัล เขาต้องเจอกับความไม่สะดวกมากมายจนตัดสินใจทำเฟรมเวิร์กขึ้นเอง
- เวอร์ชันแรกสร้างด้วย Electron แต่กระบวนการเซ็นโค้ด notarization การแจกจ่าย และการอัปเดตให้ความรู้สึกเหมือนกำลังต่อสู้กับเฟรมเวิร์กมากกว่าสร้างแอป
- ต้องการ continuous shipping แบบเดียวกับเว็บ แต่ทูลเชนเดิมทำให้เรื่องนี้ยากเกินความจำเป็น
- เคยลอง Tauri ด้วย แต่เห็นว่า Rust ไม่ได้เหมาะกับนักพัฒนาทุกคน และในเวลานั้น Bun ยังอยู่ก่อนการเปิดตัว 1.0 หลายเดือน จึงเริ่มลงมือพัฒนาเอง
จาก macOS สู่ข้ามแพลตฟอร์ม
- ในช่วงแรกสร้างแอปได้เฉพาะบน macOS แต่ตอนนี้รองรับการบิลด์และดีพลอยบน macOS, Windows, Ubuntu อย่างเต็มรูปแบบแล้ว
- มีการสร้างตัวติดตั้ง อาร์ติแฟกต์อัปเดตอัตโนมัติ และ แพตช์แบบส่วนต่าง (differential patches) ให้อัตโนมัติทั้งหมด
- เพียงเชื่อมต่อกับโฮสต์แบบสแตติก (R2, S3, GitHub Releases) ก็พร้อมดีพลอย
- การอัปเดตแบบส่วนต่างใช้ zig-bsdiff ที่พอร์ตจาก C มาเป็น Zig และปรับแต่งด้วย SIMD และ zstd
- เมื่อ FFI ของ Bun มีความเสถียรมากขึ้น เลเยอร์ Zig FFI ส่วนใหญ่ที่เขียนไว้เดิมจึงถูกแทนที่ด้วย Bun
- สถาปัตยกรรมเปลี่ยนไปในทางที่ดี โดย Bun ใช้ หน่วยความจำร่วมกัน เมื่อสร้าง worker จึงยังคงประสิทธิภาพได้แม้ในระบบหลายโปรเซส
ฟีเจอร์ที่เปิดตัวแล้ว
- ปัจจุบันเป็นเฟรมเวิร์กที่สมบูรณ์ โดยมี การควบคุมหน้าต่างข้ามแพลตฟอร์ม เมนู คีย์ลัด (accelerators) โกลบอลชอร์ตคัต คลิปบอร์ด ไดอะล็อก เว็บวิวพาร์ทิชัน ที่เก็บเซสชัน การค้นหาในหน้า (find-in-page) รวมถึงทูลสำหรับบันเดิลและอัปเดต
- การทำงานของ OOPIF (Out-of-Process Iframe) อยู่ในระดับที่ใช้งานได้จริงแล้ว
- แท็ก
<webview> ของ Electron ถูก deprecated ใน Chromium แต่ยังไม่มีทางเลือกอื่นที่จัดเตรียมไว้
<electrobun-webview> คือ "super iframe" ที่แท้จริง ซึ่งการจัดวางใน DOM การแยกโปรเซส และการซ้อนเลเยอร์ทำงานได้ถูกต้อง
- ทำงานข้ามแพลตฟอร์มได้โดยไม่มีปัญหาเคอร์เซอร์กะพริบ (cursor flicker) และไม่ต้องแพตช์เอนจินเบราว์เซอร์
สถานะการรองรับแพลตฟอร์ม
- macOS 14+: รองรับอย่างเป็นทางการ
- Windows 11+: รองรับอย่างเป็นทางการ
- Ubuntu 22.04+: รองรับอย่างเป็นทางการ
- Linux ดิสทริบิวชันอื่น ๆ (gtk3, webkit2gtk-4.1): รองรับโดยชุมชน
แผนถัดไป
- รีไรต์ co(lab) ใหม่ทั้งหมดบน Electrobun เสร็จแล้ว และหลังจาก v1 เสถียรจะโฟกัสการพัฒนา co(lab) อย่างจริงจัง
- เป้าหมายสำคัญคือทำให้เฟรมเวิร์กมีเสถียรภาพเพียงพอสำหรับการสร้างผลิตภัณฑ์ระยะยาวที่ทะเยอทะยาน โดยไม่สั่นคลอนจาก ความผันผวนของแพลตฟอร์ม (platform churn)
- ชุมชน Discord กำลังเติบโต และผู้ใช้ที่ช่วยเบต้าเทสต์ ส่ง issue และให้ฟีดแบ็กก็มีส่วนในการหล่อหลอมเฟรมเวิร์กนี้
- Electrobun คือผลิตภัณฑ์หลักตัวแรกที่เปิดตัวโดย Blackboard
5 ความคิดเห็น
เห็นเขียนว่าเป็นการเขียน co(lab) ใหม่ทั้งหมด เลยคิดว่าเป็นเรื่องการปรับปรุงเสถียรภาพของคลาวด์สำหรับรัน
ipynbร่วมกับ Google แต่จริง ๆ แล้วเป็นโปรเจ็กต์พัฒนาของทีม Blackboard ที่ไม่เกี่ยวกันเลยถึงอย่างนั้น การที่ OOPIF ซึ่งติดตั้งด้วย
npxสามารถเข้าถึงได้ก็ดูจะเป็นประสบการณ์ที่สำคัญ"ให้ความรู้สึกว่ากระบวนการเซ็นโค้ด รับรองความถูกต้อง เผยแพร่ และอัปเดต เป็นการต่อสู้กับเฟรมเวิร์กมากกว่าการพัฒนาแอป"
ในบทความมีการกล่าวถึงที่มาของการพัฒนาด้วยข้อความข้างต้น
ในความเป็นจริงก็มีหลายกรณีที่ต้องลงแรงกับการเผยแพร่มากกว่าการพัฒนาแอปเสียอีก
แค่แก้ปัญหานี้ได้ก็น่าชื่นชมอย่างมากแล้วครับ
ดูเหมือนว่าการเอา zig ไปติดกับ Flutter ก็ทำได้ค่อนข้างง่ายและไม่ซับซ้อนเหมือนกันนะครับ
แทบไม่ต่างจากเอกสาร Dart/c ffi มากนัก...
> สงสัยว่าทำไมดิสโทร Linux หลัก ๆ ถึงไม่ให้ WebView พื้นฐานมาเป็นค่าเริ่มต้น นี่เป็นอุปสรรคใหญ่ต่อการขยายระบบนิเวศของแอป
ถ้าเป็นระบบปฏิบัติการที่มีสภาพแวดล้อมแบบ GUI ตอนนี้ก็น่าจะถึงเวลาที่ WebView ควรกลายเป็นคอมโพเนนต์พื้นฐานแล้วนะครับ
ความคิดเห็นจาก Hacker News
สวัสดี ผมคือผู้สร้าง Electrobun
ตอนนี้ได้ปล่อยเวอร์ชันเสถียร v1 แล้ว สถาปัตยกรรมถูกกำหนดลงตัวแล้ว และถ้าต้องการ บั๊ก หรือ API ที่เคยใช้ใน Electron/Tauri ให้ไปฝากไว้ที่ GitHub issue แล้วผมจะจัดลำดับความสำคัญให้
ตลอดเดือนที่ผ่านมาได้แก้โค้ด 50,000 บรรทัดเพื่อทำงานด้านเสถียรภาพจนเสร็จ
ยังมี วิดีโอเดโม ของโปรเจ็กต์โอเพนซอร์ส Colab (เว็บเบราว์เซอร์ + โค้ดเอดิเตอร์ + PTY เทอร์มินัล) ที่สร้างด้วย Electrobun ด้วย
โดยพื้นฐานแล้ว Electrobun ใช้ WebView ของระบบ แต่สามารถรวม CEF ได้ด้วยตัวเลือก
bundleCEFโครงสร้างถูกออกแบบให้แยกจาก WebView ดังนั้นถ้า Servo หรือ Ladybird พร้อมเมื่อไร ก็สามารถสลับแทนได้ทันทีนอกจากนี้ ในแต่ละรีลีสยังสามารถสร้าง แพ็กเกจบีบอัดอัตโนมัติที่ใช้ zstd เพื่อลดขนาดดาวน์โหลดครั้งแรก และทำให้อัปเดตมีขนาดเล็กได้ระดับ 14KB
partitionลงใน BrowserWindow จะเกิด TypeScript errorElectrobun ดูมีอนาคตมาก ผมตั้งใจว่าจะใช้ตัวนี้ทำโปรเจ็กต์ถัดไป
ใน Full TypeScript stack มันให้ประสิทธิภาพการทำงานสูงสุด ดีใจที่มีทางเลือกที่เบาและเร็วกว่า Electron โดยไม่ต้องใช้ Rust หรือผ่านกระบวนการคอมไพล์ยาว ๆ
ใน Discord มี นักพัฒนาเกม จำนวนมากกำลังทดลองทำเกมเดสก์ท็อปด้วย Electrobun
มันอาจเข้ามาแทนที่ Electron บางส่วนในตลาดเกมอินดี้บน Steam ได้
โดยเฉพาะประสบการณ์พัฒนาเกม TypeScript ที่ reload ทันที ด้วย
bun --watch game.tsนั้นเร็วและลื่นมากปัญหาหลักของ Tauri คือคุณภาพของ WebView ของระบบแตกต่างกันไปตามแต่ละ OS
บน Linux ไม่มี WebView ทางการ ส่วน Windows 7 หรือ Windows 10 รุ่นแรก ๆ ก็ไม่ได้ใช้ Edge WebView ความต่างพวกนี้ทำให้บางครั้งใช้เวลาเปิดเกิน 20 วินาที
เลยสงสัยว่าควรยอมรับ trade-off แบบนี้เพื่อประหยัด 100MB หรือไม่
ผู้ใช้ส่วนใหญ่ใช้อินเทอร์เน็ตเร็ว ดังนั้นความเร็วในการดาวน์โหลดจึงไม่ใช่ปัญหาใหญ่
เลยสงสัยว่า Electrobun รองรับ renderer แบบ Chromium ที่ฝังมาในตัว หรือไม่ แต่ในเอกสารก็ยังไม่ชัดเจน
น่าจะระบุในชื่อเรื่องให้ชัดว่านี่คือ บล็อกโพสต์ย้อนมองโปรเจ็กต์
ถ้าจะดูตัวโปรเจ็กต์จริง ๆ ไปที่ลิงก์เอกสารทางการน่าจะเหมาะกว่า
หน้าแรกของโปรเจ็กต์อยู่ที่นี่
อินเทอร์เฟซดูสะอาดดี และเพราะผมคุ้นกับ Zig จึงน่าจะเข้าถึงง่ายกว่า Rust
สัปดาห์นี้บริษัทของผมกำลังจะปล่อย แอป Electron ตัวใหม่ และก็อดคิดไม่ได้ว่า ถ้า Electrobun ออกมาเร็วกว่านี้สัก 1 ปีก็คงดี
Electron Builder ช่วยทำให้กระบวนการอัปเดตและการเซ็นง่ายขึ้นได้ระดับหนึ่ง แต่ก็ยังยุ่งยากอยู่ดี
ในโปรเจ็กต์ส่วนตัวครั้งหน้าคิดว่าจะลอง Electrobun
ในบทความพูดถึงปัญหาเรื่อง notarizing กับ stapling และถ้าไม่ใช้ Xcode ทาง Apple ก็ทำให้ขั้นตอนนี้ยุ่งยากมาก
ฝั่ง Windows ก็ทำ CI automation ได้ไม่ง่ายเช่นกัน ถ้า Electrobun มีทางออกที่ดีกว่า ผมสนใจมาก
notarize: trueก็พอผมเคยเซ็นและทำ notarization ด้วย Electrobun หลายครั้งแล้ว ไม่มีปัญหา และยังมี escape hatch สำหรับเคสซับซ้อนด้วย
ถ้าต้องการความช่วยเหลือ ส่ง DM มาใน Discord ได้เลย (ผมไม่ได้เกี่ยวข้องกับ Electrobun แต่เข้าใจดีถึงความทรมานของระบบ notarization ของ Apple)
ถ้าแอป Electron มีขนาดเกิน 500MB แล้ว ขนาด 14MB ของ Electrobun ก็ถือว่า เล็กมาก จริง ๆ
น่าเสียดายที่ distribution อื่นนอกจาก Ubuntu ยัง อยู่นอกขอบเขตการรองรับ ในตอนนี้
ดูการพูดคุยที่เกี่ยวข้องได้ในคอมเมนต์ของ issue