Các điểm mạnh và điểm yếu trong thế giới thực của nhiều khung dựa trên backbone.js là gì? [đóng cửa]


186

Hy vọng rằng ai đó có thể chia sẻ kinh nghiệm của họ với một số biến thể backbone.js mới nhất hiện có. Tôi có một số kinh nghiệm tốt với xương sống / gạch dưới / yêu cầu trong một số dự án và tôi muốn thực hiện bước tiếp theo hướng tới các giải pháp tiên tiến hơn cho cấu trúc ứng dụng phức tạp.

Tôi biết các khung sau đây có sẵn:

Và có lẽ tôi đã bỏ lỡ một vài.

Có một giới thiệu ngắn về sự khác biệt ở đây:

nhưng nó rất chung chung. Tôi đã tự hỏi nếu ai đó có thể chia sẻ kinh nghiệm của họ với các ứng dụng thực tế bằng cách sử dụng các khung này.

Lợi ích của việc chọn cái này hơn cái kia là gì? Khi nào marionette sẽ là một giải pháp tốt hơn so với chaplin, hoặc tại sao vetebrae tốt hơn cho các ứng dụng nhất định, ví dụ.

Chắc chắn, câu trả lời rõ ràng sẽ là " sử dụng những gì tốt nhất cho nhu cầu của bạn ", nhưng tôi thiếu kinh nghiệm với các khung này để biết sức mạnh / mục đích / lợi thế của chúng hoặc các kịch bản ưa thích.

Cảm ơn!

Chỉnh sửa 1: tìm thấy bài đăng này: Backbone.Marionette vs Backbone-Boilerplate

Chỉnh sửa 2: Trả lời bởi Mathias schafer (Chaplin) qua thư:

Nói tóm lại, cấu trúc hiện tại gần với phiên bản 1.0 vì nó đã được sử dụng trong sản xuất. Chúng tôi không có kế hoạch thêm tính năng mới lớn hoặc phá vỡ các thay đổi API cho đến 1.0.

Marionette chắc chắn là thư viện toàn diện và ổn định nhất hiện có. Nó giải quyết một số khía cạnh của phát triển ứng dụng JS với Backbone. Ví dụ, nó có một lớp khung nhìn mạnh mẽ mà chính Backbone để lại hoàn toàn trống rỗng. Tất nhiên, bạn sẽ thấy rằng một số khía cạnh sẽ không đáp ứng nhu cầu của bạn và bạn có thể cảm thấy cần phải thiết lập một cấu trúc xung quanh Marionette.

Ngược lại, Chaplin tập trung vào một khía cạnh khá nhỏ nhưng rất quan trọng của các ứng dụng Backbone, cụ thể là cấu trúc ứng dụng tổng thể và vòng đời mô-đun. Về vấn đề này, Chaplin rất phản đối và giống như một khung hơn là một thư viện (như trong mã của bạn gọi là thư viện, một khung gọi mã của bạn). Chaplin cung cấp một số lớp trung tâm nằm phía trên các mô-đun ứng dụng riêng lẻ và kiểm soát trạng thái ứng dụng tổng thể. Điều này mang lại cho ứng dụng của bạn một cấu trúc thông thường như Ruby on Rails.

Trong Chaplin, bạn khai báo một số tuyến đường ánh xạ tới các bộ điều khiển và Chaplin khởi động bộ điều khiển một khi tuyến đường khớp. Nó cũng quan tâm đến việc xử lý các bộ điều khiển cũ, và hiển thị và ẩn các khung nhìn chính, mà một bộ điều khiển được cho là tạo ra. Đây là ý tưởng cơ bản, nhưng Chaplin chăm sóc các chi tiết xấu xí để làm cho nó chạy trơn tru.

Có hai nguyên tắc đi kèm với cấu trúc này: - Mô đun hóa, tách rời và hộp cát - Giao tiếp giữa các mô-đun bằng cách sử dụng Xuất bản / Đăng ký và Người hòa giải

Tất nhiên những mẫu này không phải là mới trong thế giới phát triển phần mềm và Chaplin không phải là thư viện duy nhất áp dụng chúng cho các ứng dụng Backbone.js.

Chaplin cũng cung cấp các cải tiến cho lớp View, ví dụ như CollectionView rất tinh vi, nhưng tổng cộng không nhiều như Marionette với Vùng và Bố cục của nó. Nhưng thật dễ dàng để viết các lớp meta như vậy bằng cách sử dụng phương tiện Chaplin Views cung cấp.


12
+1 Câu hỏi của bạn đạt được điểm. Trong năm ngoái, hai hoặc một số loại cường điệu khung hình đã làm phong phú cảnh quan với vô số dự án lấy cảm hứng từ kiến ​​trúc thực sự khó phân biệt - với mỗi cách thực hiện một cách tiếp cận nhẹ nhàng và thường xuyên hơn để thực hiện. Lưu ý rằng đây là một nhận xét :)
kontur

