Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

สร้างแอป Interactive Rails อย่างรวดเร็วด้วย Hotwire:คู่มือสำหรับผู้เริ่มต้น

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 เราสามารถสร้างเพจที่มีการแบ่งหน้าอัตโนมัติในขณะที่ผู้ใช้เลื่อนได้อย่างง่ายดาย สำหรับสิ่งนี้ เราต้องทำสองสิ่ง:

  1. แสดง "เพจ" แต่ละหน้าภายในเฟรมของตัวเองโดยเพิ่มหมายเลขหน้าต่อท้ายรหัสเฟรม (เช่น 56 ).
  2. ใช้ 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 น่าเสียดายที่เอกสารประกอบค่อนข้างเบาบาง แต่ถ้าคุณไม่กลัวที่จะทำให้มือของคุณสกปรก ให้อ่านโค้ดและความคิดเห็นแบบอินไลน์ใน:

  1. 379 สำหรับ เฟรมเทอร์โบ .
  2. 387 สำหรับการออกอากาศไปยัง Turbo Streams จากโค้ด
  3. 399 สำหรับการออกอากาศไปยัง Turbo Streams เป็นส่วนหนึ่งของการดำเนินการของตัวควบคุมแบบอินไลน์

ขอให้สนุกกับการเขียนโค้ด!

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! สร้างแอป Interactive Rails อย่างรวดเร็วด้วย Hotwire:คู่มือสำหรับผู้เริ่มต้น

สะพานดิวาการ์

Sapan Diwakar ผู้เขียนรับเชิญของเราเป็นนักพัฒนาฟูลสแตก เขาเขียนเกี่ยวกับความสนใจของเขาในบล็อกของเขา และเป็นแฟนตัวยงของการทำให้สิ่งต่าง ๆ เรียบง่าย ทั้งในชีวิตและในโค้ด เมื่อเขาไม่ได้ทำงานกับเทคโนโลยี เขาชอบใช้เวลาอยู่ในสวน เดินป่า และเล่นกีฬากลางแจ้ง

บทความทั้งหมดโดย Sapan Diwakar