你的问题太多了,答案并不容易,而且根本不会确定。也会很有主见。看看你带来的框架列表,我看到了非常不同的东西,几乎没有可比性。我会尝试以某种方式对它们进行分组并将更多框架添加到列表中。
这里的主要问题不是特定框架的优缺点。主要问题是:你想要多少?您真的是指像 Gmail 或 Grooveshark 这样的应用程序吗?或者你的意思是像 Stackoverflow 这样的东西——一个动态的,一点也不简单,但仍然是一个网站。让我们考虑所有这些选项。
也许,您只是想通过一些小部件来增强您的网站,例如选项卡、对话框、一些可拖放/可拖放的元素、文本编辑等,并且您不愿意更改您的开发模型。我的意思是,您使用您最喜欢的 Java/PHP/Ruby,并且不希望用 JavaScript 编写大量应用程序的逻辑和行为。在这种情况下,基于 jQuery 的类似插件的解决方案将为您提供帮助,尤其是jQuery UI和jQuery Mobile。
jQuery 小部件遵循其插件系统。这通常意味着它们非常易于使用。为了创建一个按钮,你写:
$('#myButton').button();
现在,如果要禁用它,请使用以下模式调用方法:
$('#myButton').button('disable');
获取或设置值,例如在滑块或日期选择器上,如下所示:
$('#mySlider').slider('value');
$('#mySlider').slider('value', 42);
如您所见,基于 jQuery 的解决方案没有模型。您的所有数据都保存在 DOM 中,并通过古怪的方法调用获得。如果您需要动态处理您的数据,例如进行一些复杂的验证、在后台加载某些内容、过滤或排序,那么您会发现这很快就会变得一团糟。顺便说一句,这就是为什么 jQuery UI 团队还没有提供网格控件的问题——没有模型他们就无法做到。在 jQuery Mobile 中,您可以通过简单的标记获得漂亮的移动 UI,但没有官方方法可以在页面之间传递数据。
总结一下:如果您有一个多页网站,如果您发布表单,则使用 jQuery UI 或Twitter Bootstrap等更轻量级的解决方案。
也许,您想构建更复杂、更像应用程序的东西(单页应用程序?)。您知道您将需要在客户端处理数据。那你有什么选择?
您可以使用许多 JavaScript 框架之一,这些框架为您提供模型、数据绑定和可能的其他创建 Web 应用程序的方法,并将它们与为什么不使用 jQuery UI 集成。或者您可以使用更完整的框架,例如Kendo或Wijmo或jqWidgets。这些框架依赖于 jQuery(Wijmo 依赖于 jQuery UI)并提供了额外的数据操作方式。他们有一个数据模型。Kendo 实现了自己的解决方案(我认为),而 Wijmo 和 jqWidgets 与流行的 Knockout JS 集成。
所以 Kendo 和 Wijmo 属于同时提供小部件/控件和一些支持模型的框架组。还有其他类似的框架,它们不是基于 jQuery 的,例如Dojo Toolkit。添加一些动态数据加载,您将获得一个有点复杂的 Web 应用程序。你还能希望什么?
实际上,最重要的事情被遗忘了——你如何构建(组织)你的应用程序?如果您尝试构建一个以 RESTful 方式与服务器通信的单页面应用程序,那么如果您的应用程序没有架构,那么您很快就会陷入混乱。为此通常需要的特性是一些关注点分离(MVC、MVVM)、模板、路由和模块管理。这就是SproutCore和Sencha出现的地方。它们为构建 Web 应用程序提供了一个全面的解决方案,其中小部件只是其中的一小部分。
看起来 SproutCore 和 Sencha 是这里的赢家,因为它们是最完整的解决方案,包括 UI 和业务逻辑,还可以构建您的应用程序。尽管有所有优点,但也有一些缺点。有人说他们太重量级了,或者需要坚持他们的开发模式,你可能不喜欢。例如,在 Sencha 中,您使用 JavaScript 描述您的 GUI 并使用 Sencha 的类型系统。这增加了一种沉重的感觉,即有抽象和包装器,而您真的很喜欢 HTML、CSS 和 vanilla JavaScript 的易用性。
但这不是唯一的方法。Web 的强大之处在于,有许多框架、库、工具,越来越小,它们将帮助您按照自己喜欢的方式制作应用程序。例如,考虑AngularJS。它本身不提供一组控件,但结合 Twitter Bootstrap 成为 RIA 的完整解决方案。或者,例如,看看EmberJS,一个更轻量级的框架,来自创建重量级 SproutCore 的人。它也没有为您提供一组小部件,但在我看来,它是一个非常好的应用程序基础。
所以这是我的最终想法,而不是结论。所有这些框架通常都会向您展示他们的小部件集、漂亮的主题和其他视觉内容。但真正重要的是你将如何实际开发你的应用程序,你将如何构建它,你将在哪里实现你的逻辑。了解框架提供了什么,并考虑是否可以替换缺少的内容。