Câu trả lời:


132

Hầu hết (tất cả?) Các khung mà bạn đang xem xét giải quyết các vấn đề tương tự, nhưng chúng thực hiện theo các cách hơi khác nhau với các mục tiêu hơi khác nhau.

Tôi nghĩ thật công bằng khi nói rằng tất cả các dự án này sẽ giải quyết các vấn đề trong các danh mục này:

  • Cung cấp bộ mặc định hợp lý
  • Giảm mã soạn sẵn
  • Cung cấp cấu trúc ứng dụng trên đỉnh các khối xây dựng BackboneJS
  • Trích xuất các mẫu mà tác giả sử dụng trong ứng dụng của họ

Marionette, mà tôi đã xây dựng từ tháng 12 năm 2011, cũng có một vài mục tiêu và lý tưởng rất khác biệt:

  • Kiến trúc ứng dụng tổng hợp
  • Ảnh hưởng mẫu tin nhắn doanh nghiệp
  • Tùy chọn mô đun hóa
  • Sử dụng tăng dần (không yêu cầu tất cả hoặc không có gì)
  • Không khóa máy chủ
  • Giúp dễ dàng thay đổi các giá trị mặc định đó
  • Mã dưới dạng cấu hình / trên cấu hình

Tôi không nói rằng không có khuôn khổ nào khác có cùng mục tiêu này. Nhưng tôi nghĩ sự độc đáo của Marionette đến từ sự kết hợp của những mục tiêu này.

Kiến trúc ứng dụng tổng hợp

Tôi đã dành hơn 5 năm làm việc trong các hệ thống phần mềm phân tán, máy khách dày sử dụng WinForms và C #. Tôi đã xây dựng các ứng dụng cho máy tính để bàn, máy tính xách tay (máy khách thông minh), thiết bị di động và ứng dụng web, tất cả đều chia sẻ một bộ chức năng cốt lõi và làm việc với cùng một máy chủ back-end nhiều lần. Trong thời gian này, tôi đã học được giá trị của mô đun hóa và rất nhanh chóng chuyển xuống một con đường thiết kế ứng dụng tổng hợp.

Ý tưởng cơ bản là "tổng hợp" trải nghiệm thời gian chạy của ứng dụng của bạn và xử lý nhiều phần nhỏ hơn, riêng lẻ mà không nhất thiết phải biết về nhau. Họ tự đăng ký với hệ thống ứng dụng tổng hợp và sau đó họ liên lạc qua nhiều phương tiện khác nhau của tin nhắn và cuộc gọi.

Tôi đã viết một chút về điều này trên blog của mình, giới thiệu Marionette như một kiến ​​trúc ứng dụng tổng hợp cho Backbone:

Hàng đợi / Mẫu tin nhắn

Cùng một quy mô lớn, các hệ thống phân tán cũng tận dụng hàng đợi tin nhắn, mẫu tích hợp doanh nghiệp (mẫu tin nhắn) và xe buýt dịch vụ để xử lý tin nhắn. Điều này, hơn bất cứ điều gì khác, có ảnh hưởng to lớn đến cách tiếp cận phát triển phần mềm tách rời của tôi. Tôi bắt đầu thấy các ứng dụng WinForms trong bộ nhớ đơn xử lý theo quan điểm này, và chẳng mấy chốc, phía máy chủ và sự phát triển ứng dụng web của tôi đã bị ảnh hưởng từ việc này.

Điều này đã trực tiếp dịch chính nó vào cách tôi nhìn vào thiết kế ứng dụng Backbone. Tôi cung cấp một trình tổng hợp sự kiện trong Marionette, cho cả đối tượng Ứng dụng cấp cao và cho từng mô-đun mà bạn tạo trong ứng dụng.

Tôi nghĩ về các tin nhắn mà tôi có thể gửi giữa các mô-đun của mình: tin nhắn lệnh, tin nhắn sự kiện và hơn thế nữa. Tôi cũng nghĩ về giao tiếp phía máy chủ là các tin nhắn có cùng các mẫu này. Một số mô hình đã tìm đến Marionette, nhưng một số chưa có.

Mô đun hóa

Việc mô đun hóa mã là rất quan trọng. Tạo các gói nhỏ, được đóng gói tốt, có trọng tâm riêng biệt với các điểm vào và thoát được xác định rõ là điều bắt buộc đối với bất kỳ hệ thống nào có kích thước và độ phức tạp đáng kể.

Marionette cung cấp mô đun hóa trực tiếp thông qua các moduleđịnh nghĩa của nó . Nhưng tôi cũng nhận ra rằng một số người thích RequireJS và muốn sử dụng nó. Vì vậy, tôi cung cấp cả bản dựng tiêu chuẩn và bản dựng tương thích RequireJS.


MyApp = new Backbone.Marionette.Application();

