Ember.js hoặc Backbone.js cho chương trình phụ trợ Restful [đã đóng]


98

Tôi đã biết rằng ember.js là một cách tiếp cận có trọng lượng lớn hơn trái ngược với backbone.js. Tôi đọc rất nhiều bài báo về cả hai.

Tôi đang tự hỏi mình, khung công tác nào hoạt động dễ dàng hơn với tư cách là giao diện người dùng cho phần phụ trợ phần còn lại của đường ray. Đối với backbone.js, tôi đã thấy các cách tiếp cận khác nhau để gọi phần phụ trợ nghỉ ngơi. Đối với ember, có vẻ như tôi phải thêm một số thư viện như 'dữ liệu' hoặc 'tài nguyên'. Tại sao có hai thư viện cho điều này?

Vậy sự lựa chọn tốt hơn là gì? Không có nhiều ví dụ để kết nối giao diện người dùng với phụ trợ. Ví dụ hoạt động tốt cho cuộc gọi nghỉ ngơi phụ trợ là gì:

URI: ../restapi/topics NHẬN thông tin xác thực: admin / secrect format: json


3
Tôi rất thích một câu hỏi "không mang tính xây dựng" nhưng câu trả lời hữu ích, được suy nghĩ kỹ lưỡng vẫn nhận được hơn 240 lượt ủng hộ.
Andrew

Câu trả lời:


257

Trái ngược với quan điểm phổ biến, Ember.js không phải là một 'cách tiếp cận nặng nề hơn' cho Backbone.js. Chúng là các loại công cụ khác nhau nhắm vào các sản phẩm cuối cùng hoàn toàn khác nhau. Điểm hấp dẫn của Ember là các ứng dụng mà người dùng sẽ giữ ứng dụng mở trong thời gian dài, có thể cả ngày và các tương tác với các chế độ xem của ứng dụng hoặc dữ liệu cơ bản sẽ kích hoạt những thay đổi sâu sắc trong hệ thống phân cấp chế độ xem. Ember lớn hơn Backbone, nhưng nhờ đó Expires, Cache-Controlđiều này chỉ quan trọng ở lần tải đầu tiên. Sau hai ngày sử dụng hàng ngày, 30k thêm đó sẽ bị lu mờ bởi việc truyền dữ liệu, sớm hơn nếu nội dung của bạn liên quan đến hình ảnh.

Backbone lý tưởng cho các ứng dụng có một số trạng thái nhỏ trong đó hệ thống phân cấp chế độ xem vẫn tương đối phẳng và nơi người dùng có xu hướng truy cập ứng dụng không thường xuyên hoặc trong khoảng thời gian ngắn hơn. Mã của Backbone vẫn ngắn và ngọt ngào vì nó tạo ra giả định rằng dữ liệu hỗ trợ DOM sẽ bị loại bỏ và cả hai mục sẽ được thu thập trong bộ nhớ: https://github.com/documentcloud/backbone/issues/231#issuecomment-4452400 Kích thước nhỏ hơn của Backbone cũng làm cho nó phù hợp hơn với các tương tác ngắn.

Các ứng dụng mà mọi người viết trong cả hai khuôn khổ phản ánh những công dụng này: Các ứng dụng Ember.js bao gồm bảng điều khiển web của Square , Zendesk (ít nhất là giao diện đại lý / bán vé) và công cụ lập lịch của Groupon : tất cả các ứng dụng mà người dùng có thể dành cả ngày để làm việc.

Các ứng dụng xương sống tập trung nhiều hơn vào các tương tác ngắn hoặc thông thường, thường chỉ là các phần nhỏ của một trang tĩnh lớn hơn: airbnb , Khan Academy , bản đồ và danh sách của Foursquare .

