能否将Dojo与其他JS框架结合使用?

11

我们正在使用Dojo(1.9.3)作为构建单页应用程序的JS框架。然而,我们花费了太多时间在Dojo的怪癖上,因此即使是简单的任务也需要很长时间来实现。由于缺乏适当的文档,我们经常不得不阅读源代码,然后实施解决方法。

我认为,如果我们转移到其他框架,可以加速开发并使代码更易于维护。由于我们的代码库相当大,因为它是一个复杂的应用程序,所以我们没有时间一次性全部重写。因此,我希望可能将Dojo与其他框架组合起来,以便我们可以逐步远离Dojo。我只是在业余时间涉足这些其他框架,并编写了一些小的示例应用程序,因此我并不认为我能够确定它们是否与另一个框架兼容,因此我希望你们中的一些人可以提供意见。

我调查过的框架——按我的短暂调查顺序排列,但请随时说服我相信其他框架:

  1. Ember
  2. React
  3. Polymer
  4. Angular(最后一项是因为我害怕主要的2.0大修)

虽然主要问题是是否可能这样做,请也建议您是否认为这样做是不好的想法。

2个回答

10
从 Dojo 的角度来看,我能说的最重要的是,Dojo 本身是一个工具包,不是一个框架,因此通常不应干扰其他脚本或框架。另一方面,反之则不一定成立。因此,虽然我不能代表您列表中所有选择,但我认为 Dojo 本身不会妨碍您。
我能想到的一个可能的例外是,如果任何一个所涉及的框架增强了原生原型,特别是Object,因为这将影响所有对象中的可枚举属性,并可能对使用 hasOwnProperty 的 for...in 循环的任何脚本造成破坏。
我能想到的唯一其他例外是,是否有任何所涉及的框架不与 AMD 模块加载器协作良好的原因。
话虽如此,我也建议您对框架的"承诺"持保留态度 - 您说现在实现 Dojo 中的某些东西需要付出努力,自然而然,您列出的框架具有吸引力,因为它们通过提供模式和约定使应用程序开发的某些部分变得容易 - 但您应该问的问题是,当您需要在这些约定之外或违背这些约定时,您的框架会使您的工作变得多么困难?Dojo 可能有一个学习曲线,但它通常不会阻止您做任何事情。

1
感谢您的输入。关于其他框架的“承诺”:我只是觉得在使用Dojo时,当你卡住了需要找信息或帮助时会比较困难,而且由于其他框架更受欢迎,我期望使用它们会更容易些。 - mflodin
3
你可以经常尝试访问道场(Dojo)的邮件列表、在irc.freenode.net上搜索 #dojo,或者查看这个stackoverflow标签,希望能对你有所帮助 :D - Ken Franqueiro

6
你可以将它们结合使用,但这也取决于你要做什么。有些操作可能需要更多的时间进行集成。
Dijit
我只有使用Ember.js和AngularJS的经验,但这些框架中的一个常见概念是数据绑定。数据绑定允许您简单地更新模型,视图将反映模型中的更改。
然而,这些通常与小部件不兼容。小部件(如Dijit库)创建自己的DOM,因此,像Ember.js或AngularJS这样的框架不“知道”这些更改,并且在这种情况下无法更新视图。
为了使其工作,您将不得不将您的小部件包装成组件(Ember.js)或指令(AngularJS)。这样包装的示例可以在 this answer 中找到。
依赖项加载

依赖加载可能会令人困惑。AngularJS带有自己的依赖注入系统,这意味着您将不得不使用Dojo AMD加载程序加载Dojo模块和AngularJS依赖注入。据我所知,这两者可以很好地配合使用(我看到了使用RequireJS AMD加载程序的示例,因此应该是可行的)。

对于Ember.js,我在与AMD加载程序集成方面遇到了一些麻烦。Ember.js的创建者Tom Dale不相信AMD,并且我看到了尝试使用AMD加载程序加载Ember.js组件的几个问题。

这完全取决于您希望如何使用这些框架以及您想要付出多少额外努力。对我来说,看起来您甚至不确定要使用这些框架做什么,因为例如React.js或Polymer与AngularJS或Ember.js有完全不同的目的。


感谢您的输入。是的,我同意React和Polymer与Angular和Ember不同,它们提供了一种制作组件的方式,但我还不确定我们想要走哪条路。但我觉得第一步是检查是否有可能这样做。 - mflodin
这是一个好答案。将 Dijit 小部件集成到 Angular 数据绑定方案中的难度确实是令人沮丧的真正原因。就使用 AMD 或其他模块格式与 Angular 结合而言,根据您如何构建应用程序,它实际上是可行的。关键在于不要在定义站点注册指令、服务等angular.module('app').service(...),而是将它们定义为模块。然后你只需要在一些地方考虑 Angular 的全局性质,代码会更清洁,作为奖励更具可移植性。 - Aluan Haddad

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