MyApp.module("MyModule", function(MyModule, MyApp, Backbone, Marionette, $, _){

  // your module code goes here

});

(Chưa có bài đăng blog nào cho việc này)

Sử dụng tăng dần

Đây là một trong những triết lý cốt lõi mà tôi áp dụng cho mọi phần của Marionette mà tôi có thể: không yêu cầu "tất cả hoặc không có gì" đối với việc sử dụng Marionette.

Xương sống tự nó có một cách tiếp cận rất gia tăng và mô đun với tất cả các đối tượng khối xây dựng của nó. Bạn có thể tự do lựa chọn những gì bạn muốn sử dụng, khi nào. Tôi tin tưởng mạnh mẽ vào nguyên tắc này và cố gắng đảm bảo Marionette hoạt động theo cách tương tự.

Cuối cùng, phần lớn các tác phẩm mà tôi đã xây dựng cho Marionette được chế tạo để đứng một mình, để làm việc với các phần cốt lõi của Xương sống và để làm việc với nhau thậm chí còn tốt hơn.

Ví dụ: gần như mọi ứng dụng Xương sống cần hiển thị động chế độ xem Đường trục ở một vị trí cụ thể trên màn hình. Các ứng dụng cũng cần xử lý việc đóng các chế độ xem cũ và dọn dẹp bộ nhớ khi một vị trí mới được đưa vào. Đây là nơi Marionette Regionđến chơi. Một vùng xử lý mã soạn sẵn của chế độ xem, gọi kết xuất trên đó và đưa kết quả vào DOM cho bạn. Sau đó sẽ đóng chế độ xem đó và dọn sạch nó cho bạn, miễn là chế độ xem của bạn có phương thức "đóng" trên đó.


MyApp.addRegions({
  someRegion: "#some-div"
});

MyApp.someRegion.show(new MyView());

Nhưng bạn không bắt buộc phải sử dụng quan điểm của Marionette để sử dụng một khu vực. Yêu cầu duy nhất là bạn đang mở rộng từ Backbone.View tại một số điểm trong chuỗi nguyên mẫu của đối tượng. Nếu bạn chọn cung cấp một closephương thức, một onShowphương pháp hoặc các phương thức khác, Vùng của Marionette sẽ gọi nó cho bạn vào đúng thời điểm.

Không khóa máy chủ

Tôi xây dựng các ứng dụng Backbone / Marionette trên một loạt các công nghệ máy chủ:

  • ASP.NET MVC
  • Viên ngọc trên tay vịn
  • Ruby / Sinatra
  • NodeJS / ExpressJS
  • PHP / Slim
  • Java
  • Erlang
  • ... và hơn thế nữa

JavaScript là JavaScript, khi nói đến việc chạy trong trình duyệt. JavaScript phía máy chủ cũng tuyệt vời, nhưng nó không ảnh hưởng hay ảnh hưởng đến cách tôi viết JavaScript dựa trên trình duyệt của mình.

Do tính đa dạng trong các dự án mà tôi xây dựng và các công nghệ phụ trợ mà khách hàng của tôi sử dụng, tôi không thể và sẽ không khóa Marionette vào một ngăn xếp công nghệ phía máy chủ vì bất kỳ lý do gì. Tôi sẽ không cung cấp một dự án nồi hơi. Tôi sẽ không cung cấp đá quý ruby ​​hoặc gói npm. Tôi muốn mọi người hiểu rằng Marionette không yêu cầu máy chủ phụ trợ cụ thể. Đó là JavaScript dựa trên trình duyệt và back-end không thành vấn đề.

Tất nhiên, tôi hoàn toàn hỗ trợ người khác cung cấp các gói cho ngôn ngữ và khung của họ. Tôi liệt kê các gói đó trong Wiki và hy vọng mọi người tiếp tục xây dựng nhiều gói hơn khi họ thấy cần. Nhưng đó là hỗ trợ cộng đồng, không phải hỗ trợ trực tiếp từ Marionette.

Dễ dàng thay đổi mặc định

Trong nỗ lực của tôi để giảm mã soạn sẵn và cung cấp các giá trị mặc định hợp lý (đó là ý tưởng mà tôi đã trực tiếp "mượn" từ Trình quản lý Bố cục của Tim Branyen), tôi nhận thấy sự cần thiết cho các nhà phát triển khác sử dụng các triển khai hơi khác so với tôi.

Tôi cung cấp kết xuất dựa trên các <script>thẻ nội tuyến cho các mẫu, sử dụng khuôn mẫu Underscore.js theo mặc định. Nhưng bạn có thể thay thế điều này bằng cách thay đổi Renderervà / hoặc TempalteCachecác đối tượng trong Marionette. Hai đối tượng này cung cấp cốt lõi của khả năng kết xuất và có các trang wiki chỉ ra cách thay đổi điều này cho các công cụ tạo khuôn mẫu cụ thể và các cách tải mẫu khác nhau.