Bạn có thể sử dụng Backbone để tạo các loại ứng dụng mà Ember nhắm mục tiêu (ví dụ: Rdio ) bằng cách a) tăng số lượng mã ứng dụng mà bạn chịu trách nhiệm để tránh các vấn đề như rò rỉ bộ nhớ hoặc các sự kiện zombie (cá nhân tôi không khuyến khích phương pháp này) hoặc b) bằng cách thêm các thư viện của bên thứ 3 như backbone.marionette hoặc Coccyx - có rất nhiều thư viện trong số này cố gắng cung cấp chức năng chồng chéo tương tự và có thể bạn sẽ kết thúc việc lắp ráp khung tùy chỉnh của riêng mình lớn hơn và yêu cầu nhiều mã keo hơn nếu bạn vừa mới sử dụng Ember.

Cuối cùng thì câu hỏi "sử dụng cái nào" có hai câu trả lời.

Đầu tiên, "Tôi nên sử dụng cái nào, nói chung, trong sự nghiệp của tôi": Cả hai, giống như bạn sẽ học bất kỳ công cụ nào cụ thể cho công việc mà bạn muốn làm trong tương lai. Bạn sẽ không bao giờ hỏi "Backbone hay D3?"; "Backbone or Ember" là một câu hỏi ngớ ngẩn không kém.

Thứ hai, "Tôi nên sử dụng cái nào, cụ thể là, cho dự án tiếp theo của tôi": Phụ thuộc vào dự án. Cả hai sẽ giao tiếp với một máy chủ Rails một cách dễ dàng như nhau. Nếu dự án tiếp theo của bạn liên quan đến sự kết hợp của các trang do máy chủ tạo ra với cái gọi là "quần đảo phong phú" do JavaScript cung cấp, hãy sử dụng Backbone. Nếu dự án tiếp theo của bạn đẩy tất cả tương tác vào môi trường trình duyệt, hãy sử dụng Ember.


4
Phản hồi tuyệt vời, Trek. Tôi chỉ muốn nhận xét ở đây điều đó ExpiresCache-Controlgiúp ít hơn nhiều so với những gì mọi người nghĩ — đặc biệt là về các thiết bị di động thường bỏ qua chúng. Tôi nhớ một phiên bản iOS đã bỏ qua chúng hoàn toàn (nhưng vẫn lắng nghe tệp kê khai bộ nhớ cache HTML5). Ngoài ra, các giá trị tiêu đề này sẽ không giúp ích gì trong lần truy cập đầu tiên từ người dùng — thường là yếu tố quan trọng nhất trong việc quyết định liệu người dùng có ở lại và sử dụng ứng dụng của bạn hay không. Nói tất cả rằng sự khác biệt tệp 30kb dường như không phải là vấn đề lớn đối với tôi. Đó là bản thô hay mức chênh lệch 30k được rút gọn và nén?
Mauvis Ledford 22/10/12

11
Nếu bạn xem xét các ứng dụng thực tế theo phong cách mà Ember dự định giúp tạo, bạn sẽ thấy không có cách nào thoát khỏi những kbs khó chịu đó. Hoặc chúng đến từ Ember và mã ứng dụng của bạn nhỏ hơn hoặc chúng đến từ các plugin xương sống hoặc chúng đến từ mã do bạn tự viết. Wunderlist , cái mà bạn nghĩ sẽ là đồng hồ "đơn giản" với khoảng 300kb chuyển khoản. Tôi tưởng tượng nó sẽ có kích thước tương tự với Ember, có lẽ nhỏ hơn - chưa bao giờ viết một bản Wunderlist chính xác, tôi không thể nói chắc chắn 100%.
Trek Glowacki 22/10/12

1
Tôi đồng ý, ứng dụng xương sống phổ biến nhất của tôi hoạt động ở mức 178kb + các mẫu được nén và thu nhỏ. Chỉ chỉ ra cách chúng ta không nên dựa vào bộ nhớ đệm của trình duyệt.
Mauvis Ledford

