Signals ปรับโฉมการพัฒนา Frontend ขณะที่ชุมชนถกเถียงถึงอนาคตของ React

ทีมชุมชน BigGo
Signals ปรับโฉมการพัฒนา Frontend ขณะที่ชุมชนถกเถียงถึงอนาคตของ React

Signals ปรับโฉมการพัฒนา Frontend ขณะที่ชุมชนถกเถียงถึงอนาคตของ React

โลกของการพัฒนา frontend กำลังประสบกับการเปลี่ยนแปลงกระบวนทัศน์ที่ก่อให้เกิดการถกเถียงอย่างเข้มข้นในหมู่นักพัฒนา เมื่อเฟรมเวิร์คที่ใช้ Signals ได้รับแรงผลักดันมากขึ้น ชุมชนจึงเริ่มตั้งคำถามว่าวิธีการจัดการสถานะแบบดั้งเดิมของ React ถึงขีดจำกัดแล้วหรือไม่ บทสนทนานี้เผยให้เห็นความแตกแยกอย่างลึกซึ้งเกี่ยวกับประสิทธิภาพ ประสบการณ์ของนักพัฒนา และแม้แต่อนาคตของสถาปัตยกรรม frontend

การทบทวน React ครั้งใหญ่

นักพัฒนาที่ทำงานกับ React มาตั้งแต่ยุคแรกเริ่มกำลังรู้สึกถึงความคุ้นเคย การปฏิวัติ Signals ในปัจจุบันรู้สึกคล้ายคลึงสำหรับผู้ที่จำรูปแบบการเขียนโปรแกรมแบบ Reactive ในอดีตได้ ผู้ใช้หนึ่งท่านแสดงความคิดเห็นว่า มันน่าขันที่รูปแบบ Observable ซึ่ง MVC และ Qt จัดการรอบๆ ตัวมัน กลายเป็น 'ตัวเปลี่ยนเกมสำหรับแอปพลิเคชันขนาดใหญ่' ในปีนี้ MVC อาจจะมีอายุ 50 ปีแล้วนะ? การสังเกตนี้เน้นย้ำว่าการพัฒนา frontend มักจะค้นพบรูปแบบจากยุคคอมพิวเตอร์ก่อนๆ ซ้ำแล้วซ้ำอีก โดยนำมาปรับแต่งใหม่สำหรับแอปพลิเคชันเว็บสมัยใหม่

การถกเถียงได้เผยให้เห็นความแตกต่างระหว่างรุ่นในวิธีที่นักพัฒนามองเห็นวิวัฒนาการของ React เมื่อบทความอ้างอิงถึง React hooks ว่าเป็นการจัดการสถานะแบบดั้งเดิม นักพัฒนาที่มีประสบการณ์หลายคนแสดงความประหลาดใจ หนึ่งในนั้นกล่าวว่า แบบดั้งเดิมเหรอ? ฉันจำได้ตอนที่ React เป็นเด็กใหม่ในวงการ ฉันกำลังจะแก่แล้ว! อีกคนชี้แจงว่า ไม่ใช่แค่การเรียกว่า React แบบดั้งเดิม แต่มันกำลังเรียก React hooks ว่าแบบดั้งเดิมต่างหาก พวกมันไม่มีอยู่จริงในช่วง 6 ปีแรกของเฟรมเวิร์ค ความตึงเครียดระหว่างรูปแบบที่确立แล้วและแนวทางใหม่นี้สะท้อนให้เห็นถึงวิวัฒนาการที่รวดเร็วของแนวปฏิบัติในการพัฒนา frontend

บริบททางประวัติศาสตร์ของ Reactive Patterns

  • MVC Pattern: มีอายุประมาณ 50 ปี อิงจาก observable patterns
  • Knockout.js: การนำ reactive programming มาใช้ใน JavaScript ในยุคแรก (2010)
  • Functional Reactive Programming: มีต้นกำเนิดทางวิชาการตั้งแต่ปี 1997
  • Modern Signals: วิวัฒนาการที่ผสมผสานบทเรียนจากหลายยุคสมัยเข้ากับความต้องการของเว็บสมัยใหม่

ประสิทธิภาพ กับ ความซับซ้อนทางความคิด

ความตึงเครียดหลักในการอภิปรายเกี่ยวกับ Signals อยู่ที่การแลกเปลี่ยนระหว่างการเพิ่มประสิทธิภาพและภาระทางจิตใจ Signals สัญญาว่าจะอัพเดทแบบเจาะจงโดยอัตโนมัติ ซึ่งขจัดความจำเป็นในการปรับปรุงประสิทธิภาพด้วยตนเองด้วยเครื่องมือเช่น React.memo, useMemo และ useCallback อย่างไรก็ตาม นักพัฒนาบางส่วนตั้งคำถามว่าสิ่งนี้แสดงถึงความก้าวหน้าอย่างแท้จริงหรือเพียงแค่เพิ่มความซับซ้อน