Với v0.9 của Marionette, nó thậm chí còn dễ dàng hơn. Ví dụ: nếu bạn muốn thay thế việc sử dụng các khối tập lệnh mẫu nội tuyến bằng các mẫu được biên dịch sẵn, bạn chỉ phải thay thế một phương thức trên Trình kết xuất:


Backbone.Marionette.Renderer.render = function(template, data){
  return template(data);
};

và bây giờ toàn bộ ứng dụng sẽ sử dụng các mẫu được biên dịch sẵn mà bạn đính kèm vào templatethuộc tính của khung nhìn .

Tôi thậm chí còn cung cấp một tiện ích bổ sung Marionette.Async với v0.9 cho phép bạn hỗ trợ các chế độ xem hiển thị không đồng bộ. Tôi liên tục cố gắng để làm cho nó dễ dàng nhất có thể để thay thế các hành vi mặc định trong Marionette.

Mã dưới dạng cấu hình

Tôi là một fan hâm mộ của "quy ước về cấu hình" trong các bối cảnh nhất định. Đó là một cách mạnh mẽ để hoàn thành công việc và Marionette cung cấp một chút về điều này - mặc dù không quá nhiều, trung thực. Nhiều khung công tác khác - đặc biệt là LayoutManager - cung cấp nhiều quy ước hơn về cấu hình so với Marionette.

Điều này được thực hiện với mục đích và ý định.

Tôi đã xây dựng đủ các plugin, khung, tiện ích và ứng dụng JavaScript để biết được nỗi đau của việc cố gắng làm cho các quy ước hoạt động một cách có ý nghĩa và nhanh chóng. Nó có thể được thực hiện với tốc độ, nhưng thường với chi phí có thể thay đổi nó.

Cuối cùng, tôi sử dụng cách tiếp cận "mã như cấu hình" cho Marionette. Tôi không cung cấp nhiều API "cấu hình" trong đó bạn có thể cung cấp một đối tượng bằng chữ với các giá trị tĩnh thay đổi một loạt các hành vi. Thay vào đó, tôi ghi lại các phương thức mà mỗi đối tượng có - cả thông qua mã nguồn được chú thích và thông qua tài liệu API thực tế - với mục đích cho bạn biết cách thay đổi Marionette để hoạt động theo cách bạn muốn.

Bằng cách cung cấp API rõ ràng và rõ ràng cho các đối tượng Marionette, tôi tạo ra một tình huống thay thế hành vi của một đối tượng cụ thể hoặc Marionette nói chung là tương đối đơn giản và rất linh hoạt. Tôi hy sinh các lệnh gọi API cấu hình "đơn giản" để linh hoạt cung cấp mã của riêng bạn để khiến mọi thứ hoạt động theo cách bạn muốn.

Bạn sẽ không tìm thấy API "cấu hình" hoặc "tùy chọn" trong Marionette. Nhưng bạn sẽ tìm thấy một số lượng lớn các phương thức mà mỗi phương thức phục vụ một mục đích rất cụ thể, với chữ ký rõ ràng, giúp dễ dàng thay đổi cách thức hoạt động của Marionette.


16
Tại sao đây là câu trả lời được đánh giá cao nhất? Nó không phải là sự kiện trả lời câu hỏi - về cơ bản đó là lịch sử / quảng cáo cho Marionette ...
Jess Telford

@JessTelford bạn có thể muốn đọc lại câu hỏi, đây là một câu trả lời khá hay cho nó.
mor

@mor câu hỏi là What is the benefit of choosing one over the other?- câu trả lời này Marionette [...] has a few very distinct goals and ideals in mind, không một lần so sánh chính nó với khung khác. Nếu câu hỏi là Hãy giải thích những gì mỗi khung này có thể làm , thì chắc chắn, đây là một câu trả lời tuyệt vời. Nhưng nó không phải là. Và nó không phải là.
Jess Telford

@JessTelford Câu hỏi rõ ràng yêu cầu nhiều câu trả lời. Điều này nói lên những điểm mạnh và vấn đề mà Marionette đề cập. Sau khi đọc câu hỏi, tôi thấy câu trả lời này thực sự hữu ích. Không nhất thiết là tốt nhất theo ý kiến ​​của tôi, nhưng dù sao đó cũng là một câu trả lời tốt. Ồ, và câu hỏi là : What are the strengths and weaknesses of....
mor

@mor Đừng hiểu sai ý tôi - đây là một mô tả rất kỹ lưỡng và rõ ràng về Marionette. Tôi chỉ không cảm thấy nó trả lời câu hỏi. Ở bất cứ giá nào, các upvote cho điều này là một câu trả lời tốt.
Jess Telford

25

