นักพัฒนาสร้างเว็บไซต์แบบไฟล์เดียวเพื่อหลีกหนีการพึ่งพา Framework

ทีมชุมชน BigGo
นักพัฒนาสร้างเว็บไซต์แบบไฟล์เดียวเพื่อหลีกหนีการพึ่งพา Framework

นักพัฒนาคนหนึ่งได้แบ่งปันเส้นทางการพัฒนาของตนเองจากการดิ้นรนกับ framework เว็บไซต์แบบดั้งเดิมไปสู่การสร้างเว็บไซต์ทั้งหมดเป็นไฟล์ Go binary เดียว แนวทางนี้ได้จุดประกายการอภิปรายเกี่ยวกับการแลกเปลี่ยนระหว่างความเรียบง่ายและแนวปฏิบัติการพัฒนาเว็บแบบดั้งเดิม

นักพัฒนาคนนี้เริ่มต้นด้วยการลองใช้ static site generator ที่ได้รับความนิยม เช่น Hugo , Jekyll และ Ghost แต่พบว่าไม่น่าพอใจเนื่องจากมีการพึ่งพาหลายอย่างและต้องการการบำรุงรักษามาก หลักการหลักของเขามุ่งเน้นไปที่ระบบที่เขาสามารถเข้าใจและบำรุงรักษาได้ด้วยตนเอง พร้อมด้วย feedback loop ที่รวดเร็วมากและความน่าเชื่อถือระยะยาว

ข้อดีของภาษา Go สำหรับเว็บไซต์ที่เป็น Single Binary:

  • บำรุงรักษาได้ง่ายโดยคนเดียว
  • เน้นการมี dependencies น้อย
  • ไวยากรณ์ของภาษาค่อนข้างง่าย
  • รับประกัน backwards compatibility
  • สร้าง statically compiled binaries ได้อย่างง่ายดาย
  • ความเร็วในการ compile (น้อยกว่า 10 วินาที)
  • Standard library ที่พัฒนาแล้วอย่างดี

ปัญหาของ Static Site Generator

Static site generator แบบดั้งเดิมมาพร้อมกับเครือข่ายของการพึ่งพาที่อาจเสียหายได้ตามเวลา ตยอย่างเช่น Hugo ต้องพึ่งพาความพร้อมใช้งานของบริการ GitHub Pages การพัฒนาอย่างต่อเนื่องของโปรเจกต์ Hugo เอกสารชุมชน ระบบนิเวศของปลั๊กอิน และกลไกการ deployment นักพัฒนาพบว่าสิ่งนี้สร้างจุดล้มเหลวที่อาจเกิดขึ้นได้มากเกินไปสำหรับเว็บไซต์ส่วนตัวที่ต้องการใช้งานได้หลายปีโดยไม่ต้องบำรุงรักษา

สมาชิกชุมชนได้แบ่งปันประสบการณ์ที่คล้ายคลึงกัน โดยนักพัฒนาบางคนได้สร้างโซลูชันที่กำหนดเองขึ้นมา ผู้แสดงความคิดเห็นคนหนึ่งกล่าวถึงการสร้างโปรแกรม Go ด้วย custom widget builder DSL เป็นการประนีประนอมระหว่างการปรับแต่งและความเรียบง่ายของ markdown นักพัฒนาอีกคนหนึ่งเปลี่ยนจาก Pelican ของ Python ไปยัง Next.js หลังจากพบปัญหาการปรับแต่ง template

การพึ่งพาของ Static Site Generator (ตัวอย่าง Hugo ):

  • ความพร้อมใช้งานของบริการ GitHub Pages
  • ความยั่งยืนของผลิตภัณฑ์ GitHub Pages
  • โปรเจกต์ Hugo ที่มีการพึ่งพามากกว่า 1,200 รายการ
  • เอกสารประกอบชุมชน Hugo
  • ความเข้ากันได้ของระบบนิเวศ plugin ของ Hugo
  • ความสม่ำเสมอในการคอมไพล์ไบนารี Hugo
  • กลไกการ deployment ของ GitHub Pages
  • ความมั่นคงของภาษา Golang

ประโยชน์ของแนวทางไฟล์เดียว

เว็บไซต์แบบไฟล์เดียวมีข้อได้เปรียบหลายประการเหนือ static generator การสร้างเนื้อหาแบบไดนามิกกลายเป็นเรื่องง่าย การแสดงที่อยู่ IP ของผู้เยียมชมต้องใช้โค้ด Go เพียงสี่บรรทัด ในขณะที่ static site จะต้องใช้ JavaScript และการพึ่งพาภายนอก กระบวนการ deployment ใช้ shell script ง่ายๆ ที่ตรวจสอบการอัปเดต git และสร้างไซต์ใหม่โดยอัตโนมัติ

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

การเปรียบเทียบประสิทธิภาพ:

  • Single Binary (Go): การแสดงผล IP แบบไดนามิกในโค้ดเพียง 4 บรรทัด
  • Static Site: ต้องใช้ JavaScript, external dependencies และจัดการความเข้ากันได้ของเบราว์เซอร์
  • .NET Kestrel: การเรนเดอร์ HTML แบบไดนามิกใน <100 ไมโครวินาที รวมถึง database queries
  • Deployment: Shell script ง่าย ๆ พร้อม git integration และการ rebuild อัตโนมัติ

ข้อได้เปรียบด้านประสิทธิภาพและ Deployment

แนวทางไฟล์เดียวสามารถให้ประโยชน์ด้านประสิทธิภาพที่น่าประทับใจ นักพัฒนาคนหนึ่งกล่าวถึงการบรรลุการ render หน้า HTML แบบไดนามิกในเวลาต่ำกว่า 100 ไมโครวินาทีโดยใช้เซิร์ฟเวอร์ Kestrel ของ .NET รวมถึงการจัดการ session state และ database query ระดับประสิทธิภาพนี้สามารถจัดการกับการเพิ่มขึ้นของ traffic และการโจมตี DDoS เล็กน้อยได้โดยไม่ต้องใช้โครงสร้างพื้นฐานเพิ่มเติม

ความเรียบง่ายของ deployment ไม่สามารถพูดเกินจริงได้ การคัดลอกไฟล์เดียวไปยังเซิร์ฟเวอร์และรันมันช่วยขจัดความจำเป็นในการติดตั้ง runtime หรือการ packaging ที่ซับซ้อน สิ่งนี้สอดคล้องกับเป้าหมายของนักพัฒนาคนเดิมในการลดการพึ่งพาและค่าใช้จ่ายในการบำรุงรักษา

การตอบรับจากชุมชนและทางเลือกอื่น

ชุมชนนักพัฒนาแสดงปฏิกิริยาที่หลากหลายต่อแนวทางนี้ ในขณะที่บางคนชื่นชมความเรียบง่ายและการควบคุมที่มันให้ คนอื่นๆ โต้แย้งว่าเป็นการ over-engineer ปัญหาที่เครื่องมือที่มีอยู่แก้ไขได้อย่างเพียงพอ นักพัฒนาบางคนได้แนะนำทางเลือกอื่น เช่น Redbean ที่บรรจุเว็บไซต์ลงในไฟล์ executable เดียว หรือการใช้ lightweight framework ในภาษาที่ต้องการ

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

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

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

อ้างอิง: my website is one binary