Ember.js หรือ Backbone.js สำหรับแบ็กเอนด์พักผ่อน [ปิด]


98

ฉันรู้อยู่แล้วว่า ember.js เป็นวิธีที่มีน้ำหนักมากกว่าในทางตรงกันข้ามกับ backbone.js ฉันอ่านบทความมากมายเกี่ยวกับทั้งสองอย่าง

ฉันกำลังถามตัวเองว่าเฟรมเวิร์กใดทำงานได้ง่ายกว่าเป็นส่วนหน้าสำหรับแบ็กเอนด์ส่วนที่เหลือของราง สำหรับ backbone.js ฉันเห็นวิธีต่างๆในการเรียกแบ็กเอนด์ส่วนที่เหลือ สำหรับถ่านดูเหมือนว่าฉันจะต้องรวมไลบรารีเพิ่มเติมเช่น 'data' หรือ 'resources' เหตุใดจึงมีห้องสมุดสองแห่งสำหรับสิ่งนี้

แล้วทางเลือกที่ดีกว่าคืออะไร? ไม่มีตัวอย่างมากมายในการเชื่อมต่อส่วนหน้ากับแบ็กเอนด์ด้วย อะไรคือตัวอย่างการทำงานที่ดีสำหรับการพักผ่อนแบ็กเอนด์เรียกสิ่งนี้:

URI: ../restapi/topics รับข้อมูลรับรองการตรวจสอบสิทธิ์: admin / รูปแบบที่ถูกต้อง: json


3
ต้องชอบคำถามที่ "ไม่สร้างสรรค์" แต่คำตอบที่ได้รับการไตร่ตรองมาเป็นอย่างดียังคงได้รับการโหวตมากกว่า 240 ครั้ง
Andrew

คำตอบ:


257

ตรงกันข้ามกับความคิดเห็นที่เป็นที่นิยม Ember.js ไม่ใช่ 'วิธีที่มีน้ำหนักมากขึ้น' สำหรับ Backbone.js เป็นเครื่องมือประเภทต่างๆที่กำหนดเป้าหมายผลิตภัณฑ์ปลายทางที่แตกต่างกันโดยสิ้นเชิง จุดที่น่าสนใจของ Ember คือแอปพลิเคชันที่ผู้ใช้จะเปิดแอปพลิเคชันไว้เป็นเวลานานอาจจะทั้งวันและการโต้ตอบกับมุมมองของแอปพลิเคชันหรือข้อมูลที่อยู่เบื้องหลังจะทำให้เกิดการเปลี่ยนแปลงในลำดับชั้นของมุมมองอย่างลึกซึ้ง Ember มีขนาดใหญ่กว่า Backbone แต่ต้องขอบคุณExpires, Cache-Controlเรื่องนี้เฉพาะในการโหลดครั้งแรก หลังจากใช้งานประจำวันสองวัน 30k พิเศษจะถูกบดบังด้วยการถ่ายโอนข้อมูลไม่ช้าก็เร็วหากเนื้อหาของคุณเกี่ยวข้องกับรูปภาพ

Backbone เหมาะอย่างยิ่งสำหรับแอปพลิเคชันที่มีสถานะจำนวนน้อยซึ่งลำดับชั้นของมุมมองยังคงค่อนข้างราบเรียบและผู้ใช้มีแนวโน้มที่จะเข้าถึงแอปไม่บ่อยหรือในช่วงเวลาสั้น ๆ รหัสของ Backbone จะยังคงสั้นและน่ารักเพราะทำให้สมมติฐานว่าข้อมูลที่สำรอง DOM จะถูกโยนทิ้งไปและทั้งสองรายการจะถูกรวบรวมหน่วยความจำ: https://github.com/documentcloud/backbone/issues/231#issuecomment-4452400ขนาดที่เล็กลงของ Backbone ทำให้เหมาะกับการโต้ตอบสั้น ๆ

แอพที่ผู้คนเขียนในเฟรมเวิร์กทั้งสองสะท้อนถึงการใช้งานเหล่านี้: แอพ Ember.js ประกอบด้วยเว็บแดชบอร์ดของ Square , Zendesk (อย่างน้อยก็คืออินเทอร์เฟซตัวแทน / การออกตั๋ว) และตัวกำหนดตารางเวลาของ Groupon : แอปพลิเคชันทั้งหมดที่ผู้ใช้อาจใช้เวลาทั้งวันในการทำงาน

ปพลิเคชัน Backbone มุ่งเน้นที่สั้น ๆ หรือการโต้ตอบแบบสบาย ๆ ที่มักจะส่วนเล็ก ๆ ของหน้าคงมีขนาดใหญ่: Airbnb , Khan Academy , แผนที่ของ Foursquare และรายการ

