如何开发100%服务器端应用程序?

时间:2014-12-21 15:15:25

标签: architecture server-side ria dynamic-websites server-side-scripting

TL; DR

我可以使用什么框架在服务器上保留100%的应用程序逻辑,同时提供RIA的交互性?

解释

回到90年代,人们可以用普通的PHP构建100%的服务器端应用程序。但随后对页内交互性的需求增加,越来越多的应用程序逻辑被转移到客户端javascript中。今天,通过websocket和完全动态的DOM,再次可以构建服务器端应用程序,同时满足所有页内交互要求。客户端上所需要的只是一个通用的JavaScript库,它通过websocket同步DOM和服务器。

虽然我相信这种网络开发方法has its merits,但我不想在这里讨论这种技术的优缺点。

我的问题是关于支持这种发展方式的2014年底可用的最新框架。只要它们的架构足够清晰,实验框架也是可以的。我不需要现有框架的清单。我希望看到一些实现这种软件架构的框架,或者如果没有这样的框架,我想了解那些最接近理想的框架。

到目前为止,我自己的研究表明Meteor正在以正确的方式进行,但它仍然鼓励在客户端上使用特定于应用程序的javascript,并将服务器端平台与客户端平台(即javascript)联系起来。我已经阅读了Trello architecture,它大大减少了客户端到模板处理器,但模板和相关的模板/绑定库是我想要回到服务器端的东西之一。 Amazon AppStream会将所有UI逻辑保留在服务器上,但对于Web开发而言,这是非常昂贵的,尤其是当用户将应用程序闲置在后台时。

更新:到目前为止,所有答案都集中在Meteor上。我删除了Meteor标签,因为它可能会产生误导。我之前提到过Meteor,因为Meteor的演示使得我可以选择是否要运行代码服务器端或客户端。现在很清楚Meteor不会通过网络传输任何UI,只传输数据。因此,它需要客户端上一半的应用程序,至少以模板的形式。

更新2:我找到了Remote Events for XML (REX),这是一种可用于从服务器端应用程序远程操作客户端DOM的协议。没有明确的方法将用户操作(点击,编辑)发送回服务器,但也许这些可以被定义为REX中的扩展事件,这是规范允许的。它仍然只是一个协议。我没有真正可以使用的软件。

更新3:我必须澄清一件事。简单地获取服务器端模板并将其转换为客户端模板,然后在客户端上执行这些模板,并不算作100%服务器端应用程序逻辑。虽然这样的框架允许我使用服务器端API,但它们将不可避免地给客户端带来负担并暴露大部分应用程序代码。我正在寻找只将呈现内容(和通用事件挂钩)发送到客户端的东西。

此外,关于小部件/控件,框架可以允许客户端代码来处理边缘情况(新的低级小部件),但必须不需要客户端典型应用程序逻辑(模板和高级小部件)的实现。

8 个答案:

答案 0 :(得分:4)

直言不讳,Meteor并不是你想要的。 Meteor框架提供的主要优势不是您正在寻找的部件。

老实说,我不确定适合您的应用程序是什么。但它肯定不是流星。

答案 1 :(得分:2)

Vaadin似乎非常接近你想要的。我自己没有经验,但从我读过的内容来看,它应该允许你在服务器端代码(Java)中编写整个应用程序(包括UI逻辑)。该框架负责处理不可避免的客户端事务(Ajax)。

<强>参考

答案 2 :(得分:1)

您可能需要考虑使用工具组合来实现此目标。 Meteor不是最适合您的方法,因为它依赖于客户端JavaScript并且只在线路上传递数据。

我建议使用Node.js作为服务器,因为它是Meteor的底层服务器。然后,您可以使用像jade或类似的服务器端模板引擎来呈现html。这将使您的应用程序动态,但对客户端的依赖性降低。你失去了所有的反应,但这是在服务器上渲染的权衡。

答案 3 :(得分:1)

流星是非常模块化的,所以你可以使用它,但它非常不同寻常。

您必须删除其中的客户端/基于Web的内容。这包含在meteor-platform包中。

最好有一个&#34;准系统&#34;应用

meteor create myapp
meteor remove meteor-platform

现在,您可以添加一系列使开发更有帮助的软件包(您可以删除其中任何一个):

meteor add logging ddp mongo check underscore random ejson

现在你有一个100%的服务器应用程序。

此应用程序与典型的Meteor应用程序略有不同,因为它没有“Web服务器”。提供任何客户端代码,它几乎是一个纯粹的服务器应用程序。

首先,您必须删除任何样板代码(myapp.html,myapp.css,myapp.js)并使用包含应用程序的方法main = function() { ... }的文件。请记住,您需要在此方法中保留您的应用程序,例如套接字侦听器(可能表达js?),一旦运行应用程序将停止

如果您打算使用Meteor over Node,我不确定您想要100%服务器端应用程序到底想要什么,这样可以让您拥有同步代码,内置mongo和DDP,这可能是要走的路。如果您不想要客户端或其他任何您不想要的东西,可以使用上述方法将其删除。

答案 4 :(得分:1)

使用服务器端事件模型,例如:

  

Blueprint的大部分理念和语法来自XForms。我们选择了一种完整的声明性语言,因为它是我们能够在各种各样的设备上有效运行的唯一方式,其中一些设备根本没有脚本。通过使用声明性语法,我们可以封装和隐藏脚本细节。在某些情况下,代码可以在手机上运行,​​在其他情况下,例如XHTML,我们可以将逻辑放在我们的服务器上。这是处理各种环境及其功能的完美方式。

Orbeon表单有一个命令行界面,使用名为XPL的管道和过滤器实现:

  

您可以使用Orbeon Forms构建运行管道的独立命令行应用程序。用例包括:创建网站的硬拷贝,从关系数据库导入或导出XML数据,测试管道,自动执行XML文件的重复操作(选择,转换,聚合等)。 Orbeon Forms成为您的“XML工具箱”。

     

Orbeon Forms附带命令行界面(CLI)。运行它的最简单方法是使用可执行文件orbeon-cli.jar文件并将其传递给管道文件:

java -jar orbeon-cli.jar pipeline.xpl
  

在这种情况下,管道可以使用相对URL,或者,如果使用绝对URL,可以使用file:protocol来访问文件,或者等效地使用oxf:protocol。

     

有时,最好在oxf:protocol寻址的资源沙箱下对文件进行分组。这是访问Web应用程序中的资源(文件)的标准方法,但它对命令行应用程序也很有用。在这种情况下,请使用-r选项指定资源管理器根目录,例如:

java -jar orbeon-cli.jar -r . oxf:/pipeline.xpl

或:

java -jar orbeon-cli.jar -r C:/my-example oxf:/pipeline.xpl

<强>参考

答案 5 :(得分:1)

这是一个非常有趣的问题,因为很多人都在努力在客户端构建应用程序并使用BeASS(Backend As a Service)。我想到了以下两点:

由于我对The Dojo Tookit最有经验,你可以做以下事情:

1。 Zend和Dojo集成

Zend(PHP和Apache服务器的主要贡献者之一)已将其框架与Dojo集成。从这里可以看出http://framework.zend.com/manual/1.12/en/zend.dojo.view.html纯粹通过使用PHP代码,他们可以在客户端呈现Dojo小部件。

2。 Dojo和Node.JS集成

通过执行此操作,Dojo和Node.js可以实现简单的intgreation。 http://dojotoolkit.org/documentation/tutorials/1.8/node/

但是,Dojo小部件(完全交互式,RIA等人,可以在这里看到http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/themes/themeTester.html)可以使用服务器端代码呈现并发送到客户端。请参阅此http://dojotoolkit.org/reference-guide/1.9/dijit/_AttachMixin.html和此http://jamesthom.as/blog/2013/01/15/server-side-dijit/

3。模板框架

与第2点类似,JavaScript存在许多模板框架。可能有许多框架在服务器端填充这些模板,只是将View代码发送给客户端。

尽管如此,请注意上述链接。 Dojo本身在开始时很难学习(后来它的功能让你感到惊讶!)但是上面的链接非常强大,很难学习。

就我个人而言,我认为我们已经进入了一个浏览器可以做任何事情的时代,服务器只是坐在那里寻找持久数据/促进多个用户和身份验证。

我会发布更多链接,当我遇到更多这样的框架,包括Pt的例子。 3

编辑:以下是PHP中发生的事情,它有效地将JavaScript用户事件简化为网络调用服务器。 http://www.xisc.com/

答案 6 :(得分:1)

我已经建立了这种精神的应用程序主要是因为我需要支持旧版本的IE,它不能处理繁重的客户端工作。基本方法是使用服务器端部分并通过ajax加载它们。在保持服务器逻辑的同时为您提供RIA。

我在asp.net webforms,asp.net mvc,rails和node / express中完成了这个。

一个示例是编辑记录的表单。使用knockout,angular,jquery等...你的表单将成为DOM的一部分,你将通过ajax加载数据,然后执行绑定,如果你使用像jquery这样的东西或让框架在angular中进行双向绑定,淘汰赛,......

在这种方法中,您将从服务器加载部分,DOM和绑定将在服务器上完成,您将完全用响应替换div的内容。

详细信息取决于您使用的语言,但我有一个使用asp.net mvc编写的生产中的商业应用程序正是这样做的,我们在我们公司使用的内部工具用node / express / jade编写的那样做同样。遵循代码要容易得多,并且您可以获得更多的浏览器兼容性。尽管如此,这还不是行业发展的方向。对于较新的代码,我们使用的是knockout和angular。

答案 7 :(得分:1)

我建议使用Oracle ADF 它具有一组UI组件,它有一个内置的ABC(ADF Business Componenet),可以很好地抽象数据层,因此您可以从数据库或Web服务或文件中获取数据或....

您也可以使用JHeadStart这是一种代码生成器,它可以为您构建网页和模块,您可以非常快速地构建您的Web应用程序。