- เพิ่มเพียง ความสามารถเชิง reactive, เทมเพลตแบบ declarative และ boilerplate ขั้นต่ำ บนมาตรฐานเว็บคอมโพเนนต์
- มีขนาดเล็กเพียง 5KB พร้อม การเรนเดอร์ที่รวดเร็ว และอัปเดตเฉพาะส่วนของ UI ที่เปลี่ยนแปลงเพื่อเพิ่มประสิทธิภาพและความเร็วในการโหลด
- คอมโพเนนต์ Lit ทุกตัวเป็น Native Web Component และนำกลับมาใช้ซ้ำได้ทุกที่ที่ใช้ HTML ได้ โดยไม่ขึ้นกับเฟรมเวิร์ก
- ใช้ Shadow DOM เพื่อจำกัดขอบเขตของสไตล์โดยค่าเริ่มต้น ทำให้ CSS selector เรียบง่ายขึ้นและป้องกันการชนกับสไตล์อื่น
- ใช้ Reactive Property ในการโมเดล API ของคอมโพเนนต์และสถานะภายใน พร้อมรองรับการ re-render อย่างมีประสิทธิภาพเมื่อพร็อพเพอร์ตีเปลี่ยน
- เทมเพลตที่อิงกับ Tagged template Literals ทำให้รวดเร็วและเรียบง่าย
- ใช้งานได้ในหลากหลายโปรเจกต์เว็บ ตั้งแต่คอมโพเนนต์ที่ใช้ร่วมกัน, ระบบดีไซน์ ไปจนถึงการสร้างทั้งแอปโดยลด vendor lock-in และเสริมความสามารถในการบำรุงรักษา
- มี บทช่วยสอน ให้ใช้งาน
- GitHub
4 ความคิดเห็น
รู้สึกแบบนี้มาตั้งแต่ 3 ปีก่อนว่า มันทั้งเร็วสำหรับเอา vanilla web components มาใช้ตรง ๆ และก็ให้ความรู้สึกเหมือนเป็นเฟรมเวิร์กช่วงรอยต่อ แต่ก็ช้า..
หมายความว่าอะไร?
ผมกำลังพัฒนาเครื่องมือสำหรับงานปฏิบัติการโดยใช้แค่ web standard อย่าง web component และ lit-html เท่านั้น ซึ่งข้อดีคือมีข้อมูลที่ต้องรู้ให้น้อยที่สุด ใน lit-html ฟีเจอร์ที่ใช้อยู่ก็มีแค่ event handler binding กับ loop templating ประมาณนั้นเอง (ที่เหลือแค่ระดับ web standard ก็เพียงพอแล้ว..) แม้จะมีความไม่สะดวกตรงที่ถ้ามีการเปลี่ยนแปลงต้องเรียก
renderเองโดยตรง แต่ในอีกมุมหนึ่ง การเรียกแบบชัดเจนก็มีข้อดีมากกว่าการตรวจจับการเปลี่ยนแปลงตัวแปรอัตโนมัติแล้วเกิดพฤติกรรมที่ไม่ชัดเจนได้เหมือนกัน เพราะเป็นเครื่องมือสำหรับงานปฏิบัติการ การรองรับสภาพแวดล้อมที่หลากหลายจึงมีลำดับความสำคัญค่อนข้างต่ำ เลยอาจจะทำให้ผมรู้สึกแบบนั้นก็ได้ความเห็นจาก Hacker News
ตอนนั้นก็ใช้ เฟรมเวิร์กที่หนักอยู่แล้ว แต่มีคนเพิ่ม Lit เข้ามาเพราะอยากมีอีกหนึ่งบรรทัดไว้ใส่ในเรซูเม่ ซึ่งกลายเป็นภาระก้อนใหญ่
โดยเฉพาะ Shadow DOM ที่ทำให้ปัญหา การเข้าถึง (A11y) หนักขึ้นกว่าเดิม เพราะขอบเขตของ id ถูกแยกออก ทำให้การเชื่อมอย่าง label-for, describe-by พังหมด จนต้องปวดหัวกันมาก
แน่นอนว่าส่วนหนึ่งก็เป็นปัญหาเรื่อง ทักษะของทีมยังไม่พอ ด้วย
แม้สไตล์จะถูก scope เอาไว้ แต่ส่วนสำคัญอย่างขนาดฟอนต์กลับเป็นข้อยกเว้น เลยมี บั๊กถดถอย เล็ก ๆ โผล่มาตลอดทุกครั้งที่เปลี่ยนแทน
DX ก็แย่ลงเยอะ หวังว่า tooling จะดีขึ้น แต่ตอนนี้คือเหนื่อยมาก
เอาเข้าจริง ดูเหมือนว่าจะเป็นกรณีที่แค่อยาก ลองของใหม่ แล้วนำมาใช้โดยไม่ต้องหาเหตุผลมารองรับมากกว่า
มันทำงานได้ดีเมื่อคอมโพเนนต์ที่ซ้อนกันในแอปที่ซับซ้อนต้องโต้ตอบกัน และถึงจะคล้าย React แต่ก็ เป็น native ของเบราว์เซอร์ มากกว่า มี boilerplate น้อยกว่า และเรนเดอร์ได้เร็วกว่า
ถึงขั้นไม่เข้าใจเลยว่าทำไม Lit ถึงไม่ดังมากกว่านี้
ความสามารถหลักนั้นเรียบง่ายกว่าที่คิด และส่วนใหญ่พึ่งพา Platform API
เพราะแบบนี้ใคร ๆ ก็เขียนเองได้ และผมคิดว่าความเรียบง่ายแบบนี้มีคุณค่ามาก
เผื่ออ้างอิง implementation ทดแทนที่ผมทำไว้คือ https://github.com/ruphin/lite-html
lit-htmlมีประโยชน์มากจนผมใช้กับแทบทุกโปรเจกต์ส่วนตัวการที่เรียกผ่าน CDN ได้เลยและทดลองได้โดยไม่ต้องมี build step ก็เป็นข้อดีมาก
มันไม่ได้หนักแบบเฟรมเวิร์กอื่น ๆ และให้ความรู้สึกเหมือนใช้ Vanilla JS + HTML ตรง ๆ เลย จึงแทบไม่มีภาระทางความคิด
โดยพื้นฐานแล้ว Shadow DOM คือ ต้นไม้แบบ private ที่แยก DOM ภายในคอมโพเนนต์ออกมา
สิ่งนี้ทำให้แนวคิด slot เกิดขึ้นได้ และทำให้สร้างคอมโพเนนต์ที่ประกอบรวมกันได้จริง
ปัญหาคือการห่อหุ้มสไตล์กลายเป็นอุปสรรคใหญ่เวลาเอาไปผสานกับระบบเดิม
เพราะงั้นผมจึงเสนอแนวคิด Open Styleable Shadow Roots ซึ่งเป็นวิธีให้สไตล์จากภายนอกไหลเข้ามาข้างในได้โดยยังคง slot เอาไว้ ตอนนี้ยังอยู่ระหว่างพยายามโน้มน้าว browser vendor ต่าง ๆ
ผมเคยเขียนเรื่องนี้ไว้ด้วย: https://medium.com/gitconnected/getting-started-with-web-com...
บางทีก็อดสงสัยไม่ได้ว่าทำไมมันยังไม่ถูกใช้อย่างแพร่หลายกว่านี้
เดิมทีใช้ Backbone.js เป็นฐาน แล้วค่อย ๆ เปลี่ยนทีละขั้นจาก lit-html → lit-element → lit
ตอนนี้มันถูกแจกจ่ายเป็นเว็บคอมโพเนนต์ชื่อ
<converse-root />จึงผสานกับเฟรมเวิร์กอื่นอย่าง React ได้ดีGitHub: https://github.com/conversejs/converse.js / เดโม: https://chat.conversejs.org/
ถ้าใช้ระบบเทมเพลตอย่าง JSX ฝั่งเซิร์ฟเวอร์ก็เพียงพอแล้ว และฝั่งไคลเอนต์ก็เป็นแค่ JS เลยไม่ต้องกังวลเรื่องอัปเกรด
เพียงแต่ Native API นั้น low-level เกินไป ทำให้ DX ไม่ดี และ Lit ก็เข้ามาวาง reactivity แบบประกาศได้ไว้ด้านบน
มันแก้ส่วนที่ถ้าทำเองจะน่ารำคาญได้อย่างเรียบร้อย
htmlของ Lit กับ JSXกลับกัน JSX ยังต้องมี ขั้นตอนคอมไพล์ จึงยุ่งยากกว่าอีก
ตอนแรกสร้าง Web Components เองในสภาพแวดล้อมที่ไม่มี dependency แต่พอย้ายมาใช้ LitElement แล้วสะดวกกว่ามาก
แต่อย่างไรก็ตาม Shadow DOM แม้จะเป็นค่าเริ่มต้น แต่บางทีก็สร้างปัญหาเพิ่มเสียมากกว่า ตอนนี้เลยใช้ LitElement แบบไม่มี Shadow DOM
ข้อดีใหญ่ที่สุดคือมันอยู่บน รากฐานที่มั่นคง
เพราะ Native Web Components รองรับได้เสถียรในทุกเบราว์เซอร์ จึงโฟกัสกับการพัฒนาได้โดยไม่ต้องเสี่ยงกับการเปลี่ยนเฟรมเวิร์ก
อยากให้มีทีมมาลองใช้กันมากกว่านี้
อนึ่ง ขอแนะนำ วิดีโอ HTTP 203 เกี่ยวกับ Lit ด้วย
Angular หนักเกินไป ส่วน React ก็ถูกออกแบบมาตามข้อจำกัดของเบราว์เซอร์ยุคเก่า จนตอนนี้เหมือนเหลืออยู่เพราะ แรงเฉื่อย เท่านั้น
เมื่อเทียบกับ boilerplate ของ Angular หรือความซับซ้อนของ hooks ใน React แล้ว มันตรงไปตรงมากว่ามาก
แต่น่าเสียดายที่มันไม่ได้รับความนิยม
เอาจริง ๆ แค่จับคู่
+ Web Componentsก็เพียงพอแล้วแต่ก็สงสัยว่าการเขียนใหม่ด้วย Lit แทน Vue จะมีข้อดีอะไร
การจัดการสถานะด้วย ref/reactive ของ Vue 3 นั้นทรงพลัง และทดสอบได้โดยไม่ต้องพึ่ง DOM
reactivity ของ Lit อยู่ในระดับวิดเจ็ต จึงต้องจัดการตัวกระตุ้นการอัปเดตเอง
ส่วน Vue มี lifecycle ที่เรียบง่าย แต่ Lit ต้องคอยใส่ใจ callback หลายตัว จึงเกิดบั๊กได้ง่ายกว่า
ถ้าไม่มีเหตุผลพิเศษ ก็ควรโฟกัสที่ การพัฒนาฟีเจอร์ มากกว่า และการเปลี่ยน tech stack ก็แทบไม่ส่งผลกับผู้ใช้เลย
Vue เป็นเฟรมเวิร์กจึงมีความสามารถมากกว่า ส่วน Lit นั้น implement ใกล้กับ Native API มากกว่า
Vue ต้อง build แต่ Lit สามารถ โหลดตอน runtime ได้
Vue คอมไพล์ไปยังเป้าหมายอื่นได้ด้วย แต่ Lit เน้นสำหรับ Web Components โดยเฉพาะ จึงดูสะอาดกว่า
สุดท้ายแล้วสิ่งสำคัญที่สุดคือใช้เทคโนโลยีที่ทีมคุ้นเคยมากกว่า
ผู้ใช้งานไม่ได้สนใจรายละเอียดภายใน สนใจแค่ขนาดกับ API เท่านั้น
ไม่ว่าอย่างไรคนอื่นก็จะสร้าง adapter ให้เข้ากับสภาพแวดล้อมของตัวเองอยู่ดี