นักพัฒนาคนหนึ่งแสดงความสับสนเกี่ยวกับข้อสมมติฐานทั้งหมด: บทความนี้ย้อนแย้งโดยสิ้นเชิง เราไม่ต้องการจัดการด้วยตนเองว่าอะไรควรได้รับการรีเฟรชเมื่อไหร่ ประเด็นทั้งหมดของ React คือการตอบสนองต่อการเปลี่ยนแปลงสถานะโดยอัตโนมัติ มุมมองนี้จับความน่าดึงดูดใจดั้งเดิมของโมเดล Declarative ของ React ซึ่งนักพัฒนาบรรยายว่าอินเทอร์เฟซผู้ใช้ควรมีลักษณะอย่างไรและปล่อยให้เฟรมเวิร์คจัดการการอัพเดท

อย่างไรก็ตาม คนอื่นๆ แย้งว่าแนวทางของ React ในทางปฏิบัติมักต้องการการแทรกแซงด้วยตนเองอย่างมีนัยสำคัญ นั่นคือทฤษฎี แต่ค่อนข้างง่ายที่จะลงเอยด้วยความจำเป็นต้องจัดการ React อย่างจุกจิกเพื่อหลีกเลี่ยงสถานการณ์การเรนเดอร์ที่ผิดปกติ ผู้แสดงความคิดเห็นหนึ่งระบุ ความเป็นจริงนี้ทำให้ทีมจำนวนมากนำรูปแบบการเพิ่มประสิทธิภาพที่ซับซ้อนมาใช้ ซึ่ง Signals มุ่งหมายที่จะขจัดสิ่งเหล่านี้โดยค่าเริ่มต้น

การแลกเปลี่ยนในการเพิ่มประสิทธิภาพ

  • แนวทาง React Hooks: ต้องการการเพิ่มประสิทธิภาพด้วยตนเองผ่าน React.memo, useMemo, useCallback เพื่อป้องกันการ re-render ที่ไม่จำเป็น
  • แนวทาง Signals: การอัปเดตแบบละเอียดอัตโนมัติช่วยขจัดความจำเป็นในการใช้ตัวช่วยเพิ่มประสิทธิภาพด้วยตนเอง
  • ผลกระทบต่อ Bundle: Signals ช่วยลดความจำเป็นในการใช้โค้ดเพิ่มประสิทธิภาพ ซึ่งอาจช่วยลดขนาด bundle ได้
  • ภาระทางปัญญา: Signals เปลี่ยนความซับซ้อนจากการเพิ่มประสิทธิภาพด้วยตนเองไปสู่การทำความเข้าใจกระบวนการไหลของข้อมูลแบบ reactive

ความเชื่อมโยงกับ Knockout.js และการบรรจบกันของอุตสาหกรรม

นักพัฒนาที่มีประสบการณ์กำลังสังเกตเห็นความคล้ายคลึงกันอย่างน่าทึ่งระหว่าง Signals สมัยใหม่และเฟรมเวิร์คเก่าๆ อย่าง Knockout.js knockout js นั่นนายหรือ? ผู้ใช้หนึ่งคนพูดพลาง ซึ่งเน้นย้ำให้เห็นว่าระบบนิเวศ frontend ดูเหมือนจะวนกลับไปสู่แนวคิดการเขียนโปรแกรมแบบ Reactive ในยุคแรกๆ สิ่งนี้ทำให้บางคนตั้งคำถามว่าเฟรมเวิร์คสมัยใหม่นำเสนอสิ่งใดที่แท้จริงนอกเหนือจากแนวทางเก่าๆ ที่เรียบง่ายกว่า

การบรรจบกันนี้ขยายไปไกลกว่าเฟรมเวิร์ค JavaScript นักพัฒนาที่ทำงานกับ .NET คนหนึ่งสังเกตว่า ฉันรู้สึกว่าในบางจุดเรากำลังจะครบวงจรและมีเครื่องมือเชื่อมโยง MVVM/MVC ในการพัฒนา frontend เหลือความแตกต่างเพียงเล็กน้อยระหว่าง createContext+useSignal กับ C# DataContext+ObservableProperty สิ่งนี้ชี้ให้เห็นว่าระบบนิเวศการเขียนโปรแกรมที่แตกต่างกันกำลังมาถึงโซลูชันที่คล้ายคลึงกันสำหรับความท้าทายพื้นฐานของการจัดการสถานะ

