在RoR的大型项目中使用ExtJS的风险?

22
我们正在使用Ruby on Rails框架(CRM系统)开发一个相当大的应用程序,并考虑重写成使用ExtJS,这样Rails只需处理数据,而ExtJS将以类似桌面的方式处理所有浏览器任务。
有经验的人有什么建议和最佳做法?ExtJS足够成熟以用于相对较大(且复杂)的应用程序吗?Rails部分怎么处理最好?
编辑:为了明确。我希望以这样的方式进行操作,即一次性加载所有javascript客户端应用程序代码(在应用程序启动时,最好作为一个压缩的js文件),然后只使用ajax发送数据到和从Rails应用程序。同时,也希望能够使用ERB来动态生成Ext应用程序元素。
10个回答

29

我目前有一个非常大的桌面式应用程序,使用ExtJS编写。它曾经运行在Perl的Catalyst MVC框架之上,但是一旦整个View层被转换为基于ExtJS的桌面,我开始将模型和控制器迁移到Ruby on Rails。它同样快速,甚至更快,并且易于维护,代码库也更小。

  • 确保将你的active record配置设置为不在json中包含模型的根名称,这样Ext的JsonStore就可以无问题地读取记录了。ActiveRecord BASE上有一个选项叫做include_root_in_json,需要将其设置为false。

  • 确保正确定义你的Ext Application类,最大程度地利用代码重复,你还需要某种方法来清理未使用的节点在DOM。如果不使用最新版本的Safari或Firefox 3.1,JavaScript性能可能会成为一个真正的问题。

  • 你可能需要一些缓存数据的服务器端缓存方法,在页面加载时以JSON格式提供给你的应用程序。这将减少通过Ajax进行的往返次数。

  • 一定要充分利用Ext的WindowManager和StoreManager对象,或者从Ext.util.MixedCollection中创建自己的对象。

  • 将你的代码开发为单独的可管理文件,然后有一个构建过程将它们合并为单个文件,然后运行YUI的压缩器或Dean Edwards Packer对其进行压缩/混淆。所有JS和CSS都以自己的单个文件提供,包括Ext提供的文件。


2
+1 对于“先分离再合并”的构建流程来说至关重要,尤其是对于所有大型的 JavaScript 应用程序。 - dmackerman

14
[2012更新] ExtJS已被Sencha收购,提供GPLv3许可证和两种商业许可证。

[2008年10月评论] 从技术上讲,ExtJS非常棒,但几个月前的许可危机让我开始看其他框架了 - 我现在完全不信任ExtJS的创作者。我不喜欢他们措辞的许可证,也不喜欢他们假装是开源倡导者,同时明显试图不公平地从那些相信他们的人中获利。

我只是出于道德原因反对使用ExtJS。


1
这正是我关心的问题。除了开源项目之外,商业许可证费用也相当高昂。看看我与Senecha的销售副总裁Ted Driscoll的交谈,你就会知道我在说什么了。http://padcom13.blogspot.com/2011/03/ext-js-licensing-be-extra-careful.html - Matthias Hryniszak
同样的担忧我也曾有过,但现在Sencha也提供了ExtJS的GPLv3许可证。--http://www.sencha.com/products/extjs/license/ - Dan Dascalescu

5

这是对我之前回答米兰评论的回复,但由于我在这里是新手,没有足够的声望点来回复:

"sp未定义"存在问题,这是Rails将JavaScript文件缓存到一个大文件中(否则可能会有几百个文件)的结果。缓存引入了一些奇怪的换行符错误,导致整个过程失控。这让我苦恼了一段时间,但解决方法是将Ruby从1.8.6(补丁级别72)更新到最新的1.8.7。这解决了问题,请再次检查它(您需要进行完全刷新才能击败资源缓存)。

很高兴你之前接触过Ext MVC。目前我完全相信它必须很难理解,主要是由于缺乏示例、教程和演示。但代码本身已经合理地记录了(至少较新的代码如此,还有很多需要清理的代码)。

