【问题标题】:How to develop 100% server-side applications?如何开发 100% 的服务器端应用程序?
【发布时间】:2015-02-19 20:16:03
【问题描述】:

TL;DR

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

说明

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

虽然我相信这种 Web 开发方法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,但它们不可避免地会给客户端带来负担并暴露出大部分应用程序代码。我正在寻找只向客户端发送渲染内容(和通用事件挂钩)的东西。

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

【问题讨论】:

  • 我很想回答说,Asp.Net MVC 可以通过纯服务器渲染实现无 Java 脚本,并且可以在浏览器中禁用 JS 的情况下运行。它可以被编码来做一些客户端处理,由服务器验证支持......但我不确定我是否正确地得到了问题的上下文。
  • @trailmax 不,那不行。 ASP.NET MVC 就像 PHP。它生成静态非交互式页面,需要重新加载页面才能进行任何更新。正如我在问题中解释的那样,页面内交互是必须的。我的问题是服务器端应用程序如何在不将一半应用程序逻辑溢出到 JS 代码中的情况下将页面内交互流式传输到浏览器。
  • 是的,我想我错过了你问题的核心。这是一个好问题!祝你好运找到答案(不幸的是我不能在这里添加太多)
  • 推荐问题在这里是题外话。
  • @EJP 这不是推荐问题。我不是在征求意见或评论。我要的是我想到的架构模型的实现示例(一个就足够了)。

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


【解决方案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: 协议访问文件,或者等效地使用 oxf: 协议。

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

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

或:

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

参考文献

【讨论】:

  • @RobertVažan 让应用程序代码远离客户端的方法是提供 AJAX 和 DOM 事件的替代方案。 XRX 使用 XML 事件,Linked Data 使用 JSON PATCH 和 SPARQL POST,Curl 使用 Surge RTE。
  • XForms:我仔细研究了它。这是客户端模板系统(尽管客户端一次只能看到一个模板),它通过网络传输数据并将其呈现在客户端上。它不处理服务器上的事件,尽管它支持通过原始脚本语言转发事件。似乎没有任何方法可以在不重新加载页面的情况下完全重构页面(加载新的 XForm)。也没有任何方法可以将数据下推到客户端。虽然毫无疑问很有趣,但它远不是我想要的。
  • Curl:引用您链接的页面:“[Curl 专为] 客户端 [...] 处理、偶尔连接的计算、[...] 客户端数据持久性”和“Curl 内容需要 Curl 软件才能显示”。对我来说,这听起来像是 Java 小程序。当然不是我要找的那种标签/DOM/UI 流媒体平台。
  • @RobertVažan 在 XRX 中,完全重构页面的方法是通过XBL Components。将数据下推到客户端的方式是通过request.setAttribute(demo)
  • @RobertVažan 标签/DOM/UI 流媒体平台?对我来说听起来像Coldfusion
【解决方案2】:

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

参考文献

【讨论】:

  • Vaadin 确实是 100% 服务器端 RIA 框架,尤其是在启用 websocket 传输时。它也非常稳定且功能齐全。我接受这个答案。不过我应该注意到,Vaadin 更像是一个浏览器内的桌面模拟器,而不是真正的 Web 框架,这意味着一些 SEO 和性能问题,我希望通过服务器端来解决这些问题。
【解决方案3】:

坦率地说,Meteor 不是您想要的。 Meteor 框架必须提供的主要优势不是您要使用的部分。

老实说,我不确定哪种应用程序适合您。但它肯定不是 Meteor。

【讨论】:

    【解决方案4】:

    我建议使用Oracle ADF
    它有一系列 UI 组件,并且它有一个内置的 ABC(ADF 业务组件),它对数据层进行了很好的抽象,因此您可以从数据库或 Web 服务或文件或...中获取数据。

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

    【讨论】:

      【解决方案5】:

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

      我已经在 asp.net webforms、asp.net mvc、rails 和 node/express 中完成了这项工作。

      一个示例是编辑记录的表单。使用敲除、角度、jquery 等......您的表单将成为 DOM 的一部分,您将通过 ajax 加载数据,然后如果您使用 jquery 之类的东西或让框架以角度进行双向绑定,则执行绑定,淘汰赛,...

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

      具体情况取决于您使用的语言,但我有一个使用 asp.net mvc 编写的商业应用程序,它完全可以做到这一点,我们公司使用的内部工具用 node/express/jade 编写,可以做到这一点以及。遵循代码要容易得多,并且您可以获得更多的浏览器兼容性。尽管如此,这不是该行业的发展方向。对于较新的代码,我们使用敲除和角度。

      【讨论】:

        【解决方案6】:

        这是一个非常有趣的问题,因为很多人都在努力在客户端构建应用程序并使用 BeASS(后端即服务)。在我的脑海中,我想到了以下两个:

        由于我对 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 的简单集成很容易。 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 的模板框架。可能有很多框架可能会在服务器端填充这些模板并将视图代码发送到客户端。

        请注意上述链接。 Dojo 本身一开始就很难学(后来它的威力让你吃惊!)但是上面的链接是非常强大的东西,很难学。

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

        当我遇到更多这样的框架(包括 Pt 的示例)时,我将发布更多链接。 3

        编辑: PHP 中发生了一些事情,它有效地将 JavaScript 用户事件减少到只有对服务器的网络调用。 http://www.xisc.com/

        【讨论】:

        • 您提到的一些框架(Prado,静态服务器端模板)在每个用户操作时执行全页刷新,丢失滚动条位置和其他视图状态。其他框架(Zend/Dojo、Node.js/Dojo)只是将服务器端模板编译成客户端模板。
        【解决方案7】:

        Meteor 非常模块化,因此您可以使用它,但它的意义非常不同。

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

        最好有一个“准系统”应用程序

        meteor create myapp
        meteor remove meteor-platform
        

        现在您可以重新添加一些有助于开发的软件包(您可以删除其中任何一个):

        meteor add logging ddp mongo check underscore random ejson
        

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

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

        首先,您必须删除所有样板代码(myapp.html、myapp.css、myapp.js),并拥有一个包含您的应用程序的方法为 main = function() { ... } 的文件。请记住,您需要在此方法中使用一些东西来保持您的应用程序正常运行,例如套接字侦听器(可能是 express js?),一旦它运行,应用程序就会停止

        再次,我不确定你想要一个 100% 的服务器端应用程序到底想要什么,如果你打算使用 Meteor over Node,它的好处是允许你拥有同步代码、内置 mongo 和 DDP,这可能是要走的路。如果你不想要客户端的东西,或者任何你不想要的东西,你可以使用上面的方法删除它。

        【讨论】:

        • 我是否正确理解您的解决方案完全删除了 UI?如果是这样,那么这不是我所要求的。我想要 UI,但我想要在服务器上执行所有模板和其他应用程序代码。
        • @RobertVažan 我建议你删除你不想要的并添加你想要的。如果您希望在您正在寻找 SSR 的服务器上执行模板代码 (atmospherejs.com/meteorhacks/ssr)
        • SSR 非常适合静态页面,但我特别在寻找丰富的页面交互性,即模板必须是实时的 - 包含事件、数据绑定等。
        【解决方案8】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-25
          • 2021-10-21
          • 1970-01-01
          相关资源
          最近更新 更多