คุณสามารถใช้ Backbone เพื่อสร้างแอปพลิเคชันประเภทที่ Ember กำหนดเป้าหมาย (เช่นRdio ) โดยก) เพิ่มจำนวนรหัสแอปพลิเคชันที่คุณรับผิดชอบเพื่อหลีกเลี่ยงปัญหาเช่นการรั่วไหลของหน่วยความจำหรือเหตุการณ์ซอมบี้ (ฉันไม่แนะนำวิธีนี้เป็นการส่วนตัว) หรือ b) โดยการเพิ่มไลบรารีของบุคคลที่สามเช่นbackbone.marionetteหรือCoccyx - มีไลบรารีเหล่านี้จำนวนมากที่พยายามให้ฟังก์ชันการทำงานที่ทับซ้อนกันคล้าย ๆ กันและคุณอาจจะต้องประกอบเฟรมเวิร์กที่กำหนดเองซึ่งมีขนาดใหญ่กว่าและต้องใช้โค้ดกาวมากกว่า หากคุณเพิ่งใช้ Ember

ในที่สุดคำถาม "ที่จะใช้" มีสองคำตอบ

อันดับแรก "โดยทั่วไปแล้วฉันควรใช้อะไรในอาชีพของฉัน": ทั้งสองอย่างนี้เหมือนกับว่าคุณจะได้เรียนรู้เครื่องมือเฉพาะสำหรับงานที่คุณต้องการจะทำในอนาคต คุณไม่เคยถามว่า "กระดูกสันหลังหรือ D3?"; "กระดูกสันหลังหรือ Ember" เป็นคำถามที่โง่พอ ๆ กัน

ประการที่สอง "สิ่งที่ฉันควรใช้โดยเฉพาะในโครงการถัดไปของฉัน": ขึ้นอยู่กับโครงการ ทั้งสองจะสื่อสารกับเซิร์ฟเวอร์ Rails ได้อย่างง่ายดายเท่าเทียมกัน หากโปรเจ็กต์ถัดไปของคุณเกี่ยวข้องกับเพจต่างๆที่สร้างโดยเซิร์ฟเวอร์ที่เรียกว่า "เกาะแห่งความร่ำรวย" ที่ JavaScript จัดหาให้ใช้ Backbone หากโปรเจ็กต์ถัดไปของคุณดันการโต้ตอบทั้งหมดเข้าสู่สภาพแวดล้อมเบราว์เซอร์ให้ใช้ Ember


4
การตอบสนองที่ดี Trek แค่อยากแสดงความคิดเห็นที่นี่ExpiresและCache-Controlช่วยได้น้อยกว่าที่คนทั่วไปคิดโดยเฉพาะอย่างยิ่งในแง่ของอุปกรณ์เคลื่อนที่ที่มักจะเพิกเฉย ฉันจำได้ว่า iOS เวอร์ชันหนึ่งเพิกเฉยโดยสิ้นเชิง (แต่ยังคงอยู่ในรายการแคช HTML5) นอกจากนี้ค่าส่วนหัวเหล่านี้จะไม่ช่วยในระหว่างการเยี่ยมชมครั้งแรกจากผู้ใช้ซึ่งโดยทั่วไปแล้วสิ่งสำคัญที่สุดในการตัดสินใจว่าผู้ใช้จะอยู่และใช้แอปของคุณหรือไม่ การพูดความแตกต่างของไฟล์ 30kb ทั้งหมดนั้นดูเหมือนจะไม่ใช่เรื่องใหญ่สำหรับฉัน นั่นคือดิบหรือความแตกต่าง 30k ที่ลดลงและ gzipped?
Mauvis Ledford

11
หากคุณไปดูแอปพลิเคชันจริงที่เป็นสไตล์ที่ Ember มีไว้เพื่อช่วยสร้างคุณจะพบว่าไม่มี kbs ที่น่ารำคาญเหล่านั้นหลบหนี ไม่ว่าจะมาจาก Ember และรหัสแอปพลิเคชันของคุณมีขนาดเล็กกว่าหรือมาจากปลั๊กอินกระดูกสันหลังหรือมาจากโค้ดที่คุณเขียนเอง Wunderlistซึ่งคุณคิดว่าน่าจะเป็นนาฬิกาที่ "ธรรมดา" ในการโอนเงินประมาณ 300kb ฉันคิดว่ามันจะมีขนาดใกล้เคียงกับ Ember บางทีอาจจะเล็กกว่า - ไม่เคยเขียน Wunderlist สำเนาที่แน่นอนฉันไม่สามารถพูดได้ด้วยความมั่นใจ 100%
Trek Glowacki

1
ฉันเห็นด้วยแอปกระดูกสันหลังที่เป็นที่นิยมที่สุดของฉันในเทมเพลต 178kb + ที่บีบอัดและย่อขนาด เพียงแค่ชี้ให้เห็นว่าเราไม่ควรพึ่งพาการแคชเบราว์เซอร์อย่างไร
Mauvis Ledford

