Hotwire เป็นหัวข้อร้อนแรงในขณะนี้สำหรับนักพัฒนา Rails ทุกคน หากคุณร่วมงานกับ Rails ก็มีโอกาสที่ดีที่คุณจะได้ยินเรื่องนี้มามากมาย
Hotwire เป็นวิธีใหม่ในการเพิ่มการโต้ตอบให้กับแอปของคุณโดยใช้โค้ดเพียงไม่กี่บรรทัด และทำงานได้อย่างรวดเร็วด้วยการส่ง HTML ผ่านสาย นั่นหมายความว่าคุณสามารถรักษามือของคุณให้สะอาดจากเฟรมเวิร์ก Single Page Applications (SPA) ส่วนใหญ่ได้ คุณยังสามารถรักษาตรรกะการเรนเดอร์ของคุณไว้ที่ศูนย์กลางบนเซิร์ฟเวอร์ ในขณะที่ยังคงรักษาเวลาในการโหลดเพจและการโต้ตอบที่รวดเร็ว
ในโพสต์นี้ เราจะดูส่วนประกอบหลักของ Hotwire และวิธีใช้ในแอป Rails ของคุณ แต่ก่อนอื่น:Hotwire คืออะไร และเหตุใดคุณจึงควรใช้มัน
ฮอตไวร์คืออะไร?
Hotwire ไม่ใช่ไลบรารีเดียว แต่เป็นแนวทางใหม่ในการสร้างเว็บและแอปพลิเคชันมือถือโดยการส่ง HTML ผ่านสาย ซึ่งรวมถึง Turbo, Stimulus และ Strada (จะมาในปลายปีนี้) เราจะหารือแต่ละสิ่งเหล่านี้โดยละเอียดในหัวข้อถัดไป
หมายเหตุด้านข้าง :แม้ว่า Hotwire จะเชื่อมโยงกับ Rails อย่างมาก แต่ก็ไม่เชื่อเรื่องภาษาอย่างสมบูรณ์ ดังนั้นจึงสามารถทำงานได้เช่นเดียวกับแอปพลิเคชันอื่นๆ ฉันใช้ Stimulus ในการผลิตกับแอปที่ไม่ใช่ Rails หลายตัวและเว็บไซต์คงที่บางแห่ง คุณสามารถใช้ Turbo แบบไม่มี Rails ได้เช่นกัน
แต่ให้เรากลับมาที่โลก Rails ในตอนนี้
เหตุใดจึงต้องใช้ Hotwire ในแอป Rails ของคุณ
แล้วคุณควรใช้ Hotwire เมื่อใด? คำตอบคือทุกที่ที่คุณต้องการเพิ่มการโต้ตอบให้กับแอปพลิเคชันของคุณ ตัวอย่างเช่น หากคุณต้องการ:
- เนื้อหาบางส่วนที่จะแสดง/ซ่อนตามเงื่อนไขตามการโต้ตอบของผู้ใช้ (เช่น แบบฟอร์มที่อยู่ที่รายการรัฐเปลี่ยนแปลงโดยอัตโนมัติตามประเทศที่เลือก)
- เพื่ออัปเดตเนื้อหาบางส่วนแบบเรียลไทม์ (เช่น ฟีด เช่น Twitter ซึ่งทวีตใหม่จะถูกเพิ่มลงในเพจโดยอัตโนมัติ)
- หากต้องการโหลดบางส่วนของหน้าของคุณแบบ Lazy Loading (เช่น ภายในหีบเพลง คุณสามารถโหลดชื่อและทำเครื่องหมายรายละเอียดให้โหลดแบบ Lazy Loaded เพื่อเพิ่มความเร็วในการโหลด)
ส่วนประกอบ Hotwire
ดังที่ได้กล่าวไว้ก่อนหน้านี้ Hotwire คือชุดของเทคนิคใหม่ (และเก่าบางส่วน) สำหรับการสร้างเว็บแอป
เราจะมาพูดคุยกันในหัวข้อต่อไปนี้กัน
เทอร์โบ
HTML ขับเคลื่อน Turbo ที่แกนหลัก Turbo มีเทคนิคหลายประการในการจัดการข้อมูล HTML ที่มาจากสายและแสดงข้อมูลบนแอปพลิเคชันของคุณโดยไม่ต้องโหลดซ้ำทั้งหน้า ประกอบด้วย:
-
เทอร์โบไดรฟ์ ป>
หากคุณเคยใช้ Turbolinks มาก่อน คุณจะรู้สึกเหมือนอยู่บ้านด้วย Turbo Drive โดยที่แกนหลักคือ โค้ด JS บางส่วนจะดักจับเหตุการณ์ JavaScript ในแอปพลิเคชันของคุณ โหลด HTML แบบอะซิงโครนัส และแทนที่ส่วนของมาร์กอัป HTML ของคุณ
-
เฟรมเทอร์โบ ป>
Turbo Frames แยกส่วนของมาร์กอัปของคุณออกเป็นส่วนต่างๆ ที่สามารถโหลดได้อย่างอิสระ
ตัวอย่างเช่น หากคุณมีแอปพลิเคชันบล็อก เนื้อหาของโพสต์และความคิดเห็นจะเป็นสองส่วนที่เกี่ยวข้องกันแต่เป็นอิสระจากเพจ คุณสามารถแยกส่วนทั้งสองออกเพื่อให้การนำทางทำงานแยกจากกัน หรือแม้แต่โหลดส่วนเหล่านั้นแบบอะซิงโครนัสด้วยเฟรมเทอร์โบ
-
สตรีมเทอร์โบ ป>
Turbo Streams นำเสนอยูทิลิตี้เพื่อนำข้อมูลแบบเรียลไทม์มาสู่แอปพลิเคชันของคุณได้อย่างง่ายดาย ตัวอย่างเช่น สมมติว่าคุณกำลังสร้างฟีดข่าวเช่น Twitter คุณต้องการดึงทวีตใหม่เข้าสู่ฟีดของผู้ใช้ทันทีที่มีการโพสต์โดยไม่ต้องโหลดหน้าซ้ำ Turbo Streams ช่วยให้คุณดำเนินการนี้ได้โดยไม่ต้องเขียน JSแม้แต่บรรทัดเดียว
-
เทอร์โบเนทิฟ ป>
Turbo Native ช่วยให้คุณสร้าง wrapper แบบเนทีฟรอบเว็บแอปพลิเคชันของคุณ การนำทางและการโต้ตอบจะให้ความรู้สึกเป็นธรรมชาติโดยที่คุณไม่ต้องทำซ้ำหน้าจอทั้งหมด
คุณจะส่งแอปพลิเคชันที่เหลือผ่านทางเว็บต่อไป ด้วยวิธีนี้ คุณสามารถมุ่งเน้นไปที่ส่วนที่มีการโต้ตอบจริงๆ ของแอปพลิเคชันของคุณและทำให้ถูกต้อง
สิ่งเร้า
Stimulus เป็นเฟรมเวิร์ก JavaScript สำหรับการเขียนตัวควบคุมที่โต้ตอบกับ HTML ของคุณ
สมมติว่าเราจำเป็นต้องเพิ่มแอตทริบิวต์ JavaScript เช่น 05 , 18รหัส> และ 24รหัส> ไปยังองค์ประกอบบนเพจ เราจะเขียนตัวควบคุมการกระตุ้นด้วยการเข้าถึงองค์ประกอบที่ได้รับเหตุการณ์ตามคุณลักษณะเหล่านั้น นี่คือตัวอย่าง:
เป็นเรื่องง่ายมากที่จะทำความเข้าใจว่าสิ่งนี้ทำอะไรได้โดยไม่ต้องอ่านตัวควบคุม Stimulus ที่เกี่ยวข้องด้วยซ้ำ
นี่คือตัวควบคุมที่มาพร้อมกับ HTML:
นั่นคือหัวใจสำคัญของการกระตุ้น:ทำให้สิ่งต่างๆ เรียบง่ายและนำกลับมาใช้ใหม่ได้
ในตอนนี้ หากคุณต้องการปุ่มคัดลอกไปยังคลิปบอร์ดบนหน้าอื่น คุณสามารถใช้คอนโทรลเลอร์นั้นอีกครั้งได้ เพิ่ม 38 คุณลักษณะบนมาร์กอัปเพื่อให้ทุกอย่างทำงานได้
สตราดา
น่าเสียดายที่เรายังไม่รู้มากนักเกี่ยวกับ Strada แต่จะช่วยให้เว็บแอปพลิเคชันสามารถสื่อสาร (และอาจดำเนินการ) กับแอปเนทีฟโดยใช้แอตทริบิวต์ HTML Bridge
วิธีใช้ Hotwire ในแอปพลิเคชัน Ruby on Rails ของคุณ
ฉันไม่ต้องการใช้เวลามากเกินไปในการหารือเกี่ยวกับการติดตั้ง Hotwire หรือกรณีการใช้งานขั้นพื้นฐาน ทีมงาน Hotwire ได้ทำงานที่ยอดเยี่ยมใน Screencast ของ Hotwire แล้ว สำหรับคำแนะนำแบบเต็ม โปรดดูที่ 45 การติดตั้งและการติดตั้งตัวกระตุ้น
มาดูกรณีการใช้งาน Hotwire ทั่วไปกันดีกว่า
เลื่อนไม่มีที่สิ้นสุด
การใช้ Turbo Frames เราสามารถสร้างเพจที่มีการแบ่งหน้าอัตโนมัติในขณะที่ผู้ใช้เลื่อนได้อย่างง่ายดาย สำหรับสิ่งนี้ เราต้องทำสองสิ่ง:
- แสดง "เพจ" แต่ละหน้าภายในเฟรมของตัวเองโดยเพิ่มหมายเลขหน้าต่อท้ายรหัสเฟรม (เช่น
56). - ใช้
61เฟรมสำหรับหน้าถัดไปเพื่อไม่ให้โหลดโดยอัตโนมัติเว้นแต่จะเข้ามาดู
โปรดทราบว่าตัวอย่างนี้ใช้วิธีการจาก Kaminari แต่คุณสามารถปรับให้เข้ากับวิธีการแบ่งหน้าอื่นๆ ได้
เราไม่ต้องการอะไรพิเศษในคอนโทรลเลอร์ มาตรฐาน 78 วิธีการทำงาน:
เคล็ดลับคือ เราใช้เฟรมที่ซ้อนกัน โดยมีเฟรมสำหรับหน้าถัดไปซ้อนกันอยู่ภายในเฟรมสำหรับหน้าก่อนหน้า ด้วยวิธีนี้ เมื่อหน้าแรกโหลด เฟรมสำหรับหน้าถัดไปจะถูกวางไว้ที่ส่วนท้าย เมื่อผู้ใช้เลื่อนไปที่เฟรมนั้น เนื้อหาจะถูกแทนที่ด้วยเนื้อหาของหน้าที่สอง กรอบแบบขี้เกียจสำหรับหน้าที่สามจะแสดงผลที่ส่วนท้าย
แบบฟอร์มไดนามิก
คุณสามารถใช้รูปแบบไดนามิกกับ Hotwire ได้อย่างง่ายดายโดยไม่ต้องใช้ตรรกะที่กำหนดเองสำหรับการสลับฟิลด์ที่ส่วนหน้า นี่เป็นเรื่องที่เกี่ยวข้องมากกว่ากรณีการใช้งานการเลื่อนแบบไม่มีที่สิ้นสุดเล็กน้อย เนื่องจากมีการใช้งานทั้ง Turbo Stream และ Stimulus
มาเริ่มกันที่แบบฟอร์มของเราก่อน
แบบฟอร์มนี้เรียบง่ายพอ — เราแสดง 88 เลือกด้วย 97 และ 100 ตัวเลือก เราต้องการเปลี่ยนค่าของหมวดหมู่ที่มีอยู่ตามประเภทที่เลือก (สมมติว่า 110 ส่งคืนรายการหมวดหมู่สำหรับประเภทที่กำหนด)
หากมองให้ละเอียดยิ่งขึ้น คุณจะเห็นว่าเราได้เพิ่มแอตทริบิวต์ข้อมูลบางอย่างลงในแบบฟอร์ม 124 จะเชื่อมโยงองค์ประกอบแบบฟอร์มกับ 138 143 ของผู้ควบคุมสิ่งกระตุ้น เป้าหมายและ 154 ด้วยค่า 163 จะเรียก 176 วิธีการบนตัวควบคุมการกระตุ้นที่เชื่อมโยงทุกครั้งที่ 186 การเลือกมีการเปลี่ยนแปลง
มาดูตัวควบคุมการกระตุ้นของเรากัน:
ใน 199 ทั้งหมด โทร เราเพิ่งสร้าง 203 ใหม่ ร้องขอไปยัง URL ของคอนโทรลเลอร์ (ตั้งค่าโดยใช้ 214 ในองค์ประกอบเดียวกันกับ 225 ).ส่วนสำคัญที่นี่คือ 237 ตั้งค่าเป็น 246 .252รหัส> ห้องสมุดเข้าใจการตอบสนองนี้และดำเนินการตามคำแนะนำตามสตรีมการตอบสนอง
ตอนนี้สิ่งที่เหลืออยู่คือการส่งคืนสตรีมที่ถูกต้องจาก 265 ของเรา โทรหา Turbo เพื่อทำความเข้าใจและอัปเดตแบบฟอร์มของเรา
เพียงอัปเดตแอตทริบิวต์ในโพสต์และทำเครื่องหมายที่คุณต้องการตอบกลับใน 279 รูปแบบ (เพื่อที่จะค้นหา 282 ).
ในขั้นตอนนี้ เรากำลังนำ 296 ของเรากลับมาใช้ใหม่ บางส่วน โดยล้อมไว้ภายใน 305 ด้วย 313 การกระทำ
และนั่นคือทั้งหมดที่คุณต้องมีเพื่อให้ไดนามิกฟอร์มทำงานได้ ฉันรู้ว่านี่ดูล้ำหน้าไปหน่อย แต่ 329 ตัวควบคุมการกระตุ้นเป็นส่วนที่ใช้ร่วมกันซึ่งคุณสามารถใช้กับรูปแบบไดนามิกทั้งหมดของคุณได้แล้วโดยการเพิ่ม 331 ที่ถูกต้อง คุณลักษณะ โดยพื้นฐานแล้ว ตอนนี้คุณจะได้รับการรีเฟรชฟอร์มไดนามิกฝั่งเซิร์ฟเวอร์โดยไม่ต้องเขียน JS ใหม่สำหรับฟอร์มอื่น เจ๋งมากใช่ไหม
เพิ่มเนื้อหาต่อท้ายหน้าโดยไม่ต้องโหลดซ้ำ
กรณีการใช้งานถัดไปที่ Hotwire ทำให้เป็นเรื่องง่ายคือการสตรีม HTML ผ่านการเชื่อมต่อ WebSocket และอัปเดตเพจด้วยเนื้อหาใหม่เมื่อมีเข้ามา ตัวอย่างที่ดีของสิ่งนี้คือส่วนความคิดเห็นของ GitHub คุณสามารถปรับใช้สิ่งนี้ได้อย่างง่ายดายโดยใช้ Turbo Streams
มีสองส่วนนี้
ขั้นแรก เราฝังตัวฟังเทอร์โบสตรีมบนหน้ารายการที่เปิดการเชื่อมต่อ WebSocket ไปยังเซิร์ฟเวอร์และรับฟังเหตุการณ์
ต่อไป เราจะอัปเดตโมเดลเพื่อเผยแพร่ความคิดเห็นใหม่ไปยังสตรีม
คุณไม่ต้องการอะไรอีกแล้ว Turbo จะเรนเดอร์ 341 โดยอัตโนมัติ บางส่วนสำหรับความคิดเห็นใหม่แต่ละรายการและส่งผ่านการเชื่อมต่อ WebSocket มันจะถูกเลือกโดย JS ของ Turbo และนำหน้าเป้าหมายด้วย id 351 .
ก้าวไปข้างหน้าหนึ่งก้าวและเพิ่มข้อบ่งชี้ให้กับความคิดเห็นที่เพิ่มใหม่ทั้งหมดด้วยตัวควบคุมการกระตุ้นขนาดเล็ก
ขั้นแรก แก้ไขการออกอากาศและ 362 บางส่วนเพื่อรวมคอนโทรลเลอร์ตามเงื่อนไข
ตัวควบคุม Stimulus ขนาดเล็กนี้จะเพิ่มคลาสไฮไลท์พิเศษในการเชื่อมต่อเป็นเวลา 3 วินาที จากนั้นจึงลบออก
หมายเหตุ :คุณต้องอัปเดตการไฮไลต์ CSS ตามการมีอยู่ของคลาสนั้นด้วย
เมื่อตัวควบคุมนี้เสร็จสิ้น คุณสามารถนำมาใช้ซ้ำกับทุกสิ่งที่ต้องใช้คลาสไฮไลต์ได้ คุณยังสามารถแก้ไขเพื่อรับระยะเวลาและชื่อคลาสจากแอตทริบิวต์ข้อมูลได้ หากคุณต้องการความยืดหยุ่นดังกล่าว
นั่นเป็นข้อดีของ Hotwire — มันใช้เวลานานมาก และคุณไม่จำเป็นต้องลงมือเขียน JS เมื่อคุณจำเป็นต้องเขียน JS บางส่วน Stimulus จะให้เครื่องมือแก่คุณในการสร้างคอนโทรลเลอร์ทั่วไปขนาดเล็กที่สามารถนำกลับมาใช้ใหม่ได้
สรุปและอ่านเพิ่มเติม
ชุมชน Rails รู้สึกตื่นเต้นมากกับการเปิดตัว Hotwire และถูกต้องเช่นกัน
ในโพสต์นี้ เราได้ดูองค์ประกอบสำคัญของ Hotwire และวิธีใช้ Hotwire ในแอป Rails ของคุณ เราได้กล่าวถึงวิธีที่คุณสามารถทำให้แอปพลิเคชันของคุณมีชีวิตชีวาโดยใช้ Turbo และ Stimulus ได้
บทแนะนำ Screencast อย่างเป็นทางการของ Hotwire และเอกสาร Turbo เป็นสถานที่ที่ดีเยี่ยมในการดูว่า Hotwire และ Turbo สามารถทำอะไรให้คุณได้บ้าง
สำหรับการใช้งานขั้นสูง ฉันขอแนะนำให้ไปที่ repo GitHub ของ turbo-rails น่าเสียดายที่เอกสารประกอบค่อนข้างเบาบาง แต่ถ้าคุณไม่กลัวที่จะทำให้มือของคุณสกปรก ให้อ่านโค้ดและความคิดเห็นแบบอินไลน์ใน:
379รหัส> สำหรับ เฟรมเทอร์โบ .387รหัส> สำหรับการออกอากาศไปยัง Turbo Streams จากโค้ด399รหัส> สำหรับการออกอากาศไปยัง Turbo Streams เป็นส่วนหนึ่งของการดำเนินการของตัวควบคุมแบบอินไลน์
ขอให้สนุกกับการเขียนโค้ด!
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>
สะพานดิวาการ์
Sapan Diwakar ผู้เขียนรับเชิญของเราเป็นนักพัฒนาฟูลสแตก เขาเขียนเกี่ยวกับความสนใจของเขาในบล็อกของเขา และเป็นแฟนตัวยงของการทำให้สิ่งต่าง ๆ เรียบง่าย ทั้งในชีวิตและในโค้ด เมื่อเขาไม่ได้ทำงานกับเทคโนโลยี เขาชอบใช้เวลาอยู่ในสวน เดินป่า และเล่นกีฬากลางแจ้ง
บทความทั้งหมดโดย Sapan Diwakar