2
Trek, bạn đang phân tích về việc sử dụng Backbone trong các ứng dụng có các kiểu sử dụng mở rộng và quản lý trạng thái phức tạp. Tôi đã trải qua trải nghiệm chuyển đổi một ứng dụng cũ sang Backbone và phải thực hiện chính xác những gì bạn đã liệt kê. Chúng tôi cần tích hợp Marionette cũng như viết nhiều mã keo cho những thứ như lọc tuyến trước / sau, giảm thiểu rò rỉ bộ nhớ và quản lý sự kiện tốt hơn.
Mike Clymer

9
"Bạn sẽ không bao giờ hỏi Backbone hay D3" - chắc chắn, nhưng tôi có thể dễ dàng hình dung ra một dự án mà tôi sẽ sử dụng D3 kết hợp với Backbone. Có lẽ khó hơn nhiều để tưởng tượng một dự án mà Backbone và Ember được sử dụng cùng nhau trên một trang. Vì vậy, tôi thấy câu hỏi "Backbone hay Ember" khá công bằng. Đây là một bài đăng khác mà tôi thấy khá nhiều thông tin, vì nó so sánh hai khung làm việc sâu hơn: net.tutsplus.com/tutorials/javascript-ajax/…
Shiprack,

26

Để đưa ra một câu trả lời ngắn gọn, đơn giản: đối với một chương trình phụ trợ RESTful, hiện tại, bạn nên sử dụng Backbone.

Để đưa ra một câu trả lời phức tạp hơn: Nó thực sự phụ thuộc vào những gì bạn đang làm. Như những người khác đã nói, Ember được thiết kế cho những thứ khác nhau và sẽ thu hút nhiều người khác nhau. Câu trả lời ngắn gọn của tôi dựa trên việc bạn bao gồm yêu cầu RESTful.

Hiện tại, Ember-Data (có vẻ là cơ chế hoạt động bền bỉ mặc định trong Ember) còn lâu mới sẵn sàng sản xuất. Điều này có nghĩa là nó có khá nhiều lỗi và quan trọng là không hỗ trợ các URI lồng nhau (ví dụ: / posts / 2 / comments / 4556). Nếu REST là yêu cầu của bạn, thì bạn sẽ phải giải quyết vấn đề này trong lúc này nếu bạn chọn Ember (tức là bạn sẽ phải hack nó vào, chờ đợi, tự thực hiện một cái gì đó như Ember-Data từ đầu, hoặc không sử dụng -very-RESTful URI). Ember-Data không hoàn toàn là một phần của Ember, vì vậy điều này hoàn toàn có thể xảy ra.

Sự khác biệt chính giữa cả hai, ngoài kích thước, về cơ bản là:

Ember cố gắng làm nhiều việc nhất có thể cho bạn để bạn không phải viết nhiều mã. Nó rất phân cấp và, nếu ứng dụng của bạn cũng rất phân cấp, có thể sẽ rất phù hợp. Bởi vì nó có rất nhiều tác dụng đối với bạn, có thể khó tìm ra lỗi đến từ đâu và lý do tại sao hành vi không mong muốn lại xảy ra (có rất nhiều "phép thuật"). Nếu bạn có một ứng dụng phù hợp một cách tự nhiên với loại ứng dụng mà Ember mong đợi bạn đang xây dựng, điều này có thể sẽ không thành vấn đề.

Backbone cố gắng làm ít nhất có thể cho bạn để bạn có thể suy luận về những gì đang diễn ra và xây dựng một kiến ​​trúc phù hợp với ứng dụng của bạn (thay vì xây dựng một ứng dụng phù hợp với kiến ​​trúc của khung mà bạn đang sử dụng). Bắt đầu dễ dàng hơn rất nhiều nhưng, trừ khi bạn cẩn thận, bạn có thể kết thúc với một mớ hỗn độn rất nhanh chóng. Nó không thực hiện những thứ như thuộc tính được tính toán, sự kiện tự động hủy liên kết, v.v. và giao chúng cho bạn, vì vậy bạn sẽ cần phải tự mình triển khai nhiều thứ (hoặc ít nhất là chọn các thư viện làm điều đó cho bạn), mặc dù đó là đúng hơn là toàn bộ điểm.

