SCT

กำลังเตรียมประสบการณ์ดิจิทัล

Cloudflare เขียน module registry ของ Workers ใหม่: ทำไมการเปลี่ยนจากพาธเป็น URL ถึงปลดล็อกความเข้ากันได้กับ Node.js

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

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

ปัญหาของระบบเดิม: ตัวระบุโมดูลไม่ใช่ URL

ระบบเดิมของ Workers ปฏิบัติกับตัวระบุโมดูลเหมือนพาธในระบบไฟล์ ไม่ใช่ URL ผลที่ตามมาคือความสามารถมาตรฐานของ JavaScript หลายอย่างทำงานไม่ได้ เช่น import.meta.url และ import.meta.resolve() การแปลงตัวระบุแบบสัมพัทธ์ก็ไม่ได้ทำตามกฎการแปลง URL มาตรฐาน และโปรโตคอลอย่าง node: ถูกจัดการเป็นเพียงคำนำหน้าสตริงที่เขียนเงื่อนไขพิเศษไว้

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

ระบบใหม่: URL เป็นตัวระบุ คอมไพล์เมื่อถูกเรียก และแบ่งปันแคช

ระบบที่เขียนใหม่ใช้ URL เป็นรูปแบบตัวระบุ และออกแบบให้การคอมไพล์แบบขี้เกียจกับการแบ่งปันแคชเป็นคุณสมบัติพื้นฐานตั้งแต่แรก ไม่ใช่สิ่งที่มาเติมทีหลัง โมดูลจะถูกคอมไพล์เมื่อถูก import ครั้งแรกเท่านั้น แคชของโค้ดถูกแบ่งปันข้าม isolate ที่รัน Worker เดียวกัน และตัวระบุถูกแปลงเป็น URL จริงที่รองรับทั้ง query string และ fragment

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

ความเข้ากันได้กับ Node.js ที่ได้เพิ่มมา

การเปลี่ยนฐานคิดครั้งนี้ปลดล็อกหลายอย่างพร้อมกัน ได้แก่ import.meta.url, import.meta.main และ import.meta.resolve() ที่ทำงานได้จริง พฤติกรรมของ require(esm) ที่เป็นไปตามกฎของ Node.js การตรวจสอบ import attribute ที่ถูกต้อง โดยปฏิเสธชนิดที่ไม่รองรับอย่าง text การรองรับการนำเข้า WebAssembly แบบ source phase ด้วยรูปแบบ import source wasmModule from './add.wasm' และคลาสของข้อผิดพลาดที่สอดคล้องกันไม่ว่าจะ import ด้วยวิธีใด

สิ่งที่นักพัฒนาต้องทำเอง

ระบบใหม่ไม่ได้เปิดใช้อัตโนมัติ และจะไม่เปิดตามวันที่ compatibility date ใด ๆ นักพัฒนาต้องเปิดเองด้วยแฟล็ก new_module_registry ในไฟล์ตั้งค่า โดยเพิ่มค่าลงในรายการ compatibility_flags การเลือกให้เป็นการเปิดใช้แบบตั้งใจแบบนี้เป็นแนวทางที่สมเหตุสมผลสำหรับการเปลี่ยนแปลงที่กระทบพฤติกรรมการแปลงตัวระบุ เพราะโปรเจกต์ที่พึ่งพาพฤติกรรมเดิมจะไม่ถูกเปลี่ยนโดยไม่รู้ตัว

อีกความเปลี่ยนแปลงที่มีผลทันทีคือขีดจำกัดขนาด Workers รองรับแอปพลิเคชันขนาดถึง 64 MiB ในทุกแผน และขีดจำกัดขนาดบันเดิลหลังบีบอัดถูกยกเลิกไป ซึ่งเปิดทางให้โปรเจกต์ที่มีไลบรารีจำนวนมากย้ายขึ้นมาได้โดยไม่ต้องตัดฟีเจอร์ออก

บทเรียนที่นำไปใช้ได้แม้ไม่ได้ใช้ Workers

กรณีนี้เป็นตัวอย่างที่ดีของการเลือกฐานคิดผิดตั้งแต่ต้นแล้วต้องจ่ายทีหลัง การมองตัวระบุโมดูลเป็นพาธแทนที่จะเป็น URL ดูเหมือนรายละเอียดเล็ก ๆ ในตอนออกแบบ แต่กลายเป็นข้อจำกัดที่ทำให้รองรับมาตรฐานใหม่ไม่ได้เป็นปี ๆ บทเรียนคือเมื่อมีมาตรฐานกลางอยู่แล้ว การเลือกทำตามมาตรฐานตั้งแต่แรกมักถูกกว่าการประดิษฐ์รูปแบบของตัวเอง