2
Trek คุณจะเห็นการวิเคราะห์การใช้ Backbone ในแอพที่มีรูปแบบการใช้งานเพิ่มเติมและการจัดการสถานะที่ซับซ้อน ฉันเคยผ่านประสบการณ์ในการแปลงแอปเดิมไปเป็น Backbone และต้องทำตามที่คุณระบุไว้ เราจำเป็นต้องผสานรวม Marionette และเขียนโค้ดกาวจำนวนมากสำหรับสิ่งต่างๆเช่นการกรองเส้นทางก่อน / หลังการลดการรั่วไหลของหน่วยความจำและการจัดการเหตุการณ์ที่ดีขึ้น
Mike Clymer

9
"คุณไม่เคยถาม Backbone หรือ D3" แน่นอน แต่ฉันนึกภาพออกง่ายๆว่าฉันใช้ D3 ร่วมกับ Backbone อาจยากกว่ามากที่จะจินตนาการถึงโครงการที่ใช้ Backbone และ Ember ร่วมกันในหน้าเดียว ดังนั้นฉันพบว่าคำถาม "กระดูกสันหลังหรือ Ember" ค่อนข้างยุติธรรม นี่คือโพสต์อื่นที่ฉันพบว่ามีข้อมูลค่อนข้างมากเพราะมันเปรียบเทียบทั้งสองเฟรมเวิร์กอย่างลึกซึ้งยิ่งขึ้น: net.tutsplus.com/tutorials/javascript-ajax/…
Shiprack

26

เพื่อให้คำตอบสั้น ๆ ง่ายขึ้น: สำหรับแบ็กเอนด์ RESTful ในขณะนี้คุณควรใช้ Backbone

เพื่อให้คำตอบที่ซับซ้อนขึ้น: ขึ้นอยู่กับสิ่งที่คุณกำลังทำจริงๆ ดังที่คนอื่น ๆ กล่าวไว้ว่า Ember ได้รับการออกแบบมาเพื่อสิ่งที่แตกต่างกันและจะดึงดูดผู้คนที่แตกต่างกัน คำตอบสั้น ๆ ของฉันขึ้นอยู่กับการรวมข้อกำหนด RESTful ของคุณ

ในขณะนี้ Ember-Data (ซึ่งดูเหมือนจะเป็นกลไกการคงอยู่เริ่มต้นภายใน Ember) อยู่ไกลจากความพร้อมในการผลิต สิ่งนี้หมายความว่ามีบั๊กค่อนข้างน้อยและที่สำคัญไม่สนับสนุน URI ที่ซ้อนกัน (/ posts / 2 / comments / 4556 เป็นต้น) หาก REST เป็นความต้องการของคุณคุณจะต้องหลีกเลี่ยงสิ่งนี้ในขณะนี้หากคุณเลือก Ember (เช่นคุณจะต้องแฮ็กเข้าไปรอใช้งานบางอย่างเช่น Ember-Data ตั้งแต่เริ่มต้นด้วยตัวคุณเองหรือไม่ใช้ -very-RESTful URI) Ember-Data ไม่ได้เป็นส่วนหนึ่งของ Ember อย่างเคร่งครัดดังนั้นจึงเป็นไปได้ทั้งหมด

ความแตกต่างหลักระหว่างทั้งสองนอกเหนือจากขนาดโดยพื้นฐานแล้ว:

Ember พยายามทำเพื่อคุณให้มากที่สุดเพื่อที่คุณจะได้ไม่ต้องเขียนโค้ดมากนัก มันมีลำดับชั้นมากและหากแอปของคุณมีลำดับชั้นมากก็น่าจะเหมาะสม เนื่องจากมีประโยชน์มากมายสำหรับคุณจึงอาจเป็นเรื่องยากที่จะทราบว่าจุดบกพร่องมาจากไหนและสาเหตุที่ทำให้เกิดพฤติกรรมที่ไม่คาดคิด (มี "เวทมนตร์" มากมาย) หากคุณมีแอปที่เหมาะกับประเภทของแอปที่ Ember คาดหวังให้คุณสร้างขึ้นมาก็ไม่น่าจะเป็นปัญหา