Tôi hiện đang sử dụng xương sống với mô-đun trình quản lý bố cục và tay lái làm công cụ tạo khuôn mẫu và tôi thấy thực sự dễ dàng để thiết lập một ứng dụng nhỏ bằng cách sử dụng phụ trợ Grails đã có. Trước khi bắt đầu sử dụng trình quản lý bố cục, tôi đã đọc về Marionette và Chaplin và cả hai dường như thực sự mạnh mẽ nhưng phức tạp. Sau đó, tôi nhớ tại sao ban đầu tôi chọn backbone.js: đơn giản. Tất cả các khung đó đang thêm những gì xương sống đã bỏ qua thiết kế. Tôi không nói rằng một khung công tác là xấu, nhưng nếu tôi cần một cái gì đó phức tạp hơn, tôi sẽ thử các dự án khác, như ember.js hoặc spoutcore, vì chúng có một cơ sở mã duy nhất, được viết với mục tiêu trong tâm trí các nhà phát triển của chúng. Ở đây chúng tôi có các khung trên đầu trang khác. Tất nhiên, xương sống là xương sống không chỉ để xây dựng các ứng dụng, mà còn để viết một số thư viện mạnh mẽ hơn, nhưng điều duy nhất tôi nghĩ là thực sự kém với nó là lớp khung nhìn, vì thiếu trình quản lý bố cục và khả năng các khung nhìn lồng nhau. Với trình quản lý bố trí khoảng trống được lấp đầy khá tốt.

Vì vậy, câu trả lời của tôi cho câu hỏi của bạn là: bắt đầu từ việc sử dụng xương sống, và tự hỏi những gì còn thiếu và kỳ vọng của bạn về khung là gì. Nếu bạn thấy có quá nhiều thứ bị bỏ lại bởi xương sống, thì hãy đi và tìm kiếm chúng trong các khung khác và chọn một thứ phù hợp nhất với nhu cầu của bạn. Và nếu bạn vẫn chưa tự tin vào sự lựa chọn, có lẽ xương sống không dành cho bạn và bạn phải xem một số giải pháp khác (ember.js, spoutcore, ExtJs, JavaScript MVC đều tốt). Nếu bạn có kinh nghiệm viết ứng dụng khách, bạn thực sự không cần kinh nghiệm trên tất cả các khung ngoài đó để chọn đúng ứng dụng (tất nhiên là cho bạn)


13

Tôi đã nghiên cứu các khung công tác khác nhau được xây dựng với Backbone.js và xây dựng các đốt sống cho một dự án tại HauteLook. Các mục tiêu của dự án bao gồm ... tải tập lệnh động, định dạng mô-đun AMD, quản lý phụ thuộc, xây dựng với hầu hết các thư viện nguồn mở, tổ chức mã trong các gói, tối ưu hóa và xây dựng cho một hoặc nhiều ứng dụng trang đơn, lưu trữ trên máy chủ được lưu trữ đầy đủ, ví dụ: không có máy chủ kịch bản bên cạnh chỉ sử dụng API cho dữ liệu và hài hước nhất đối với tôi, sử dụng phát triển theo hướng hành vi cho dự án. Có một mô tả về dự án tại: http://www.hautelooktech.com/2012/05/24/vertebrae-front-end-framework-built-with-backbone-js-and-requirejs-USE-amd/

Vấn đề của chúng ta:

Các thư viện được chọn (jQuery, Underscore.js, Backbone.js, RequireJS, Mustache) cung cấp tải mô-đun, quản lý phụ thuộc, cấu trúc ứng dụng (cho các mô hình, bộ sưu tập, khung nhìn và tuyến đường), tương tác không đồng bộ với API, các tiện ích và đối tượng khác nhau để quản lý các hành vi không đồng bộ , ví dụ (Lời hứa) Trì hoãn, Gọi lại. Logic còn lại cần thiết để hoàn thành khung bao gồm:

  • một đối tượng (mô hình) để quản lý trạng thái của ứng dụng một trang;
  • một trình quản lý bố cục để trình bày, sắp xếp / chuyển tiếp và quan điểm rõ ràng, và
  • bộ điều khiển đáp ứng các tuyến đường, nhận / đặt trạng thái ứng dụng và chuyển giao công việc cho trình quản lý bố cục.

Giải pháp của chúng tôi (được triển khai trong Vertebrae):

Quản lý nhà nước ứng dụng -

Trình quản lý ứng dụng lưu trữ dữ liệu trong bộ nhớ và cũng lưu giữ dữ liệu trong bộ nhớ của trình duyệt để cung cấp tài nguyên cho dữ liệu / siêu dữ liệu chung. Đồng thời cung cấp dữ liệu (trạng thái) để xây dựng lại các lượt xem trang dựa trên các tương tác trước đó (ví dụ: tab được chọn, các bộ lọc được áp dụng). Trình quản lý trạng thái ứng dụng cung cấp một chiến lược cho các tài nguyên để lấy trạng thái. Đồng nghĩa với hoạt động như một bộ máy nhà nước.

Trình quản lý bố cục -

