nodejs 中的示例 Model-View-Presenter 应用程序

Posted

技术标签:

【中文标题】nodejs 中的示例 Model-View-Presenter 应用程序【英文标题】:example Model-View-Presenter app in nodejs 【发布时间】:2013-06-13 13:48:10 【问题描述】:

我是 exploring 不同的 MV* 模式,并注意到 MVP 在 .Net 应用程序中被大量使用,但在其他地方几乎没有。 似乎包含它的唯一其他大型框架是 GWT,但仅在某些部分。

    为什么 MVP 如此受微软欢迎(为什么它在其他语言中几乎没有那么流行)? 是否有使用 MVP 的 nodejs 应用程序/项目(最好有我可以查看的源代码)?

【问题讨论】:

也许这只是***.com/questions/327955/…(in .net)的一个例子 Java SWT 和 Swing 是 MVP-ish,我不记得 Cakephp 是 MVC 还是更具体的 MVP 方法——我已经很久没有使用它了。至于一般的 javascript,有一些框架可以在客户端执行 MV* 设计模式,我可以喋喋不休。但是,我假设您正在寻找服务器端的东西,也许是与 ORM 一起工作的东西,如 sequelize,对吗? 是的,我正在寻找服务器端 MVP 示例。如果有的话,不要真正关心它会使用什么 ORM。在客户端,我认为骨干网接近 MVP 要获得一个很好的 Node 框架集合,请在此处查看:github.com/joyent/node/wiki/modules#wiki-web-frameworks-full 但是,这些框架似乎都不是 MVP,但我敢打赌,其中一个重量较轻的框架可以修改为通过视图路由。还有这篇有趣的文章,虽然它在 Node 方面非常古老,但它来自 nodejitsu 人,所以可能很有趣:blog.nodejitsu.com/scaling-isomorphic-javascript-code#rvp 【参考方案1】:

要说它看起来像微软的东西,可以根植于至少 2 家大公司的设计决策及其各自的框架。微软将 MVP 整合到 .NET 中。而 Apple 在 Cocoa 中选择了 MVC。

至于JavaScript,看看最近的框架 Riot.js https://moot.it/blog/technology/riotjs-the-1kb-mvp-framework.html

虽然它不是一个特别的“node.js 框架”,但它是朝着“同构 JavaScript”(JavaScript 层运行在客户端 + 服务器上)这个术语发展的一个例子,并且可以通过吸引了许多具有不同经验和背景的工程师。

来自那篇文章:

Riot 模型定义了您的应用程序。这是您的业务逻辑通过深思熟虑的 API 暴露于外部世界。一个完全隔离的、可测试的单元,可以在浏览器和服务器 (node.js) 中运行。

根据我的经验,请原谅我即将发表的笼统声明,MVP 在这项技术中很少见的原因是因为很多人要么没有听说过,要么忘记了,要么根本没看到与“控制器”和“演示者”有很大不同。这并不意味着没有区别,Tero Piirainen 在 Riot.js 文章中为来自其他 JavaScript MVC 框架的人很好地概述了这些内容。

【讨论】:

【参考方案2】:

在 nodejs 中没有任何伟大的 MVP 示例。我们进行了大量研究并使用nodejs.net 中的MVP 模式实现了TODO app。

它还不完美,但我认为它填补了一个空白。欢迎请求请求。

https://github.com/EchoGlobalLogistics/mvp

【讨论】:

【参考方案3】:

绝对可以以 MV* 方式使用 Node。以下是我在构建应用程序时用作指导的一些非常好的问题/答案:

How to structure a express.js application?

ExpressJS How to structure an application?

还有一些基于 MV* 的 Node 框架:

Matador 新的Sails.js(基于 Rails) 大多数节点框架都建立在Express.js 之上,可以将其调整为 MV*,如上述答案中所述。

这是一个 sample app,它以 MV* 方式建立在纯 express 之上。

【讨论】:

【参考方案4】:

tl;dr 查看 flatiron 框架,尤其是 CLI 插件。还有这篇文章https://blog.nodejitsu.com/writing-cli-apps-with-flatiron 及其示例部分。

回答你的第一个问题我想说 MVP 并不是微软的全部,甚至***的文章也这么说。只是微软的语言设计者选择了隐藏小部件实现细节的范例。

当您作为用户与小部件交互时,会发生很多事情。在某种程度上,小部件本身似乎可以看作是一个小应用程序,它有自己的业务逻辑模型,有自己的视图和控制器。例如一个下拉列表:它有一组方法可以在屏幕上实际绘制一些矩形,它也有将值列表显示为文本的方法,当您单击某个项目时,背景和文本的颜色会发生变化根据某些规则发生的事情(想想业务逻辑)。 Microsoft 的.Net 平台与用户界面有很大关系。这就是为什么选择更适合该目的的范例如此重要的原因。

另一方面,Node 是一个完全的后端平台,它不是用于创建 Web 应用程序的框架。我并不是说你不能或不应该用它创建一个网络应用程序。我要说的是,Node 代码在 Web 应用程序中的作用应该仅限于 IO。获取请求,发送响应,向/从存储发送/接收数据,也许是解析。当然,您可以创建一个框架来在节点之上创建 Web 应用程序。

在创建 Web 应用程序时尝试遵循 MVP,您可能希望 Presenter 尽可能接近小部件的实际呈现。对于将是浏览器的 Web 应用程序。在这种情况下,节点将扮演 REST 服务器的角色(或者这里可以使用任何其他首选的数据交换方式来代替 REST)。

Node 可用于创建不同类别的应用程序。那些将是 CLI 应用程序。在这里,您可以使用 MVP 和 Node.js 中的 Presenter 创建应用程序。要查找示例,我建议查看 flatiron web framework,它对创建 cli 应用程序有很好的支持,并且此类应用程序的示例也很少:https://blog.nodejitsu.com/writing-cli-apps-with-flatiron。

还有https://github.com/mscdex/node-ncurses。这可以让您有机会“推出自己的 MVP”。当您的目标是探索事物时,这是一种很好的做法。

【讨论】:

【参考方案5】:

我们最近使用 nodejs 和 express 来构建一个 web 应用程序。在处理它的同时,我们在 express 之上构建了一个小框架来更好地组织我们的代码。该框架强制您为 GET 请求编写单独的处理程序(Presenters),为 POST 请求编写命令。 (参见 martinfowler.com/bliki/CQRS.html)。该框架还通过仅允许来自命令的重定向来强制执行后重定向获取模式 (en.wikipedia.org/wiki/Post/Redirect/Get)。 npm 包是 expressmvp (https://www.npmjs.org/package/expressmvp)。

【讨论】:

以上是关于nodejs 中的示例 Model-View-Presenter 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

上皮的Nodejs示例

异步 nodejs 模块导出

nodejs 中的异步和 Q 承诺

从 NodeJS、NLP 中的文本中提取人名

NodeJs 中的 GraphQl - 对象类型的解析器

使用 Jade、NodeJS、Express 的动态 html 页面