- ไมโครเฟรมเวิร์ก HTML แบบมินิมัลลิสต์ที่ช่วยให้สร้างเว็บยูสเซอร์อินเทอร์เฟซแบบโมดูลาร์และไดนามิกได้ด้วยวิธีที่เรียบง่ายเหมือน plain HTML
- ทำงานเพียงอย่างเดียวเท่านั้น: สามารถโหลดทรัพยากร HTML จากทุกองค์ประกอบบนหน้าได้
- ทำให้สามารถแทนที่ชิ้นส่วนของหน้าได้ โดยเปิดทางให้อัปเดตเฉพาะบางส่วนของหน้าเท่านั้น
- มีขนาดรวมเพียง 166 ไบต์ ใช้แค่ HTML ล้วน ไม่มี dependency และไม่ต้องใช้ JS bundle, แบ็กเอนด์, แอททริบิวต์พิเศษ, DSL หรือ custom element
- ใช้การโต้ตอบกับ DOM จริง โดยไม่ใช้ VDOM, click listener, AJAX,
fetch เป็นต้น
- แค่เพิ่ม inline HTML snippet ที่เป็น iframe ก็เสร็จ
<iframe hidden name=htmz onload="setTimeout(()=>document.querySelector(this.contentWindow.location.hash||null)?.replaceWith(...this.contentDocument.body.childNodes))"></iframe>
วิธีใช้งานพื้นฐาน
- การใช้ htmz ต้องมีไฮเปอร์ลิงก์ (หรือ form) ที่มีแอททริบิวต์
href ซึ่งชี้ไปยัง URL ของทรัพยากร (หรือ action ของ form) และมีตัวเลือก ID ปลายทาง
- แม้จะดูเหมือนเป็นการนำ URL fragment มาใช้ซ้ำเป็นตัวเลือก ID ปลายทาง แต่ในบริบทนี้ URL fragment ไม่ได้ถูกใช้เพื่อจุดประสงค์อื่น จึงสามารถนำกลับมาใช้ได้
มันทำอะไรแน่?
- htmz มอบความสามารถเพียงอย่างเดียวคือทำให้สามารถโหลดทรัพยากร HTML ภายในองค์ประกอบใดก็ได้บนหน้า
- แนวคิดนี้ไม่ใช่เรื่องใหม่ และการแบ่งเว็บเพจออกเป็นส่วนที่รีโหลดได้อย่างอิสระก็มีมาตั้งแต่ช่วงกลางทศวรรษ 1990
- htmz คือการทำให้ HTML frame เป็นแนวคิดทั่วไปขึ้น โดยสามารถโหลดทรัพยากร HTML ได้จากองค์ประกอบใดก็ได้ในหน้า
การใช้งานขั้นสูง
- ปัจจุบันใน HTML5 มีเพียงองค์ประกอบ
<a> และ <form> เท่านั้นที่สามารถระบุและเรียกใช้ htmz เป็นเป้าหมายได้
- สามารถใช้องค์ประกอบ
<base> เพื่อกำหนดให้ htmz เป็นเป้าหมายเริ่มต้นสำหรับลิงก์แบบ relative ทั้งหมดได้
- หากต้องการใช้ค่า target จริง ผู้ใช้สามารถใช้แฮ็กที่เขียนตัวเลือก ID ปลายทางลงในแอททริบิวต์
target ได้โดยตรง
สคริปต์ / การโต้ตอบ
- หากต้องการการโต้ตอบมากขึ้น ก็สามารถใช้ JavaScript ซึ่งเป็นภาษาสคริปต์คู่หูของ htmz ได้
- htmz ไม่ได้กีดกันการเขียน JS หรือการใช้ไลบรารี UI และยังคงสามารถส่งค่าฟอร์มด้วยฟอร์ม HTTP ปกติผ่าน htmz ได้
การขยายความสามารถ
- หากต้องการตัวเลือกขั้นสูง การจัดการข้อผิดพลาด หรือหลายเป้าหมาย นักพัฒนาสามารถขยายเพิ่มได้ตามต้องการ
FAQ
- htmz คือ iframe ที่มีชื่อว่า
htmz และทำงานโดยเรียก htmz ผ่านการโหลด URL ด้วย iframe
- htmz ทำหน้าที่เป็น proxy target โดยส่งต่อการตอบกลับไปยังเป้าหมายที่ระบุไว้
- htmz ไม่ได้ parse DOM อย่างต่อเนื่อง ไม่ค้นหาแอททริบิวต์หรือไวยากรณ์พิเศษ และไม่ผูก listener เข้ากับ DOM
- htmz เป็น HTML microframework ที่ใช้ JS เพียงเล็กน้อยที่สุด
- htmz เป็น snippet และย่อมาจาก 'Html with Targeted Manipulation Zones'
- โปรเจกต์นี้เริ่มต้นขึ้นจากการตอบสนองต่อ htmx และเป็นการทดลองว่าเราจะทำฟังก์ชันแบบ load-link-target บนเว็บยุคปัจจุบันได้โดยไม่ใช้ htmx หรือไม่
- แม้ htmz จะมีขนาดเล็กมาก แต่ก็ให้ความรู้สึกทรงพลัง โดยข้อจำกัดหลักคือหนึ่งการตอบกลับจะมีปลายทางได้เพียงหนึ่งเดียว
ความเห็นของ GN⁺
- แนวทางที่น่าสนใจ: htmz นำเสนอแนวทางที่ช่วยลดความซับซ้อนของเฟรมเวิร์กในการพัฒนาเว็บ และใช้ HTML ล้วนในการสร้างเว็บอินเทอร์เฟซ นั่นทำให้การพัฒนาเว็บเข้าถึงได้ง่ายแม้สำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้น
- ความสมดุลระหว่างประสิทธิภาพกับความเรียบง่าย: ขนาดที่เบามากเพียง 166 ไบต์และโครงสร้างที่ไม่มี dependency สามารถช่วยยกระดับประสิทธิภาพของเว็บเพจได้อย่างมาก อีกทั้งยังให้ความเรียบง่ายที่ทำให้สร้างเว็บเพจที่มีประสิทธิผลได้โดยไม่ต้องเรียนรู้เฟรมเวิร์ก JavaScript ที่ซับซ้อน
- อนาคตของการพัฒนาเว็บ: htmz มอบมุมมองที่น่าสนใจต่ออนาคตของการพัฒนาเว็บ โดยแสดงให้เห็นว่าวิวัฒนาการของมาตรฐานและเทคโนโลยีเว็บสามารถมอบเครื่องมือที่เรียบง่ายและมีประสิทธิภาพยิ่งขึ้นให้แก่นักพัฒนาได้อย่างไร
3 ความคิดเห็น
ว้าว อันนี้แหวกแนวดีนะครับ 555 ในลิงก์เขาบอกว่าตัวเองไม่ใช่ทั้งไลบรารีหรือเฟรมเวิร์ก เป็นแค่ snippet เฉยๆ... ฮ่า
การใช้งานขั้นสูง: ใน HTML5 ปัจจุบัน ดูเหมือนว่าจะมีเพียงองค์ประกอบ <a> และ <form> เท่านั้น -> ใน HTML5 ปัจจุบัน มีเพียงองค์ประกอบ
<a>และ<form>เท่านั้นดูเหมือนว่ายังไม่ได้ใช้การ escape HTML
ความคิดเห็นบน Hacker News
สรุปความคิดเห็นแรก:
สรุปความคิดเห็นที่สอง:
สรุปความคิดเห็นที่สาม:
สรุปความคิดเห็นที่สี่:
สรุปความคิดเห็นที่ห้า:
สรุปความคิดเห็นที่หก:
this.ออกจาก inline event listener เพื่อให้ขนาดโค้ดเล็กลงได้อีกสรุปความคิดเห็นที่เจ็ด:
targetอาจไม่เสื่อมสภาพอย่างสง่างามแบบ htmx เมื่อปิดใช้งาน JSสรุปความคิดเห็นที่แปด:
<slot>มาใช้ซ้ำในลักษณะนี้เป็นไอเดียที่ไม่ดี<slot>มีพฤติกรรมที่เฉพาะเจาะจงมาก และไม่ว่าไลบรารีจะทำอะไร มันจะถูกแทนที่ด้วยลูกของ host element<output>อยู่แล้วสรุปความคิดเห็นที่เก้า:
สรุปความคิดเห็นที่สิบ: