作为RIAEasy的主创,笔者深受多年使用 Delphi/Lazarus 的影响,在构思 RIAEasy 的整体构造时,很自然地引入了很多看上去是 Delphi/Lazarus 的思想,比如: l RIAEasy中的页面模块(.js),相当于Delphi/Lazarus 中的.dfm和.pas。 l RIAEasy中的页面模块组装函数 rias.filer(),相当于Delphi/Lazarus 中的TFiler。 l RIAEasy是面向对象的,所有的控件都是对象,继承于Destroyable对象,相当于Delphi/Lazarus中的TPersistent。 l RIAEasy中的数据集控件Store,相当于 Delphi/Lazarus 的 TDataSet/TDataSource。 等等…… 然而,RIAEasy毕竟是针对 RIA/SPA 开发,也有自己的特色,比如: l 模块都是 AMD 的。 l 基于dojo的declare,RIAEasy中的对象是多继承。 l 同样的,基于dojo的原因,RIAEasy是异步的。 等等…… 作为面向RIA/SPA应用的开发工具,RIAEasy很自然地需要整合服务器端和前端作为一个整体进行开发。 传统上,web应用的服务器端多采用java和php,然后,随着Node.js和Nashorn的推出,服务器端采用js已经成为可能。出于提高整体开发效率,降低开发成本的考虑,RIAEasy的服务器端决定采用js,并同时支持Node.js(+express)和Rhino、Nashorn(+jetty)。 在众多的js框架中,比如:dojo、yui/extJS、jquery 、mootools等,dojo具有最为完整的类库,而不仅仅只适用于前端,所以,我们最终选择了dojo作为RIAEasy的基础框架。 Maqetta,是一个基于dojo的开源在线可视化设计工具,不过已于2013年3月停止了发展:http://maqetta.org/news。RIAEasy最初打算借鉴maqetta的思想,但是深入了解后,发现其主要还是针对HTML进行设计,且主要是适用于概念、原型设计,并不适于实现RIAEasy的发展目标,于是放弃了借鉴的想法。 使用RIAEasy开发出来的产品,应该能够直接进行生产部署,故而RIAEasy不只是一个界面设计器,还需要提供一套完整的运行期动态页面模块和控件实例的组合、拼装机制,以及全局运行环境;此外,由于要支持SPA,故而RIAEasy必须实现一套运行期动态创建(create)、销毁(destroy)机制,以保障在页面销毁的时候能够正确地释放内存资源。 因为RIAEasy自身就是一个可视化设计环境,完全可以不用通过HTML的可视化设计来制作展现界面,故而RIAEasy设计出来的内容以.js输出并保存。虽然用js创建dom结构比用HTML创建有一些性能的损失,但这个损失实际应用中很小,可以忽略,而其好处却很明显:界面元素灵活、可控,逻辑清晰;特别的,支持非dom元素,将来可以兼容canvas元素、控件。 RIAEasy基于dojo框架,理论上兼容dojo的各种类,以及其他基于dojo实现的类、包,比如gridx、cbtree。为了更好地保持RIAEasy自身的完整性和独立性,我们并没有完全直接地使用dojo的类,而是包装了一层进行隔离。此外,实际开发过程中,我们发现dojo中大多数类、控件并不能很好地支持运行期动态创建、销毁,所以,我们对dojo的部分类、控件进行了扩展,包括Destroyable、_WidgetBase、各种Store,并将对象实例的 Owner 和 Parent 分离处理,以保证运行期的正确销毁。 RIAEasy目前的版本为0.7,初步实现了web MIS应用的可视化开发,开放站点为:http://www.riaeasy.com:8081