Trình quản lý bố cục có một hoặc nhiều chế độ xem cũng như đích đến tài liệu (DOM) cho mỗi chế độ xem (được hiển thị). Một trang có thể chuyển đổi giữa nhiều chế độ xem, vì vậy trình quản lý bố cục theo dõi trạng thái xem, ví dụ: được hiển thị, không được hiển thị, hiển thị, không hiển thị. Bạn có thể sử dụng trình quản lý bố cục để lười tải và hiển thị các chế độ xem (tách rời) mà khách truy cập trang rất có thể yêu cầu, ví dụ: thay đổi tab trên một trang. Việc chuyển đổi giữa các trạng thái xem được quản lý bởi đối tượng này. Toàn bộ bố cục có thể bị xóa để xem các đối tượng và các ràng buộc của chúng bị loại bỏ, chuẩn bị các đối tượng này để thu gom rác (ngăn chặn rò rỉ bộ nhớ). Trình quản lý bố cục cũng giao tiếp trạng thái xem với (các) bộ điều khiển.

Bộ điều khiển -

Một đối tượng điều khiển được gọi bởi một hàm xử lý tuyến và chịu trách nhiệm lấy trạng thái có liên quan (mô hình ứng dụng) để tạo một trang (bố cục), (cũng chịu trách nhiệm thiết lập trạng thái khi tuyến thay đổi). Bộ điều khiển chuyển dữ liệu phụ thuộc (mô hình / bộ sưu tập) và các đối tượng xem được xây dựng cho một trang được yêu cầu cho trình quản lý bố cục. Là một tác dụng phụ, việc sử dụng các bộ điều khiển sẽ ngăn đối tượng tuyến đường trở nên cồng kềnh và rối. Một tuyến đường nên ánh xạ tới bộ điều khiển, sau đó khởi động chế độ xem trang, giữ cho các chức năng xử lý tuyến đường nghiêng.

Ứng dụng Todos được lưu trữ cả ở chế độ dev và được tối ưu hóa trên Heroku ...

Nhiều khái niệm trong các khung khác được mượn, ví dụ: cần phải xem các khung nhìn để xem trước rò rỉ bộ nhớ như được chỉ ra bởi Derick Bailey - http://lostechies.com/derickbailey/ ; Trình quản lý bố cục của Tim Branyen http://tbranyen.github.com/backbone.layoutmanager/

Tóm lại, Backbone.js có nghĩa là một công cụ trong ứng dụng của bạn, thư viện Backbone.js không cung cấp tất cả kiến ​​trúc bạn sẽ cần để xây dựng một ứng dụng, nhưng cung cấp các tương tác tuyệt vời với API và cấu trúc mã vững chắc cho ... Chế độ xem (hoạt động giống như bộ điều khiển) và Mô hình và Bộ sưu tập lớp dữ liệu của bạn và cuối cùng là Tuyến đường. Chúng tôi đã xây dựng các đốt sống để xác định các mục tiêu của dự án của chúng tôi và quyết định trích xuất mã làm khung để người khác sử dụng, học hỏi hoặc bất cứ điều gì.

Theo tôi, câu trả lời cho câu hỏi của bạn là học từ tất cả các khung và sử dụng những gì bạn cần để đáp ứng các mục tiêu của mình, nếu bạn thấy rằng các mục tiêu dự án của bạn phù hợp chặt chẽ với một trong các khung được xây dựng bằng Backbone thì tuyệt vời, nếu không thì xây dựng khung riêng của bạn có những ví dụ tuyệt vời đang được chia sẻ bởi cộng đồng. Hoặc nếu bạn thấy mình hơi lạc hướng về ứng dụng của mình thì hãy chọn một cái gì đó có nhiều ý kiến ​​và có cấu trúc hơn có lẽ là Ember.js. Điều tuyệt vời là có rất nhiều lựa chọn để giúp bạn viết mã bằng cách sử dụng mô hình giống như (MVX) với JavaScript.


Cảm ơn các câu trả lời chi tiết.
danikoren

13

Tôi đã phát triển khung Luca trong khi làm việc tại BenchPrep, nơi chúng tôi đã sử dụng nó để phát triển một số ứng dụng trang đơn lớn trên đầu thư viện backbone.js.

Tôi đã làm việc với ExtJS vài năm trước và đã đánh cắp các khái niệm yêu thích của tôi từ khung đó, chẳng hạn như kiến ​​trúc hướng thành phần nơi bạn phát triển các khung nhìn của mình dưới dạng các thành phần độc lập và sau đó kết hợp chúng với các thành phần khác bằng cách sử dụng các khung nhìn container. Và vì nó chủ yếu dựa trên cấu hình, nên việc phát triển một ứng dụng ở Luca có cảm giác rất giống với việc mô tả một đối tượng bằng JSON.