我目前正在重构一些关键类,以便为正式发布做好准备。当那时准备好了(我想大约需要几周时间),我将生成文档并设置一个快速站点,其中包含一些演示和示例代码。当我这样做时,我会在我的博客上发布一篇文章(http://edspencer.net)。

我希望通过这个框架提供一种使编写此类应用程序变得更加简单的方式,并建立一些约定。目前没有共识或默认的方法来构建ExtJS应用程序,因此我们可以采取的任何措施都是朝着正确方向迈出的一步!欢迎评论和贡献。


艾德,您能否友好地向我们提供一些关于您所做工作的基本概述(部件如何协同工作,使用它时要遵循的基本工作流程等)?我已经调试了一段时间,但其中包含的代码量仍然有点令人不知所措。谢谢。 - Milan Novota
嗨,米兰,没问题,我会在接下来的几周内在我的博客上发布如何把这些东西组合起来的完整概述。我们现在正忙于搬到伦敦的过程中,情况有点忙乱!请看 http://edspencer.net - 这是我发布任何更新的地方。 - Ed Spencer

4

我已经成功部署了一个大型的RoR/ExtJS应用程序,就像你描述的那样(“单页”客户端AJAX驱动)。 Ext_scaffold基本上是一个红鱼。

让RoR和ExtJS顺利地运行在一起并不太困难。根本选择是扩展ExtJS以“讲Rails语言”,修补RoR以“讲ExtJS语言”,还是在中间相遇。这将取决于您的团队技能所在的位置。

我采用了中间相遇的策略,其中包括:

  • 扩展Ext.data.StoreExt.data.Record以了解Rails路由约定
  • 黑客Ext.grid.EditorPanelExt.form.BasicForm,以便与ActiveRecord关联良好
  • 编写一些模块来扩展ActiveRecord::BaseApplicationController,以简化从Ext.grid.EditorPanelExt.form.BasicForm提交

就是这样。

话虽如此,使用ExtJS也有缺点。

  • 你必须深入了解内部工作。不要被演示所迷惑。
  • 社区文档质量差,以PHP为中心。
  • 从Github/Lighthouse为中心的RoR世界来看,使用VBulletin就像在1998年醒来一样。我的意思是,没有公共错误跟踪器,只有一个更新的论坛帖子(WTF?)。
  • 代码有点过度工程化。
  • 该团队失去了开源信誉,因此失去了开源氧气。
  • 该团队似乎专注于与GWT集成(有人能说“企业$ey”吗?)。

是的,Ext的代码库很庞大,我们预计在那方面要做一些肮脏的工作(尽管我们的js技能落后于服务器端技能),还有一些RoR/AR部分的管道工作。你能否分享一些关于你在两个方面所做更改的具体细节?无论如何感谢! - Milan Novota

4
您可能想看一下Netzke框架,它被认为可以帮助创建复杂的单页面Web应用程序,并强调模块化方法。Netzke的优点包括:代码的可重用性和可扩展性;一次从服务器加载每个组件的类(并进行评估),可以节省大量的服务器-客户端通信时间;它是开源的并且在不断发展中,有现场演示和示例代码;它具有可直接使用的预构建组件,您甚至可以在Rails中对它们进行配置,而不必触及ExtJS;它已经被作者用于一个复杂的物流应用程序的真实开发。Netzke的缺点是代码还很年轻,社区规模小。如果您有兴趣,请看这里的描述和设计细节:https://github.com/nomadcoder/netzke-core。可以在这里找到现场演示/教程:http://netzke-demo.herokuapp.comhttp://yanit.heroku.com

这个演示看起来很酷,非常适合用于CRM或项目管理系统(其中大多数使用过时的页面导向设计)- http://superuser.com/questions/380146/open-source-collaborative-project-management-and-crm-software-with-api - Dan Dascalescu

1

Ext已经足够成熟来处理这种情况。我目前正在开发一个使用大量Ext的Rails项目,最困难的部分肯定是使用Rails的to_json来呈现Ext可以读取的JSON(用于数组、哈希、未通过验证的模型等)。

查看Rails的ext_scaffold插件。我从这里开始,并对其ActiveRecord/ActionView扩展进行了修改,直到它能够满足我的需求。


1

我也有使用ExtJS和Rails的经验。使用这个框架是一个很好的方式,可以免费获得一些漂亮的小部件。如果你用它来开发单页应用程序,REST约定也应该很适合这个框架。同时也可以很好地与RJS配合使用。

以下是我对使用这个框架的抱怨:

  1. 由于重新加载单页应用程序是愚蠢的,所以你不能真正利用flash[:notice]。这使得传递验证通知和消息变得繁琐,因为你必须使用RJS/ javascript方法来显示它们。

  2. 你不能太多地使用erb,因此你必须将许多逻辑封装到json回调中。


我通过在Rails中生成js文件来解决ERB问题。只需创建一个带有动作的控制器,将所有请求应用程序js文件的路由指向该动作。这些文件像普通视图一样生成。另一个收获是我的js文件不会公开访问。 - Milan Novota

1
我已经部署了ExtJS和Rails用于许多应用程序,它们肯定可以相互通信。我们在http://demo.domine.co.uk/admin上为我们目前正在开发的一个应用程序组合了一个快速演示。暂时忽略前端,因为它还没有完成 - 管理员部分基本上已经完成,您可以使用以下信息登录:

用户名:edward 密码:rarrar

由于演示尚未完全完成,因此我不能保证它在除Firefox以外的任何其他浏览器中都能正常工作。它在其他浏览器中不起作用没有任何理由,只是我还没有花时间测试它们。重点是关于与Rails的集成。

开始菜单上的每个应用程序都通过JSON与Rails后端进行交互。我编写了一个基本的Rails插件来为我们完成大部分工作。我很快就会发布该代码,但现在希望这能给出这两种技术如何很好地协同工作的一些想法...


嗨,Ed,谢谢你的回答。我看到了你在Github上的一些努力,但说实话,我还没有完全理解它。演示应用程序现在无法正常工作(Fbug显示“sp未定义”)。你有关于代码发布日期的大致想法吗?再次感谢你。 - Milan Novota

0

好的。我在许多项目中使用extjs gxt gwt,它非常易于开发。但是我想告诉你,我用extjs+gwt(gxt)构建了我的项目,我不确定Ruby。

链接文本

0

虽然我没有使用过ExtJS(除了在“Practical Rails Projects”书中读到的),但我使用了jQuery Flexigridjrails来获得更多桌面化的感觉。

这个方法效果还不错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接