นี่เป็นคำถามใหญ่และต้องการคำตอบที่ยาวเพื่อให้สมบูรณ์ดังนั้นฉันจะพูดถึงความแตกต่างที่สำคัญที่สุดส่วนหนึ่ง ขออภัยที่ยังคงเป็นคำตอบที่ยาว
คล้ายกันยังไง?
คุณพูดถูกจริงๆเมื่อคุณพูดว่า:
สำหรับตัวอย่างพื้นฐานดูเหมือนจะคล้ายกัน
ทั้งสองเฟรมเวิร์กกำลังแก้ปัญหาพื้นฐานเดียวกัน: จัดเตรียม API ที่สะดวกสำหรับการสร้างเซิร์ฟเวอร์ HTTP ในโหนด กล่าวคือสะดวกกว่าการใช้http
โมดูลเนทีฟระดับล่างเพียงอย่างเดียว http
โมดูลสามารถทำทุกอย่างที่เราต้องการ แต่มันเป็นเรื่องน่าเบื่อที่จะเขียนโปรแกรมด้วย
เพื่อให้บรรลุเป้าหมายนี้ทั้งคู่ใช้แนวคิดที่มีอยู่ในเว็บเฟรมเวิร์กระดับสูงมาเป็นเวลานาน: การกำหนดเส้นทางตัวจัดการปลั๊กอินโมดูลการพิสูจน์ตัวตน พวกเขาอาจไม่ได้มีชื่อเหมือนกันเสมอไป แต่ก็เทียบเท่ากันโดยประมาณ
ตัวอย่างพื้นฐานส่วนใหญ่มีลักษณะดังนี้:
- สร้างเส้นทาง
- เรียกใช้ฟังก์ชันเมื่อมีการร้องขอเส้นทางเตรียมการตอบสนอง
- ตอบกลับคำขอ
ด่วน:
app.get('/', function (req, res) {
getSomeValue(function (obj) {
res.json({an: 'object'});
});
});
Hapi:
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
getSomeValue(function (obj) {
reply(obj);
});
}
});
ความแตกต่างไม่ได้แหวกแนวตรงนี้ใช่ไหม แล้วทำไมต้องเลือกอันอื่น?
แตกต่างกันอย่างไร?
คำตอบง่ายๆคือ hapi มีมากกว่านั้นมากและทำอะไรได้มากกว่านอกกรอบ นั่นอาจไม่ชัดเจนเมื่อคุณดูตัวอย่างง่ายๆจากด้านบน ในความเป็นจริงนี่เป็นความตั้งใจ กรณีที่เรียบง่ายจะถูกทำให้เรียบง่าย ลองตรวจสอบความแตกต่างที่สำคัญบางประการ:
ปรัชญา
Express ตั้งใจให้น้อยที่สุด ด้วยการมอบ API ขนาดเล็กให้กับคุณโดยมีเพียงการปัดฝุ่นบาง ๆ ที่ด้านบนhttp
คุณยังคงเป็นตัวของตัวเองอย่างมากในแง่ของการเพิ่มฟังก์ชันเพิ่มเติม หากคุณต้องการที่จะอ่านเนื้อความของการร้องขอเข้ามา (ค่อนข้างเป็นงานที่ร่วมกัน) คุณจำเป็นต้องติดตั้งโมดูลที่แยกต่างหาก หากคุณคาดว่าจะมีการส่งเนื้อหาประเภทต่างๆไปยังเส้นทางนั้นคุณต้องตรวจสอบไฟล์Content-type
ส่วนหัวเพื่อตรวจสอบว่าเป็นประเภทใดและแยกวิเคราะห์ตามนั้น (form-data vs JSON vs multi-part เป็นต้น) โดยมักใช้โมดูลแยกกัน .
hapi มีชุดคุณลักษณะที่หลากหลายซึ่งมักเปิดเผยผ่านตัวเลือกการกำหนดค่าแทนที่จะต้องเขียนโค้ด ตัวอย่างเช่นหากเราต้องการตรวจสอบให้แน่ใจว่าเนื้อหาคำขอ (payload) ถูกอ่านลงในหน่วยความจำอย่างสมบูรณ์และแยกวิเคราะห์อย่างเหมาะสม (โดยอัตโนมัติตามประเภทเนื้อหา) ก่อนที่ตัวจัดการจะรันมันเป็นเพียงตัวเลือกง่ายๆ:
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
คุณสมบัติ
คุณจะต้องเปรียบเทียบเอกสาร API ของทั้งสองโครงการเพื่อดูว่า hapi มีชุดคุณลักษณะที่ใหญ่กว่า
hapi มีคุณสมบัติบางอย่างต่อไปนี้ในตัวที่ Express ไม่มี (เท่าที่ฉันรู้):
ความสามารถในการขยายและการแยกส่วน
hapi และ Express ไปเกี่ยวกับการขยายตัวในวิธีที่แตกต่างกันมาก ด้วย Express คุณมีฟังก์ชันมิดเดิลแวร์ ฟังก์ชันมิดเดิลแวร์เป็นเหมือนตัวกรองที่คุณซ้อนกันและคำขอทั้งหมดจะทำงานผ่านก่อนที่จะกดปุ่มตัวจัดการของคุณ
hapi มีวงจรชีวิตของคำขอและมีจุดขยายซึ่งเทียบได้กับฟังก์ชันมิดเดิลแวร์ แต่มีจุดที่กำหนดไว้หลายจุดในวงจรชีวิตของคำขอ
หนึ่งในเหตุผลที่ Walmart สร้าง hapi และหยุดใช้ Express คือความยุ่งยากในการแบ่งแอป Express ออกเป็นส่วน ๆ แยกจากกันและมีสมาชิกในทีมที่แตกต่างกันทำงานอย่างปลอดภัย ด้วยเหตุนี้พวกเขาจึงสร้างระบบปลั๊กอินใน hapi
ปลั๊กอินเป็นเหมือนแอปพลิเคชันย่อยคุณสามารถทำทุกอย่างที่ทำได้ในแอป hapi เพิ่มเส้นทางจุดขยายและอื่น ๆ ในปลั๊กอินคุณสามารถมั่นใจได้ว่าคุณจะไม่ทำลายส่วนอื่นของแอปพลิเคชันเนื่องจากคำสั่งของ การลงทะเบียนเส้นทางไม่สำคัญและคุณไม่สามารถสร้างเส้นทางที่ขัดแย้งกันได้ จากนั้นคุณสามารถรวมปลั๊กอินนี้เข้ากับเซิร์ฟเวอร์และปรับใช้งานได้
ระบบนิเวศ
เนื่องจาก Express ช่วยให้คุณออกนอกกรอบได้เพียงเล็กน้อยคุณจึงต้องมองออกไปข้างนอกเมื่อต้องการเพิ่มอะไรในโครงการของคุณ หลายครั้งที่ทำงานกับ hapi คุณลักษณะที่คุณต้องการมีอยู่ในตัวหรือมีโมดูลที่สร้างโดยทีมงานหลัก
มินิมอลฟังดูดี แต่ถ้าคุณกำลังสร้างแอปที่ใช้งานจริงอย่างจริงจังโอกาสที่คุณจะต้องการสิ่งเหล่านี้ทั้งหมดในที่สุด
ความปลอดภัย
hapi ได้รับการออกแบบโดยทีมงานที่ Walmart เพื่อใช้งานการจราจรในวัน Black Friday ดังนั้นความปลอดภัยและความมั่นคงจึงเป็นเรื่องสำคัญที่สุด ด้วยเหตุนี้เฟรมเวิร์กจึงทำสิ่งต่างๆมากมายเป็นพิเศษเช่นการ จำกัด ขนาดน้ำหนักบรรทุกที่เข้ามาเพื่อป้องกันไม่ให้หน่วยความจำกระบวนการของคุณหมด นอกจากนี้ยังมีตัวเลือกสำหรับสิ่งต่างๆเช่น max event loop delay หน่วยความจำ RSS สูงสุดที่ใช้และขนาดสูงสุดของ v8 heap ซึ่งเซิร์ฟเวอร์ของคุณจะตอบสนองด้วยการหมดเวลา 503 แทนที่จะหยุดทำงาน
สรุป
ประเมินพวกเขาทั้งตัวคุณเอง นึกถึงความต้องการของคุณและข้อใดในสองข้อที่ตอบโจทย์ข้อกังวลที่สุด แช่ตัวในสองชุมชน (IRC, Gitter, Github) ดูว่าคุณชอบอะไร อย่าเพิ่งเอาคำพูดของฉัน และแฮ็คอย่างมีความสุข!
การปฏิเสธความรับผิด: ฉันมีความลำเอียงในฐานะผู้เขียนหนังสือเกี่ยวกับ hapiและข้างต้นเป็นความคิดเห็นส่วนตัวของฉันเป็นส่วนใหญ่