Một lợi thế của phương pháp này là khả năng sử dụng lại các thành phần trên một số ứng dụng hoặc ở những nơi khác nhau trong ứng dụng của bạn, chỉ với những thay đổi nhỏ khi sử dụng phần mở rộng của Backbone. Nó cũng rất dễ dàng để thử nghiệm với nhiều bố cục / bản trình bày khác nhau của các thành phần bằng cách chỉ thực hiện các điều chỉnh nhỏ cho cấu hình JSON.

Ngoài một loạt các chức năng trợ giúp / tiện ích, Luca Tàu có nhiều dẫn xuất đường trục cấp cao hơn mà bạn có thể ghép lại với nhau theo bất kỳ cách nào có thể tưởng tượng để xây dựng một giao diện người dùng phức tạp.

Lượt xem, Thành phần, Container

  • Mô hình Augmented, lớp Xem, Bộ sưu tập, Bộ định tuyến
  • Các tùy chọn cấu hình hỗ trợ giao tiếp giữa các Mô hình, Bộ sưu tập, Chế độ xem, Ứng dụng và người quản lý tương ứng.
  • Các thùng chứa (Bố cục phân chia / cột, Bố cục lưới, Chế độ xem tab, Chế độ xem thẻ / Thuật sĩ)
  • FormView với tất cả các thành phần trường tiêu chuẩn và trình trợ giúp để đồng bộ hóa với Backbone.Model
  • GridView, để tạo các thành phần lưới có thể cuộn từ Luca.Collection
  • CollectionView, để tạo chế độ xem dựa trên bộ sưu tập
  • Thanh công cụ / Nút

Twitter Bootstrap Styles và Markup miễn phí

  • Luca chơi rất tốt với khung bootstrap Twitter. Đơn giản bằng cách đặt Luca.enableBootstrap = true và bao gồm CSS, các thành phần của bạn (như chế độ xem tab, thanh công cụ, nút, biểu mẫu, trường, lưới, v.v.) sẽ tự động sử dụng đánh dấu tương thích Twitter Bootstrap và các quy ước lớp CSS.
  • Sử dụng hệ thống Grid để bố trí và đáp ứng hầu hết các lớp css cơ sở bootstrap một cách thông minh
  • Các thành phần Luca.Viewport và GridLayout được thiết lập để hoạt động với các hệ thống lưới phản ứng, chất lỏng hoặc tĩnh của bootstrap.
  • Nhằm mục đích cung cấp một trận đấu 1-1 cho các thành phần bootstrap của twitter, để thể hiện chúng dưới dạng Khung nhìn xương sống có thể định cấu hình

Thành phần ứng dụng

  • Máy trạng thái dựa trên Backbone.Model cung cấp các phương thức getter / setter và các sự kiện thay đổi thuộc tính như một kiểu luồng điều khiển ứng dụng
  • Thành phần Bộ điều khiển tích hợp giúp ẩn / hiển thị các trang của ứng dụng để phản ứng với các sự kiện Backbone.Router hoặc State Machine
  • Trình quản lý bộ sưu tập tích hợp theo dõi các bộ sưu tập bạn đã tạo, cho phép bạn phạm vi chúng, nhóm chúng, gán tham số mặc định cho chúng
  • Trình quản lý ổ cắm là lớp trừu tượng trên đầu các dịch vụ websocket giúp việc đẩy dễ dàng như Backbone.Event
  • Bộ định tuyến Sự kiện Bàn phím kích hoạt các sự kiện chính được đặt tên trên các thành phần quan tâm để đáp ứng với các sự kiện đó

Bộ sưu tập và cải tiến mô hình

  • Các bộ sưu tập dựa trên truy vấn xương sống , cung cấp giao diện truy vấn rất giống với mongoDb
  • cho phép lưu trữ cục bộ Backbone.sync chỉ bằng cách đặt bộ sưu tập.localStorage = true
  • dân số tự động của các bộ sưu tập có dữ liệu được khởi động khi tải trang
  • phương thức lưu trữ / thuộc tính tính toán. lưu trữ kết quả của các phương thức thu thập và hết hạn bộ đệm để đáp ứng thay đổi / thêm / xóa các sự kiện trên bộ sưu tập hoặc các mô hình của nó
  • tính toán trên các mô hình. xây dựng các thuộc tính dựa trên hàm phức tạp và tự động cập nhật giá trị được tính toán để đáp ứng với các thay đổi

Sự kiện và móc

Các thành phần Luca tự do hơn với các sự kiện mà chúng phát ra so với các thành phần xương sống cổ phiếu. Chúng sẽ phát ra các sự kiện như trước: khởi tạo, sau: khởi tạo, trước: kết xuất, sau: kết xuất, kích hoạt, đầu tiên: kích hoạt, hủy kích hoạt, đầu tiên: hủy kích hoạt và điều này cho phép bạn điều chỉnh chính xác hơn hành vi của các thành phần. Ngoài ra, bằng cách xác định một sự kiện trong @hooks porperty trên chế độ xem của bạn, nó sẽ tự động gọi một chức năng có tên tương tự cho bạn nếu nó tồn tại. Điều này ngăn chặn rất nhiều mã kiểu gọi lại giúp cải thiện khả năng đọc.