Cập nhật : Có vẻ như gần đây, Ember hiện đã hỗ trợ các URI lồng nhau, vì vậy tôi cho rằng câu hỏi đặt ra là bạn thích bao nhiêu phép thuật và liệu Ember có phù hợp với ứng dụng của bạn hay không.


5
"quan trọng là không hỗ trợ các URI lồng nhau (ví dụ: / posts / 2 / comments / 4556)" Đây là cam kết có liên quan từ một vài tuần trước: github.com/emberjs/data/commit/… . Nó biết rằng có thể khó theo kịp với một khuôn khổ trước khi phát hành đang chuyển động nhanh chóng, nhưng chúng ta nên luôn hướng đến sự chính xác khi nói chuyện với người có thẩm quyền và đưa ra lời khuyên!
Trek Glowacki 22/10/12

Tuyệt thật, cảm ơn nhé. Đã cập nhật câu trả lời của tôi. Tôi cho rằng điều đó đã được giới thiệu trong hợp nhất mối quan hệ lớn vào tuần trước hoặc lâu hơn. Tôi đã xem và đọc qua các thay đổi được liệt kê nhưng không thể tìm thấy đề cập đến url và các vấn đề tôi đang theo dõi vẫn mở khi tôi kiểm tra chúng. Cảm ơn bạn đã chỉ ra cam kết - có thể khó xác định vị trí mà không biết sự tồn tại của nó.
bengillies 22/10/12

Nó thực sự là từ sự hợp nhất gần đây của nhánh cải thiện mối quan hệ. Chúng tôi đã dần theo dõi các vấn đề cũ và kết thúc chúng trong tuần này.
Trek Glowacki 23/10/12

3

Tôi nghĩ rằng câu hỏi của bạn sẽ sớm bị chặn :) Có một vài nội dung hài lòng giữa hai khuôn khổ.

Về cơ bản Backbone không làm được nhiều thứ, và đó là lý do tại sao tôi thích nó: bạn sẽ phải viết mã rất nhiều, nhưng bạn sẽ viết mã đúng nơi. Ember làm rất nhiều thứ, vì vậy tốt hơn hết bạn nên xem nó đang làm gì.

Thảo luận máy chủ là một trong số ít những điều mà Backbone thực hiện, và nó thực hiện rất tốt với nó. Vì vậy, tôi sẽ bắt đầu với Backbone và sau đó thử Ember nếu bạn không hoàn toàn hài lòng.

Bạn cũng có thể nghe podcast này , nơi Jeremy Ashkenas, tác giả của Backbone và Yehuda Katz, thành viên của Ember, có một cuộc thảo luận vui vẻ


2
Cảm ơn bạn. Bạn có thể nói gì về các tiện ích mở rộng rets của ember. Sử dụng dữ liệu hoặc tài nguyên tốt hơn? Bạn có thể đưa ra một ví dụ đơn giản về cuộc gọi api nghỉ không?
Robin Wieruch 21/10/12

1
Câu trả lời ngắn gọn là các thư viện luôn thay đổi và tôi không thể cung cấp cho bạn câu trả lời dựa trên kinh nghiệm trước đây của tôi (tôi đã tự làm điều đó để đánh giá). Tôi nghĩ rằng bài này sẽ cho bạn biết nhiều hơn tôi có thể: stackoverflow.com/questions/8623091/ember-js-rest-api
Nicolas Zozol

1
Tôi đã thấy bài đăng này. Thats lý do tại sao tôi hỏi :)
Robin Wieruch

2
@NicolasZozol podcast nào? liên kết?
deepak

3
javascriptjabber.com/004-jsj-backbone-js-with-jeremy-ashkenas từ hồi tháng Hai. Điều này là trước khi trở nên rõ ràng hơn rằng các khuôn khổ này không thực sự tồn tại trong các đấu trường chồng chéo. Bạn có thể nghe thấy Yehuda và Jeremy chỉ nói chuyện với nhau, không thực sự so sánh.
Trek Glowacki 23/10/12
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.