เริ่มต้นจากความอยากได้ Framework Web UI แบบ Pure Python อย่าง 'Violit' ที่คงความใช้งานง่ายแบบ Streamlit แต่เพิ่มประสิทธิภาพเข้าไป
(github.com/violit-dev)สวัสดีครับ
ช่วงนี้หลังเลิกงานและในวันหยุดสุดสัปดาห์ ผมเป็นนักพัฒนาที่ทำโอเพนซอร์สเป็นงานอดิเรกครับ
โดยส่วนตัวผมชอบไวยากรณ์ที่เข้าใจง่ายของ Streamlit มาก และก็รู้ด้วยว่าเพื่อน ๆ รอบตัวที่เป็นนักวิจัยด้าน AI/Data หลายคนก็ใช้งานมันอยู่เยอะเหมือนกัน แต่ผมก็มักเห็นว่าพอโปรเจกต์เริ่มใหญ่ขึ้น ผู้คนต้องเจอกับปัญหาเรื่องประสิทธิภาพอยู่บ่อย ๆ ผมเลยเคยแนะนำ NiceGUI เป็นทางเลือก แต่หลายคนก็ค่อนข้างปรับตัวกับไวยากรณ์ของมันได้ยากอยู่บ้าง (ตอนแรก NiceGUI เหมือนจะถูกสร้างขึ้นโดยบริษัทแห่งหนึ่งในเยอรมนีเพื่อใช้ภายในบริษัทเอง.. แต่ผมคิดว่ามันเป็น Framework ที่ทำออกมาได้ดีมากจริง ๆ)
อีกอย่างหนึ่งคือ เวลานำเสนอ Data ผมคิดว่าเรื่อง "ความสวยงาม" สำคัญมากเช่นกัน แต่ผมก็พบว่าด้วย GUI Framework ที่อิงกับ Python แบบเดิม ๆ การทำให้มันดูสวยนั้นแอบยากกว่าที่คิด โดยเฉพาะข้อจำกัดใหญ่ของ NiceGUI คือการหลุดออกจาก Material Design ของ Quasar ทำได้ไม่ง่ายนัก
เพราะแบบนี้เอง ผมจึงลงมือสร้าง Violit ขึ้นมาโดยตั้งเป้าให้เป็น "เครื่องมือที่ใช้งานง่ายแบบ Streamlit แต่เร็วกว่าและจัดสไตล์ได้สะดวก" โดยมี FastAPI และ shoelace(Lit) เป็นรากฐานหลักของสถาปัตยกรรม จุดเด่นสำคัญมีดังนี้
💜 จุดเด่นหลักของ Violit
- ใช้งานเข้าใจง่ายคล้าย Streamlit ถึง 90%
- หากเคยใช้ Streamlit มาก่อน ก็สามารถเริ่มใช้งานได้แทบจะทันทีโดยแทบไม่มี learning curve เพราะเราออกแบบ API ให้เข้าใจง่าย
- O(1) Reactivity & Clean Syntax
- ไม่เหมือน Streamlit ที่แค่กดปุ่มหนึ่งครั้งก็ต้องรันสคริปต์ทั้งหมดใหม่อีกครั้ง (No Re-run)
- แม้ไม่มี optimization decorator อย่าง
@st.cacheก็ยังจัดการ state ได้อย่างรวดเร็วและกระชับ ด้วยการประกาศตัวแปร(state) แบบเรียบง่ายเท่านั้น (อ้างอิงแนวคิด signal ของ solid.js)
- Easy Theming System
- ตอนนี้รองรับ preset theme ราว 30 แบบ ทำให้สามารถใส่ UI ที่สวยงามได้ทันที
- ในเร็ว ๆ นี้มีแผนอัปเดตฟีเจอร์ให้ผู้ใช้สามารถปรับแต่ง theme ได้ด้วยตัวเอง
- Hybrid Engine & Multi-Platform
- มีเอนจินที่ยืดหยุ่น รองรับทั้งโหมด Lite ที่ใช้ HTMX และโหมด WebSocket ตามที่ผู้ใช้เลือกได้ ตอนแรกอาจยังดูไม่มีปัญหา.. แต่ผมคิดว่าในอนาคตเมื่อมีผู้ใช้จำนวนมาก WebSocket อาจกลายเป็นคอขวดจนทำให้ช้าลงได้
- สามารถสลับระหว่างโหมด Web service และแอป Desktop (
pywebview) ได้อย่างอิสระโดยไม่ต้องแก้โค้ด
ผมเองก็ยังไม่รู้ว่าโปรเจกต์นี้จะขยายไปได้ไกลแค่ไหน แต่ก็แอบคาดหวังว่า ถ้าขัดเกลาให้ดี มันน่าจะช่วยให้เราสร้างบริการระดับ MVP ที่เดิมทีอาจทำด้วย Django หรือ RoR ได้เร็วขึ้นมาก โดยใช้ Python เพียงอย่างเดียว เพื่อแสดงให้เห็นถึงความเป็นไปได้นั้น ผมจึงใส่ตัวอย่างโค้ดสำหรับสร้าง Blog ด้วย Violit เอาไว้ด้วย
ตอนนี้ยังอยู่ในช่วงเริ่มต้นมาก ๆ ที่เวอร์ชัน v0.0.4 (PoC) แต่ก็ได้รับกระแสตอบรับค่อนข้างดีจาก Reddit และที่อื่น ๆ และภายใน 2 สัปดาห์หลังเปิดเผยโปรเจกต์ก็มีดาวเกิน 200 แล้ว เลยขอรวบรวมความกล้ามาแชร์ที่นี่ด้วย ตลอดมาผมแทบจะทำงานพัฒนาซอฟต์แวร์เพื่อภารกิจในบริษัทเป็นหลัก.. และนี่ก็เป็นโปรเจกต์โอเพนซอร์สแบบเปิดเต็มรูปแบบครั้งแรกของผมด้วย สำหรับผมเอง มันทำให้ได้สัมผัสกับความสนุกของการพัฒนาซอฟต์แวร์แบบล้วน ๆ อย่างมากจริง ๆ
ถ้ามีโอกาสต้องสร้าง Web UI หรืออะไรทำนองนั้นด้วย Python รบกวนลองแวะมาดูกันได้ครับ.. :)
- GitHub Repo. : https://github.com/violit-dev/violit
- README ภาษาเกาหลี : https://github.com/violit-dev/violit/blob/main/README_KOR.md
- ตัวอย่าง Blog : https://github.com/violit-dev/violit/…
16 ความคิดเห็น
ขอเป็นกำลังใจให้อย่างเต็มที่
ขอบคุณสำหรับกำลังใจมาก ๆ ครับ :) จะตั้งใจอัปเดตต่อไปอย่างสนุกและเต็มที่ครับ รู้สึกมีความสุขมากครับ
เมื่อไม่นานมานี้ผมได้ลองทำระบบอัตโนมัติงานด้วย PyWebView ดูครับ เพราะเป็นเดสก์ท็อปเลยกังวลว่าจะจัดการส่วนเว็บอย่างไรดี....ถ้าใช้สิ่งนี้ใน PyWebView จะทำให้ใช้งานบนเว็บได้ง่ายด้วยไหมครับ?
สิ่งที่พัฒนาด้วย pywebview จะสามารถย้ายมาเป็นเว็บไซต์ได้อย่างง่ายดายโดยใช้ violit หรือไม่?
ดูเหมือนว่าคำถามของผมอาจจะยังไม่เฉพาะเจาะจงพอ เลยขอถามใหม่อีกครั้งครับ
ตอนนี้ผมกำลังสร้างและใช้งานเดสก์ท็อปแอปด้วย
pywebviewอยู่ครับเห็นว่า Violit รองรับมัลติแพลตฟอร์มทั้ง web/desktop (
pywebview) เลยสนใจขึ้นมาครับpywebviewเดิม ไปเป็นโครงสร้างของ Violit แบบ migration ในทางปฏิบัติแล้วทำได้ง่ายพอสมควรไหมครับ?เลยอยากทราบว่าในระดับบริการจริง สถาปัตยกรรมนี้ออกแบบมาให้คง codebase เดียวกันไว้ แล้วขยายไปเป็นเว็บเซอร์วิสได้จริงหรือไม่ครับ (ในมุมของโครงสร้างการ deploy จาก
pywebview→ web)สวัสดีครับ/ค่ะ ความยากในการย้ายระบบจะแตกต่างกันมากตามโครงสร้างของแอปเดิมที่คุณสร้างไว้
ถ้าแอปเดิมถูกพัฒนามาโดยไม่มีเว็บเซิร์ฟเวอร์แยกต่างหาก (เช่น FastAPI) และทำงานด้วยแค่
pywebviewjs api หรือวิธีโหลด HTML ในเครื่องเท่านั้น ถ้าจะนำไป deploy บนเว็บก็จำเป็นต้องเขียนชั้นการสื่อสารใหม่ตั้งแต่ต้น ดังนั้นโค้ดที่เขียนด้วยpywebviewแบบง่าย ๆ อาจจะเปลี่ยนเป็นเว็บได้โดยตรงค่อนข้างยากส่วนนี้มองว่าไม่ได้เกี่ยวกับ violit โดยตรง จะเข้าใจว่าแทนที่ violit จะมาเปลี่ยนแอปเดิมที่สร้างด้วย
pywebviewหากสร้างด้วย violit ตั้งแต่แรก มันจะถูกออกแบบมาให้รองรับทั้ง web และpywebview(desktop) ไปพร้อมกันอยู่แล้วจะใกล้เคียงกว่าครับ/ค่ะขอบคุณครับ
ผมได้เตรียมหน้าเว็บเดโมและ Documentation ที่สามารถลองใช้งานได้ทันทีไว้ด้านล่างแล้วครับ
คิดว่าน่าจะดีถ้าลองเข้าไปดูกันสักครั้ง :)
และขอแจ้งไว้ว่าเว็บไซต์ทั้งสองแห่งนี้สร้างด้วย Violit ทั้งหมด
ขอบคุณครับ กำลังคิดอยู่เหมือนกันว่าจะลองเอาไปใช้กับงานในบริษัทดู.!!
ครับ ขอบคุณมากครับ ลองใช้งานดูได้เลย และถ้ามีส่วนไหนที่ใช้งานไม่สะดวกก็บอกมาได้ครับ
ดูเหมือนว่ายังจำเป็นต้องเสริมทั้งโค้ดทดสอบและเอกสารประกอบอีกพอสมควรครับ
ผมได้เตรียมหน้าเว็บเดโมและ Documentation ที่สามารถลองใช้งานได้ทันทีไว้ด้านล่างแล้ว
ลองเข้าไปดูกันได้เลยครับ :)
สำหรับข้อมูลเพิ่มเติม เว็บไซต์ทั้งสองแห่งนี้สร้างด้วย Violit ทั้งหมด
ครับ ขอบคุณสำหรับคำติชมที่ดีมาก ตอนนี้การพัฒนาอยู่ในระดับ POC จึงยังมี breaking changes เยอะทั้งในระดับ public interface และ design ดังนั้นแผนตอนนี้คือจะเริ่มใส่โค้ดทดสอบตั้งแต่เวอร์ชัน 0.5 เป็นต้นไป
อย่างที่คุณบอก ตอนนี้เรากำลังเร่งเปิดโฮมเพจและจัดทำ documentation เป็นลำดับแรก คิดว่าน่าจะเปิดได้เร็ว ๆ นี้ครับ อย่างไรก็ตาม เป้าหมายแรกคือผู้ใช้ streamlit เดิมอยู่แล้ว จึงรู้สึกว่าความจำเป็นในการทำเอกสารค่อนข้างน้อยไปบ้าง เพราะไวยากรณ์แทบจะเหมือนกันเลย
รบกวนรออีกนิดนะครับ~
น่าจะดีถ้ามีหน้าเว็บเดโมให้ลองใช้งานได้ทันที
ผมได้เตรียมหน้าเว็บเดโมที่สามารถลองใช้งานได้ทันที พร้อม Documentation ไว้เรียบร้อยแล้วครับ
ลองเข้าไปดูกันได้เลยครับ :)
เพิ่มเติมคือ ทั้งสองเว็บไซต์นี้สร้างด้วย Violit ทั้งหมดครับ
ครับ/ค่ะ ขอบคุณสำหรับความเห็นดี ๆ มากครับ/ค่ะ ตอนนี้ยังเป็นเวอร์ชันเริ่มต้นเลยยังไม่มีโฮมเพจ แต่ถ้าทำโฮมเพจขึ้นมาเมื่อไร ก็น่าจะได้ลองใช้ widget หลากหลายแบบบนเว็บกันได้ครับ/ค่ะ ที่สำคัญ ตอนนี้กำลังค่อย ๆ ปรับการออกแบบเพื่อเน้นให้สามารถสร้างหน้าตาออกมาได้สวยกว่าทางเลือกอื่น ๆ อยู่ครับ/ค่ะ :)