นักพัฒนา Frontend ถกเถียงว่า Functional Programming ทำให้การพัฒนาเว็บซับซ้อนเกินไปหรือไม่

ทีมชุมชน BigGo
นักพัฒนา Frontend ถกเถียงว่า Functional Programming ทำให้การพัฒนาเว็บซับซ้อนเกินไปหรือไม่

ชุมชนนักพัฒนาเว็บกำลังมีการถกเถียงกันอย่างเข้มข้นเกี่ยวกับว่าการไล่ตามความบริสุทธิ์ของ functional programming ได้นำการพัฒนา frontend สมัยใหม่ไปในทางที่ผิดจากความสามารถดั้งเดิมของแพลตฟอร์มเว็บหรือไม่ การถกเถียงมุ่งเน้นไปที่ว่าเครื่องมือต่างๆ เช่น React, CSS-in-JS และ JavaScript framework ที่ซับซ้อนได้ทำให้การพัฒนาเว็บซับซ้อนโดยไม่จำเป็นด้วยการต่อสู้กับฟีเจอร์ที่มีอยู่แล้วในเบราว์เซอร์

การถกเถียงใหญ่เรื่อง CSS: Global vs Scoped Styling

หนึ่งในประเด็นที่ถกเถียงกันมากที่สุดในการอภิปรายนี้หมุนรอบการจัดการ CSS นักพัฒนาจำนวนมากโต้แย้งว่าการเปลี่ยนแปลงของอุตสาหกรรมจาก CSS แบบดั้งเดิมไปสู่โซลูชัน CSS-in-JS และ utility framework เช่น Tailwind ได้สร้างปัญหามากกว่าที่จะแก้ไข ชุมชนชี้ให้เห็นว่า CSS ได้รับการออกแบบมาให้ cascade แบบ global ทำให้ stylesheet ขนาดเล็กสามารถควบคุมเอกสารขนาดใหญ่ได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม ผู้สนับสนุน functional programming ผลักดันให้มีการแยก component ออกจากกัน ส่งผลให้เกิดการสร้างสไตล์ขณะรันไทม์และเครื่องมือที่ซับซ้อน

นักพัฒนาที่มีประสบการณ์บางคนสังเกตว่าปัญหาที่แท้จริงไม่ใช่เรื่องเทคนิคแต่เป็นเรื่ององค์กร ทีมต่างๆ ต่อสู้กับการบังคับใช้แนวทาง CSS ในหมู่นักพัฒนาหลายคน ทำให้พวกเขาใช้ utility framework ที่รับประกันความสอดคล้องแม้จะต้องแลกกับ markup ที่ยาวเยื่อและ HTML payload ที่ใหญ่ขึ้น สิ่งนี้เน้นย้ำถึงความตึงเครียดพื้นฐานระหว่างการรักษาคุณภาพโค้ดในระดับใหญ่และการใช้ประโยชน์จากความสามารถดั้งเดิมของแพลตฟอร์ม

Native Web APIs vs การสร้างใหม่ด้วย JavaScript

ส่วนสำคัญของการถกเถียงมุ่งเน้นไปที่วิธีที่ framework สมัยใหม่มักจะสร้างฟีเจอร์ของเบราว์เซอร์ใหม่ใน JavaScript แทนที่จะใช้ native API การอภิปรายเน้นย้ำถึงความขัดแย้งเรื่อง element <dialog> โดยเฉพาะ ที่นักพัฒนายังคงสร้าง modal component แบบกำหนดเองด้วย element <div> แทนที่จะใช้ฟังก์ชัน dialog ดั้งเดิมที่ให้การจัดการ focus, การจัดการคีย์บอร์ด และฟีเจอร์ accessibility ที่มีอยู่แล้ว

อย่างไรก็ตาม ชุมชนให้บริบทสำคัญเกี่ยวกับเวลาและความเข้ากันได้ Element <dialog> เพิ่งได้รับการสนับสนุนเต็มรูปแบบจากเบราว์เซอร์ในเดือนมีนาคม 2022 โดย Firefox เพิ่มการสนับสนุนเมื่อสองเดือนที่ผ่านมา สิ่งนี้อธิบายได้ว่าทำไม component library ที่มีอยู่และสื่อการเรียนรู้ยังคงพึ่งพาการใช้งาน JavaScript - พวกเขาถูกสร้างขึ้นก่อนที่ทางเลือกดั้งเดิมจะใช้งานได้

Native Web APIs เทียบกับการพัฒนาแบบ Framework

คุณสมบัติ โซลูชันแบบ Native แนวทาง Framework การแลกเปลี่ยน
Modal Dialogs element &lt;dialog&gt; คอมโพเนนต์ &lt;div&gt; แบบกำหนดเอง Native: มี a11y ในตัว, การจัดการ focus; Framework: ควบคุมได้มากกว่า, รองรับเบราว์เซอร์เก่า
Form Validation HTML5 validation attributes JavaScript validation libraries Native: ทันที, ไม่ต้องใช้ JS; Framework: โลจิกแบบกำหนดเอง, UX ที่สม่ำเสมอ
Routing แท็ก &lt;a&gt;, History API Client-side routers Native: ทำงานได้โดยไม่ต้องใช้ JS, เข้าถึงได้; Framework: ไม่ต้องโหลดหน้าใหม่, รักษาสถานะ
Styling CSS cascade, stylesheets CSS-in-JS, utility classes Native: การแยกวิเคราะห์แบบขนาน, payload ที่เล็กกว่า; Framework: การแยกคอมโพเนนต์, ไม่มีความขัดแย้งในการตั้งชื่อ