Bạn cũng có thể định cấu hình lớp Luca.Events để xuất bản các sự kiện lên kênh đăng ký / đăng ký toàn cầu, điều này giúp xây dựng một ứng dụng lớn dễ dàng hơn và hỗ trợ trong giao tiếp giữa các mô-đun.

Đá quý Ruby

Luca được phát triển đặc biệt trong khi làm việc với API Rails và Sinatra và vì điều này hiện được tối ưu hóa cho một ngăn xếp cụ thể, nhưng không có cách nào khóa bạn vào một máy chủ cụ thể.

Luca được phân phối như một phần của Ruby Gem được định cấu hình để hoạt động trên đường dẫn tài sản hoặc dưới dạng tệp JS có thể tải xuống.

Bạn không bắt buộc phải sử dụng Rails, hoặc Sinatra. Nhưng nếu bạn làm thế, tôi đã bao gồm rất nhiều điều hữu ích:

  • Các tệp có phần mở rộng .luca được xử lý dưới dạng HAML với phép nội suy biến kiểu JST. (tương đương với .jst.ejs.haml) bằng đường ống tài sản
  • Kiểm tra khai thác cho trình duyệt, hoặc Kiểm tra đơn vị dựa trên Jasmine không đầu cùng với nhiều người trợ giúp kiểm tra xương sống và gạch dưới.
  • Một điểm cuối API cho bộ công cụ phát triển đi kèm với Luca (sẽ nói thêm về điều này sau)
  • Điểm cuối API cho phép bạn sử dụng Redis làm công cụ lưu trữ schemaless cho Luca.Collection với cấu hình tối thiểu

Các công cụ phát triển

  • Các ứng dụng Luca có thể kích hoạt bảng điều khiển coffeescript trong trình duyệt với các trình trợ giúp và lệnh cụ thể của Luca hỗ trợ giám sát, kiểm tra, gỡ lỗi các ứng dụng và thành phần của Luca

Một ví dụ về Luca trong Bảng điều khiển phát triển trình duyệt được cung cấp bởi CoffeeScript

  • Với sự trợ giúp của Rails Gem và trình soạn thảo thành phần dựa trên CodeMirror của Luca, bạn có thể chỉnh sửa mã nguồn của Luca Framework cũng như các thành phần cụ thể của ứng dụng trực tiếp trong trình duyệt, sử dụng Coffeescript. Bạn sẽ thấy phản hồi ngay lập tức để đáp ứng các chỉnh sửa của mình, với các phiên bản của các đối tượng bị ảnh hưởng được làm mới với nguyên mẫu được cập nhật và bạn có thể lưu các thay đổi của mình vào đĩa.

  • Bộ kiểm tra thành phần là một hộp cát trực tiếp để chơi với các thành phần tạo nên ứng dụng của bạn một cách cô lập. Nó cung cấp cho bạn các công cụ để sửa đổi nguyên mẫu của thành phần, thiết lập các phụ thuộc của nó và định cấu hình thành phần. Thành phần sẽ kết xuất lại ngay lập tức mỗi khi bạn chỉnh sửa. Bạn có thể xem và chỉnh sửa đánh dấu mà thành phần tạo ra, cũng như CSS trực tiếp trong trình duyệt và xem các thay đổi của bạn ngay lập tức. Điều này làm cho nó một công cụ thử nghiệm rất có giá trị.

  • Trình kiểm tra thành phần sẽ sớm tích hợp với Jasmine để bạn có thể xem kết quả kiểm tra đơn vị thành phần của mình trong thời gian thực khi bạn chỉnh sửa mã của họ

Ảnh chụp màn hình của người kiểm tra thành phần

Luca đang tiến hành công việc, nhưng vẫn duy trì API ổn định (chưa phải là 1.0) và đã được sử dụng trong một số ứng dụng sản xuất lớn. Nó chắc chắn là một khung rất quan tâm, nhưng tôi đang làm việc để làm cho nó nhiều mô-đun hơn. Tôi đang tích cực làm việc trên các tài liệu và các thành phần mẫu.


11

Tôi là đồng tác giả của Chaplin và tôi đã viết một so sánh chuyên sâu giữa Chaplin.js và Marionette.js:

http://9elements.com/io/index.php/comparison-of-marionette-and-chaplin/

Đây không phải là một loạt đá luân lưu, nhưng cố gắng giải thích cả hai cách tiếp cận một cách cân bằng.


Câu trả lời chỉ liên kết không phù hợp ở đây. Vui lòng bao gồm một câu trả lời thực tế trong câu trả lời của bạn.
Flimzy
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.