สำหรับทีมพัฒนาเว็บในไทยที่ใช้ Workers หรือกำลังพิจารณาย้ายระบบขึ้นแพลตฟอร์มไร้เซิร์ฟเวอร์ การเปิดแฟล็กนี้ในสภาพแวดล้อมทดสอบก่อนคือขั้นตอนที่ควรทำ เพราะพฤติกรรมการแปลงตัวระบุที่เปลี่ยนไปอาจกระทบไลบรารีที่พึ่งพารูปแบบเดิม และควรตรวจให้ครบก่อนใช้กับระบบจริง ทีมงาน Smart Cyber Tech รับทำเว็บไซต์และเว็บแอปพลิเคชัน React และ Next.js รวมถึงวางระบบบนแพลตฟอร์มขอบเครือข่ายให้รองรับผู้ใช้จำนวนมากโดยคุมค่าใช้จ่ายได้ ปรึกษาได้ที่ แบบฟอร์มติดต่อ

สรุปสาระสำคัญ

  • ปัญหาของระบบเดิม: ตัวระบุโมดูลไม่ใช่ URL
  • ระบบใหม่: URL เป็นตัวระบุ คอมไพล์เมื่อถูกเรียก และแบ่งปันแคช
  • ความเข้ากันได้กับ Node.js ที่ได้เพิ่มมา
แหล่งอ้างอิงเรียบเรียงจาก Cloudflare Blog — How we rebuilt Cloudflare Workers' module registry for Node.js compatibility — อ่านบทความต้นฉบับ
ภาพปก: Cloudflare Blog · ลิขสิทธิ์ภาพเป็นของเจ้าของต้นฉบับ ใช้ประกอบการรายงานพร้อมอ้างอิงแหล่งที่มา
มีคำถามเพิ่มเติมเกี่ยวกับบทความนี้? เขียนหาเราได้ที่ info@smart-cyber-tech.com
บริการที่เกี่ยวข้องจากทีมงาน Smart Cyber Tech

บทความอื่นที่เกี่ยวข้อง

บทความที่เกี่ยวข้อง

MCP เวอร์ชัน 2026-07-28 กลายเป็นโปรโตคอลไร้สถานะ: บทเรียนออกแบบ API ให้เอเจนต์เรียกใช้ได้จริง ข้อมูลและ AI

MCP เวอร์ชัน 2026-07-28 กลายเป็นโปรโตคอลไร้สถานะ: บทเรียนออกแบบ API ให้เอเจนต์เรียกใช้ได้จริง

สเปก Model Context Protocol ฉบับ 2026-07-28 เขียนใหม่เกือบทั้งฉบับ เปลี่ยน MCP จากโปรโตคอลที่ต้องเปิดการเชื่อมต่อค้างไว้ให้กลายเป็นโปรโตคอลไร้สถานะที่รันบนโครงสร้าง serverless ธรรมดาได้ Cloudflare ซึ่งร่วมออกแบบและใช้งานจริงมาก่อนสเปกออก สรุปว่าอะไรเปลี่ยน ทำไมถึงเปลี่ยน และผู้พัฒนาต้องย้ายอย่างไร บทความนี้เรียบเรียงสาระสำคัญพร้อมมุมมองสำหรับทีมในไทยที่กำลังเปิด API ให้เอเจนต์ AI เรียกใช้

อ่านบทความ
ToolHive: รัน MCP server ในคอนเทนเนอร์แบบปลอดภัยด้วยเครื่องมือโอเพนซอร์ส ก่อนให้เอเจนต์ AI เข้าถึงระบบภายใน ความปลอดภัย

ToolHive: รัน MCP server ในคอนเทนเนอร์แบบปลอดภัยด้วยเครื่องมือโอเพนซอร์ส ก่อนให้เอเจนต์ AI เข้าถึงระบบภายใน

MCP server คือตัวเชื่อมที่ทำให้ไคลเอนต์ AI อย่าง Cursor หรือ Claude Code เรียกใช้เครื่องมือและข้อมูลภายในองค์กรได้ แต่ส่วนใหญ่ถูกรันตรง ๆ บนเครื่องนักพัฒนาพร้อมสิทธิ์และรหัสผ่านทั้งหมดที่เครื่องนั้นมี ToolHive จาก Stacklok เป็นแพลตฟอร์มโอเพนซอร์สสัญญาอนุญาต Apache 2.0 ที่จับ MCP server แต่ละตัวใส่คอนเทนเนอร์ของตัวเอง กำหนดสิทธิ์และเครือข่ายเป็นรายตัว และเพิ่มการยืนยันตัวตนกับบันทึกการใช้งานให้ตั้งแต่ระดับทีมจนถึงคลัสเตอร์ Kubernetes บทความนี้สรุปส่วนประกอบและวิธีเริ่มใช้ พร้อมข้อควรระวังสำหรับองค์กรไทย

อ่านบทความ
รันเอเจนต์หลายตัวพร้อมกันอย่างปลอดภัย: แยกงานด้วย Git worktree ให้แต่ละเซสชันไม่รบกวนกัน DevOps

รันเอเจนต์หลายตัวพร้อมกันอย่างปลอดภัย: แยกงานด้วย Git worktree ให้แต่ละเซสชันไม่รบกวนกัน

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

อ่านบทความ

ติดต่อเพื่อขอรับคำปรึกษาจากทีมงาน

ตั้งแต่ประเมินระบบปัจจุบัน วางแผน จนถึงลงมือพัฒนา — คุยกับเราได้โดยไม่มีค่าใช้จ่าย

ปรึกษาทีมของเรา