ปัญหาเส้นโค้งการเรียนรู้

สมาชิกชุมชนแสดงความกังวลเกี่ยวกับวิธีการสอนและประยุกต์ใช้แนวคิด functional programming ในการพัฒนา frontend หลายคนสังเกตเห็นนักพัฒนาเขียนโค้ดที่ซับซ้อนเกินไปโดยใช้ array method เช่น reduce() และการ chain method มากเกินไป ในขณะที่ for-loop แบบธรรมดาจะอ่านและดูแลรักษาได้ง่ายกว่า

ผมเห็นโค้ดที่วุ่นวายมากมายด้วย arr.reduce() หรือ arr.map().filter().filter().map() ที่ chain กันหลายตัว ซึ่งจะง่ายและอ่านง่ายกว่ามากถ้าเป็น for-loop แบบคลาสสิก

การอภิปรายเผยให้เห็นความแตกต่างระหว่างรุ่นในแนวทางการเขียนโปรแกรม นักพัฒนาที่ได้รับการฝึกฝนใน functional programming พบว่า imperative loop ยากที่จะเข้าใจ ในขณะที่ผู้ที่มีพื้นฐาน procedural ต่อสู้กับ functional chain สิ่งนี้บ่งบอกว่าปัญหาไม่ได้อยู่ที่แนวทางหนึ่งจะเหนือกว่าโดยธรรมชาติ แต่เกี่ยวกับการจับคู่เครื่องมือที่เหมาะสมกับปัญหาเฉพาะและบริบทของทีม

วิวัฒนาการของแพลตฟอร์ม vs ข้อจำกัดของ Framework

แง่มุมที่น่าสนใจของการถกเถียงเกี่ยวข้องกับความเร็วในการพัฒนามาตรฐานเว็บเปรียบเทียบกับการยอมรับ framework ชุมชนสังเกตว่าเบราว์เซอร์ตอนนี้สนับสนุนฟีเจอร์มากมายที่นักพัฒนาสร้างใหม่ใน JavaScript มาหลายปี เช่น element <select> ที่ปรับแต่งได้, date picker ดั้งเดิม และความสามารถในการจัดแต่ง CSS ขั้นสูง

อย่างไรก็ตาม ข้อจำกัดของ framework บางครั้งป้องกันไม่ให้นักพัฒนาใช้ฟีเจอร์ใหม่เหล่านี้ ฟีเจอร์ทดลองของเบราว์เซอร์บางอย่างทำให้เกิด hydration failure ใน framework ยอดนิยม สร้างสถานการณ์ที่แพลตฟอร์มได้พัฒนาไปเกินกว่าที่เครื่องมือพัฒนาหลักจะจัดการได้ สิ่งนี้สร้างช่วงหน่วงระหว่างสิ่งที่เป็นไปได้ในแบบดั้งเดิมและสิ่งที่ใช้งานได้จริงในการพัฒนาที่ใช้ framework

ไทม์ไลน์การรองรับของเบราว์เซอร์สำหรับฟีเจอร์สำคัญ

  • องค์ประกอบ &lt;dialog&gt;: ได้รับการรองรับอย่างเต็มรูปแบบในเดือนมีนาคม 2022, Firefox เพิ่มการรองรับในเดือนตุลาคม 2024
  • &lt;select&gt; ที่ปรับแต่งได้: ยังคงอยู่ในระยะทดลองในเบราว์เซอร์ส่วนใหญ่ ณ ปี 2024
  • ตัวเลือก CSS ::part() และ ::pseudo(): การรองรับอย่างกว้างขวางสำหรับการจัดแต่งขั้นสูง
  • &lt;input type="date"&gt;: ได้รับการรองรับเป็นอย่างดีในเบราว์เซอร์สมัยใหม่
  • Popover API: การรองรับที่กำลังเกิดขึ้นสำหรับฟังก์ชัน tooltip และ overlay

ความแตกต่างระหว่างองค์กร vs เทคนิค

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

ชุมชนยอมรับว่า React และ framework ที่คล้ายกันแก้ปัญหาจริงด้วยการพัฒนาแบบ jQuery โดยเฉพาะเรื่องการจัดการ state และการจัดระเบียบ component คำถามไม่ใช่ว่าเครื่องมือเหล่านี้มีค่าหรือไม่ แต่ว่าพวกเขาได้กลายเป็นตัวเลือกเริ่มต้นสำหรับปัญหาที่ไม่ต้องการความซับซ้อนของพวกเขาหรือไม่

มองไปข้างหน้า

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

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

อ้างอิง: How Functional Programming Shaped (and Twisted) Frontend Development