Backbone พยายามทำเพื่อคุณให้น้อยที่สุดเพื่อให้คุณสามารถหาเหตุผลเกี่ยวกับสิ่งที่เกิดขึ้นและสร้างสถาปัตยกรรมที่เหมาะกับแอปของคุณ (แทนที่จะสร้างแอปที่เหมาะกับสถาปัตยกรรมของเฟรมเวิร์กที่คุณใช้) การเริ่มต้นทำได้ง่ายกว่ามาก แต่ถ้าคุณไม่ระมัดระวังคุณสามารถจบลงด้วยความวุ่นวายได้อย่างรวดเร็ว มันไม่ได้ทำสิ่งต่างๆเช่นคุณสมบัติที่คำนวณเหตุการณ์การยกเลิกการผูกอัตโนมัติ ฯลฯ และปล่อยให้มันขึ้นอยู่กับคุณดังนั้นคุณจะต้องใช้งานหลายอย่างด้วยตัวคุณเอง (หรืออย่างน้อยก็เลือกไลบรารีที่ทำเพื่อคุณ) แม้ว่าจะเป็นเช่นนั้น ค่อนข้างเป็นประเด็น

อัปเดต : ดูเหมือนว่าเมื่อเร็ว ๆ นี้ Ember สนับสนุน URI ที่ซ้อนกันแล้วดังนั้นฉันจึงคิดว่าคำถามนี้ขึ้นอยู่กับว่าคุณชอบเวทมนตร์มากแค่ไหนและ Ember นั้นเหมาะสมกับแอปของคุณหรือไม่


5
"ขับเคลื่อนไม่สนับสนุน URI ที่ซ้อนกัน (/ โพสต์ / 2 / ความเห็น / 4556 ตัวอย่าง)" นี่คือที่เกี่ยวข้องกระทำจากสัปดาห์ที่สองที่ผ่านมา: github.com/emberjs/data/commit/... ทราบว่าอาจเป็นเรื่องยากที่จะติดตามกรอบการทำงานก่อนเผยแพร่ที่เคลื่อนไหวอย่างรวดเร็ว แต่เราควรตั้งเป้าหมายเพื่อความถูกต้องเสมอเมื่อพูดกับผู้มีอำนาจและให้คำแนะนำ!
Trek Glowacki

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

มันมาจากการรวมสาขาการปรับปรุงความสัมพันธ์เมื่อเร็ว ๆ นี้ เราได้ติดตามปัญหาเก่า ๆ อย่างช้าๆและจะปิดในสัปดาห์นี้
Trek Glowacki

3

ฉันคิดว่าคำถามของคุณจะถูกบล็อกในไม่ช้า :) มีข้อโต้แย้งเล็กน้อยระหว่างสองกรอบ

โดยพื้นฐานแล้ว Backbone ไม่ได้ทำอะไรมากมายและนั่นคือเหตุผลที่ฉันชอบ: คุณจะต้องเขียนโค้ดเป็นจำนวนมาก แต่คุณจะเขียนโค้ดให้ถูกที่ Ember ทำหลายสิ่งหลายอย่างดังนั้นคุณควรดูว่ามันกำลังทำอะไรอยู่

การอภิปรายเกี่ยวกับเซิร์ฟเวอร์เป็นหนึ่งในไม่กี่สิ่งที่ Backbone ทำและทำได้ดีมาก ดังนั้นฉันจะเริ่มต้นด้วย Backbone แล้วลองใช้ Ember หากคุณไม่พอใจทั้งหมด

นอกจากนี้คุณยังสามารถฟังพอดคาสต์นี้ที่ Jeremy Ashkenas ผู้สร้าง Backbone และ Yehuda Katz สมาชิกของ Ember ได้พูดคุยกันอย่างสนุกสนาน


2
ขอบคุณ. คุณสามารถพูดอะไรเกี่ยวกับส่วนขยาย rets ของถ่าน ใช้ข้อมูลหรือทรัพยากรดีกว่าไหม คุณสามารถยกตัวอย่างง่ายๆของการเรียก api ที่เหลือได้หรือไม่?
Robin Wieruch

1
คำตอบสั้น ๆ คือห้องสมุดแตกต่างกันไปตลอดเวลาและฉันไม่สามารถตอบสนองคุณตามประสบการณ์เดิมของฉันได้ (ฉันทำด้วยตัวเองเพื่อประเมิน) ฉันคิดว่าโพสต์นี้จะบอกคุณได้มากกว่าที่ฉันทำได้: stackoverflow.com/questions/8623091/ember-js-rest-api
Nicolas Zozol

1
ฉันเห็นโพสต์นี้แล้ว นั่นคือเหตุผลที่ฉันถาม :)
Robin Wieruch

2
@NicolasZozol พอดคาสต์ไหน ลิงค์?
deepak

3
javascriptjabber.com/004-jsj-backbone-js-with-jeremy-ashkenasตั้งแต่เดือนกุมภาพันธ์ ก่อนที่มันจะชัดเจนขึ้นว่าเฟรมเวิร์กเหล่านี้ไม่มีอยู่จริงในเวทีที่ทับซ้อนกัน คุณสามารถได้ยิน Yehuda และ Jeremy เพียงแค่พูดคุยกันโดยไม่ได้ทำการเปรียบเทียบใด ๆ
Trek Glowacki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.