เปิดตัว Express v5 - ยุคใหม่ของเฟรมเวิร์ก Node.js
(expressjs.com)- PR แรกของ v5 ถูกเปิดไว้ตั้งแต่ 10 ปีก่อน และในที่สุดก็ถูก merge และ publish แล้ว
- เป็นรีลีสที่ถูกทำให้เรียบง่ายโดยตั้งใจ เพื่อเปิดทางให้มีการเปลี่ยนแปลงที่ทรงอิทธิพลยิ่งขึ้นในรีลีสถัดไป
- อีกทั้งยังเป็นการส่งสัญญาณให้ ecosystem ของ Node.js รู้ว่า Express กลับมาเดินหน้าอีกครั้ง
การเปลี่ยนแปลงสำคัญ
-
การเปลี่ยนแปลงการรองรับเวอร์ชันของ Node.js
- ยุติการรองรับ Node.js 0.10 และเปลี่ยนเป็นรองรับ Node 18 ขึ้นไป
- แก้ปัญหาที่การรองรับ Node.js เวอร์ชันเก่าทำให้การเปลี่ยนแปลงสำคัญด้านประสิทธิภาพและการบำรุงรักษาต้องล่าช้า
- ทำให้สามารถนำความสามารถใหม่ของภาษาและรันไทม์มาใช้ และถอด dependency ที่ไม่จำเป็นออกได้
- รับรู้ถึงความยากลำบากขององค์กรที่ยังใช้ Node.js เวอร์ชันเก่า และจะร่วมมือกับ HeroDevs เพื่อมอบ "การสนับสนุนแบบไม่มีกำหนด" ที่ยังคงให้ security patch สำคัญต่อไปหลัง v4 สิ้นสุดการสนับสนุน
-
การเปลี่ยนแปลงด้านการจับคู่เส้นทางและ regex
- ไลบรารี
path-to-regexpถูกอัปเดตจาก 0.x เป็น 8.x ทำให้รวมการเปลี่ยนแปลงที่สะสมมาหลายปี - ยกเลิกการรองรับ regex subexpression (เช่น
/:foo(\\d+))- ถูกถอดออกเพื่อป้องกันการโจมตีแบบ ReDoS
- วิธีการย้าย: แนะนำให้ใช้ไลบรารีตรวจสอบความถูกต้องของอินพุตที่แข็งแรง
- มี pattern แบบย่อสำหรับรูปแบบเส้นทางที่ใช้บ่อย
:name?เปลี่ยนเป็น{:name}*เปลี่ยนเป็น*name- เพิ่ม
(,),[,],?,+,!เป็นอักขระสงวน
- ยกเลิกการรองรับ numeric parameter แบบมีลำดับ ต้องตั้งชื่อให้ทุก parameter
- ไลบรารี
-
การรองรับ Promise
- เพิ่มการรองรับ Promise ที่ถูก reject เพราะ error ที่เกิดขึ้นใน middleware
- ไม่ครอบคลุมกรณีการเรียก
nextจาก Promise ที่ resolve แล้ว - ในกรณีส่วนใหญ่ ตอนนี้สามารถเขียน middleware ได้แบบนี้:
app.use(async (req, res, next) => { req.locals.user = await getUser(req); next(); });
-
การเปลี่ยนแปลงของ body parser
- เพิ่มตัวเลือกสำหรับปรับความลึกของ urlencoded body เพื่อบรรเทา CVE-2024-45590 (ค่าเริ่มต้น 32)
- ถอด
bodyParser()middleware แบบรวมที่เลิกใช้แล้วออก req.bodyจะไม่ถูกเริ่มต้นเป็น{}เสมอไปอีกต่อไป- ค่าเริ่มต้นของ
extendedใน parser แบบurlencodedเปลี่ยนเป็น false - เพิ่มการรองรับการบีบอัดข้อมูลแบบไม่สูญเสียด้วย Brotli
-
ถอด method signature ที่เลิกใช้ออก
res.redirect('back')และres.location('back'): ไม่รองรับ magic string'back'อีกต่อไป ให้ใช้req.get('Referrer') || '/'อย่างชัดเจนแทน- signature ของ
res.send(status, body)และres.send(body, status): ให้ใช้res.status(status).send(body) - signature ของ
res.send(status): สำหรับการตอบกลับสถานะแบบสั้นให้ใช้res.sendStatus(status)และหากต้องการส่ง status code พร้อมเนื้อหาแบบเลือกได้ให้ใช้res.status(status).send() - มีการถอด method signature ที่เลิกใช้อื่น ๆ ออกด้วย (ดูรายละเอียดใน migration guide)
-
แนวทางการย้ายระบบและความปลอดภัย
- มี migration guide แบบละเอียดสำหรับนักพัฒนาที่จะย้ายจาก v4 ไป v5
- มี threat model แบบครอบคลุมที่ให้ข้อมูลเชิงลึกสำคัญในเรื่องอย่างการตรวจสอบความถูกต้องของอินพุตจากผู้ใช้และแนวปฏิบัติด้านความปลอดภัย เพื่อให้ใช้งาน Express ได้อย่างปลอดภัยและมั่นคง
ความเห็นของ GN⁺
- Express v5 เป็นรีลีสที่มุ่งเน้นการบอก ecosystem ของ Node.js ว่า Express กลับมาเคลื่อนไหวอีกครั้ง โดยเน้นการยุติการรองรับ Node.js เวอร์ชันเก่า การแก้ปัญหาด้านความปลอดภัย และการทำให้การบำรุงรักษาง่ายขึ้น
- รีลีสนี้ถูกทำให้เรียบง่ายโดยตั้งใจ เพื่อขจัดอุปสรรคใน ecosystem และเปิดทางให้เกิดการเปลี่ยนแปลงที่ส่งผลมากขึ้นในรีลีสถัดไป
- Express มีปรัชญาเป็นเว็บเฟรมเวิร์กสำหรับ Node.js ที่รวดเร็ว ไม่ยัดเยียดแนวทาง และมินิมอล ซึ่งช่วยมอบข้อมูลเชิงลึกสำคัญในด้านอย่างการตรวจสอบความถูกต้องของอินพุตจากผู้ใช้และแนวปฏิบัติด้านความปลอดภัย
- มีทั้งคู่มือแบบละเอียดสำหรับการย้ายไป Express v5 และ threat model แบบครอบคลุม เพื่อช่วยให้นักพัฒนาใช้งาน Express ได้อย่างปลอดภัยและเสถียร
- ผู้ดูแลชุดใหม่ของโปรเจกต์ Express ตั้งเป้าที่จะพัฒนา ecosystem ของ Express ให้เป็นเครื่องมือที่เสถียรและเชื่อถือได้ โดยจะร่วมมือกับชุมชนเพื่อแก้ปัญหาและปรับปรุงต่อไป
4 ความคิดเห็น
อ๋อ ในที่สุดก็รองรับ promise แล้วสินะครับ พวกเรายังใช้ express กันเยอะอยู่เลย 555; เป็นข่าวดีนะครับ
ส่วนใหญ่ก็ย้ายไปใช้ nestjs กันหมดแล้ว เลยแทบไม่มีโอกาสได้ใช้โดยตรงเท่าไร จริง ๆ ก็แทบไม่ต่างจากการใช้เซอร์เล็ตโดยตรง
ในที่สุดก็จัดการ
promiseerror ได้แล้ว แต่ตอนนี้ก็ยังไม่ค่อยแน่ใจว่ามีเหตุผลอะไรให้ต้องใช้มันอยู่ดีความคิดเห็นจาก Hacker News
อยากแสดงความขอบคุณต่อ Wes และทีม ต้องอ่านซ้ำสองรอบเลยว่า PR ของ v5 ถูกเปิดมาแล้ว 10 ปี คงต้องใช้ความพยายามมหาศาลในการเปลี่ยนแรงเฉื่อยของโปรเจ็กต์นี้ ขอแสดงความยินดีกับบทใหม่
ขอแสดงความยินดีกับทีม Express แม้จะมีเว็บเซิร์ฟเวอร์เฟรมเวิร์กของ Node JS อื่น ๆ มากมาย แต่ก็ไม่ย้ายไปใช้อย่างอื่นเพราะ Express มีทุกอย่างที่ต้องการ หวังว่าสถานะนี้จะคงอยู่ต่อไป
มีการพูดถึงว่า Express ยังไม่ใช่
latestขอบคุณ Wes และทีมสำหรับงานที่ทำ Express ยังเป็นตัวเลือกที่ชอบที่สุดบน nodejs และก็ดีที่มีการดูแลอย่างต่อเนื่อง
สงสัยว่าทำไมการออก v5 ถึงใช้เวลานานถึง 10 ปี
มีการพูดถึง perl 6
แนวคิดที่ให้รวมการตอบกลับเป็นส่วนหนึ่งของอินพุตของเส้นทางดูเหมือนเป็นแนวคิดแบบยุค 2010s ทุกวันนี้ของส่วนใหญ่มีเส้นทางที่รับคำขอแล้วส่งคืนการตอบกลับ ซึ่งเข้ากับ HTTP ได้ดีกว่า
ไม่เคยเห็นโมเดลแบบ "ย้ายของเดิมไปให้บริษัทเอกชนแล้วให้การสนับสนุน" มาก่อน
สงสัยว่า Express เทียบกับ koa, fastify และอื่น ๆ เป็นอย่างไร