ขบวนการ Signals กำลังได้รับแรงผลักดันจากสถาบันด้วยข้อเสนอ TC39 stage-1 เพื่อเพิ่ม Signals แบบ first-class ลงในตัวภาษา JavaScript เอง ความพยายามในการกำหนดมาตรฐานนี้เกี่ยวข้องกับการทำงานร่วมกันระหว่างผู้ดูแลไลบรารีหลายราย ซึ่งมีศักยภาพที่จะนำ Signals เข้ามาอยู่ในข้อกำหนดภาษา JavaScript ดังที่ผู้ใช้หนึ่งท่านระบุ ฉันสงสัยว่าอีกหลายปีในอนาคต จะไม่มีความจำเป็นสำหรับเฟรมเวิร์ค JS เนื่องจากสิ่งต่างๆ มากมายที่พวกเขานำเสนอจะถูกรวมเข้ากับตัว JS เอง

ประสบการณ์การนำไปใช้ในโลกจริง

นักพัฒนาที่มีประสบการณ์ในกระบวนทัศน์ทั้งสองกำลังแบ่งปันเรื่องราวการย้ายถิ่นฐานที่น่าสนใจ นักพัฒนา ClojureScript คนหนึ่งอธิบายการเปลี่ยนแปลงของพวกเขาว่า ฉันเพิ่งผ่านกระบวนการเปลี่ยน phrasing.app จาก reagent atoms ไปเป็น preact/signals ด้วยเหตุผลด้านประสิทธิภาพ และฉันต้องบอกว่ามันยอดเยี่ยมมาก บางทีอาจใช้โค้ด 50 บรรทัดเพื่อจำลอง reagent atoms ด้วย preact/signals ได้ประโยชน์ทั้งหมด และเร็วขึ้นมากมาก

ประสบการณ์นี้เน้นย้ำว่า Signals สามารถให้ประโยชน์ด้านประสิทธิภาพในขณะที่ยังคงรักษาความสะดวกในการใช้งานสำหรับนักพัฒนา ผู้แสดงความคิดเห็นดังกล่าวแสดงความสับสนต่อแนวทางแบบ hooks ของ React โดยตั้งคำถามเกี่ยวกับ การเรียกใช้ 'useState' แต่ละครั้งเป็นพันๆ ครั้งเพื่อติดตามจำนวนรายการสถานะเดียวกัน และความจริงที่ว่าทุกฟังก์ชันกำลังปิดการเข้าถึงสถานะในอดีต เว้นแต่คุณจะบอกให้มันเปลี่ยนแปลงทุกครั้งที่ตัวแปรเปลี่ยนแปลงด้วยตนเอง

อย่างไรก็ตาม นักพัฒนาบางส่วนกังวลเกี่ยวกับข้อจำกัดของ Signals กับโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ ผู้ใช้หนึ่งท่านกังวลว่า ด้วย Signals คุณต้องใช้ค่าที่เปลี่ยนแปลงไม่ได้เท่านั้น ลองจินตนาการว่าคุณมีโมเดลเอกสารข้อความ และคุณจำเป็นต้องสร้างสำเนาใหม่ทุกครั้งที่ผู้ใช้พิมพ์ตัวอักษร นั่นจะไม่ทำงานได้เร็ว สิ่งนี้ทำให้เกิดการอภิปรายเกี่ยวกับว่าโครงสร้างข้อมูลที่ไม่เปลี่ยนแปลงทำงานอย่างไรในทางปฏิบัติ โดยผู้ตอบหนึ่งคนระบุว่า โมเดลทางจิตของ 'คัดลอกทุกอย่าง' ในการเขียนโปรแกรมแบบไม่เปลี่ยนแปลงนั้นผิดพลาดพอๆ กับโมเดลทางจิต 'เขียนใหม่ทั้งหมด' ในการเขียนโปรแกรมแบบเปลี่ยนแปลงได้

การบรรจบกันของเฟรมเวิร์คและแนวปฏิบัติที่ดีที่สุด

รูปแบบ Signals กำลังปรากฏขึ้นทั่วทั้งเฟรมเวิร์คหลายตัว สร้างทั้งความสม่ำเสมอและความสับสน นักพัฒนากำลังถามว่า Angular signals เหมือนกับ Preact signals หรือไม่? คำตอบเผยให้เห็นระบบนิเวศที่เชื่อมโยงถึงกัน — ทีม Angular ได้นำผู้เขียน SolidJS มาร่วมงานเพื่อนำ Signals ไปใช้งาน และ Preact signals นั้นโดยพื้นฐานแล้วถูกพอร์ตมาจาก SolidJS สร้างความคล้ายคลึงกันในการนำไปใช้งาน

