Blazor in F#?

หลังจากที่พยายามหาทางเขียน Blazor project ด้วย F# ล้วน ก็ทำได้แหละ แต่มีข้อเสียหลักๆอยู่ 3 ประเด็นคือ

  1. F# ไม่ support Hot Reload + compilation time ช้ากว่า C#
  2. Blazor based on Object-oriented design และ attribute ที่แปะอยู่บน derived classes แปลว่ามันยากที่จะเป็น pure function เหมือน React
    • ยกเว้นว่า หาวิธี dynamically generate class ตอน run ดูเข็นครกมาก
  3. วิธีการ Render component เหมือนกับ React คือ เป็น chain of function call แต่ไม่มีตัวช่วยแบบ JSX

ข้อ 2-3 นี่ยังพอหาวิธีแก้ไข/ทนได้ แต่ข้อ 1 นี่มีผลค่อนข้างมาก ถ้าต้อง recompile ตลอดเวลา เทียบกับ C# ที่ยังพอ Hot reload ได้ 30-40% ของเวลา Dev และเวลา compile ที่สั้นกว่า

ตัวอย่างอยู่ใน https://github.com/ruxo/Blazor8Fs

F# ผสม C#

อีกวิธีที่คนชอบพูดถึงกันคือผสม project ระหว่าง C#/F#

นั่นคือ ใช้ Blazor C# นั่นแหละ แต่แยก F# project ออกมา

ข้อดีของ Blazor คือ .razor page/component สามารถ แยกส่วน Razor ทิ้งไว้ใน C# แล้ว inherit class จาก F# มา วิธีนี้ข้อดีคือ สามารถใช้ F# เขียน logic ได้เกือบทั้งหมด และกับ Hot Reload แต่เพิ่มความสะดวกสบายในการเขียนหน้าเพจ

ข้อเสียเลยคือ Blazor 8 ถ้าเป็นถ้าผสม (ซึ่งเดิมเรียกว่า Hybridge แต่ 8 เรียกว่า Auto render mode) จะมี 2 C# projects และ ... ideally เลยต้องมี 2 F# projects และปัญหาอีกอย่างที่เจอคือ WebAssembly project ค่อนข้าง sensitive กับบาง library จะไม่สามารถทำให้มัน compile ได้ ... แอบรู้สึกว่ามีความยุ่งยากอยู่ลึกๆ

แต่เท่าที่ลองแยกออกมา อย่างน้อยก็ช่วยได้ในหน้า Page/Component

แต่ต้องมี adapter ในการแปลง F# types เพื่อให้มาใช้ในหน้าของ C# ได้สะดวกขึ้น

Blazor Frameworks for F#

มีอยู่หลายตัว แต่ตัวที่ดูแล้ว promising น่าใช้สุด ก็คือ https://fsbolero.io ถึงแม้มันจะเริ่มมาจาก Web assembly แต่มันสามารถ hosting Blazor server ได้ด้วย (แต่ Auto mode ดูไม่น่าทำได้)

แต่ความที่มันออกแบบมาให้เป็น Elm model (MVU) แอบไม่มั่นใจว่า ถ้าจะใช้แบบ MVVM จะยากมั้ย ไว้หาโอกาสลอง