ผู้ใช้ Signals ที่มีประสบการณ์กำลังพัฒนาแนวปฏิบัติที่ดีที่สุดอยู่แล้ว ผู้ใช้หนึ่งท่านแนะนำว่า Preact signals เหนือกว่ารูปแบบการจัดการสถานะอื่นๆ สำหรับ react อย่างมาก แต่ห้ามใช้ ContextProvider ตามที่แสดงในบทความนี้ ให้ส่ง signals ผ่าน props แทน สิ่งนี้ชี้ให้เห็นว่าชุมชนกำลังพัฒนารูปแบบและธรรมเนียมปฏิบัติสำหรับการทำงานกับ Signals อย่างมีประสิทธิภาพได้อย่างรวดเร็ว

ผู้เขียนเฟรมเวิร์คคงจะยินดีที่ไม่ต้องทำในสิ่งที่พวกเขาทำอยู่ หากแพลตฟอร์มมี API และโครงสร้างพื้นฐานที่ยอดเยี่ยม

ความคิดเห็นนี้จับความจริงพื้นฐานเกี่ยวกับวิวัฒนาการของการพัฒนาเว็บ เมื่อแพลตฟอร์มเติบโตเต็มที่ ผู้เขียนเฟรมเวิร์คก็มองหาการกำหนดมาตรฐานและมอบหมายฟังก์ชันการทำงานให้กับความสามารถดั้งเดิมของเบราว์เซอร์มากขึ้นเรื่อยๆ

การเปรียบเทียบการใช้งาน Signal ในเฟรมเวิร์กต่างๆ

เฟรมเวิร์ก การใช้งาน Signal ลักษณะสำคัญ
Preact Signals ถูกพอร์ตมาจาก SolidJS ความเป็น reactive แบบละเอียด, การติดตามการพึ่งพาอัตโนมัติ
Angular Signals พัฒนาร่วมกับผู้สร้าง SolidJS ผสานรวมกับระบบ change detection ของ Angular
SolidJS การใช้งาน signals แบบดั้งเดิม ความเป็น reactive ในขั้นตอน compile-time, ไม่มี virtual DOM
Vue ระบบ reactive ที่ใช้ Proxies การติดตามออบเจ็กต์แบบ mutable, มีข้อจำกัดของ proxy บางประการ

บทสรุป: ระบบนิเวศที่กำลังพัฒนา

การอภิปรายเกี่ยวกับ Signals เป็นมากกว่าเพียงการเปรียบเทียบเฟรมเวิร์คอีกตัวหนึ่ง — มันสะท้อนให้เห็นถึงวุฒิภาวะที่กำลังดำเนินอยู่ของการพัฒนา frontend ในฐานะสาขาวิชาชีพ นักพัฒนากำลังชั่งน้ำหนักการแลกเปลี่ยนระหว่างโมเดลทางจิตของ React ที่确立แล้วกับข้อได้เปรียบด้านประสิทธิภาพของ Signals ระหว่างการอัพเดทอัตโนมัติและการควบคุมแบบเจาะจง

สิ่งที่เกิดขึ้นจากการอภิปรายคือชุมชนที่กำลังอยู่ในช่วงเปลี่ยนผ่าน ซึ่งสร้างสมดุลระหว่างบทเรียนจากประวัติศาสตร์คอมพิวเตอร์กับความต้องการในทางปฏิบัติของแอปพลิเคชันเว็บสมัยใหม่ ในขณะที่ Signals ยังคงพัฒนาและมีศักวะที่จะถูกกำหนดให้เป็นมาตรฐานในตัวภาษา JavaScript เอง ภูมิทัศน์ frontend ดูเหมือนจะพร้อมสำหรับการเปลี่ยนแปลงที่สำคัญ บทสนทนาชี้ให้เห็นว่าเราไม่ได้เพียงแค่เลือกระหว่างแนวทางทางเทคนิค แต่เรากำลังกำหนดรูปร่างของอนาคตเกี่ยวกับวิธีที่เราสร้างสรรค์สิ่งต่างๆ สำหรับเว็บ

ข้อสรุปสุดท้ายอาจไม่เกี่ยวกับแนวทางหนึ่งที่ชนะอีกแนวทางหนึ่ง แต่อาจเกี่ยวกับการค้นหาเครื่องมือที่เหมาะสมสำหรับสถานการณ์ที่แตกต่างกัน สำหรับแอปพลิเคชันที่เรียบง่าย โมเดลตรงไปตรงมาของ React ยังคงมีประสิทธิภาพ สำหรับแอปพลิเคชันที่ซับซ้อนและอ่อนไหวต่อประสิทธิภาพ Signals นำเสนอข้อได้เปรียบที่น่าสนใจ ในขณะที่ระบบนิเวศยังคงพัฒนาต่อไป นักพัฒนากำลังได้รับตัวเลือกมากกว่าเดิมสำหรับการสร้างแอปพลิเคชันเว็บที่รวดเร็วและบำรุงรักษาได้

อ้างอิง: State-based vs Signal-based rendering