example Model-View-Presenter app in nodejs
我正在探索不同的mv*模式,并注意到mvp在.NET应用程序中的使用非常频繁,但在其他地方几乎没有。另外一个似乎合并了它的大型框架是GWT,但只是在某些部分。
说到它看起来像微软的原因,可以根植于至少两家大公司及其各自框架的设计决策。微软将MVP合并到.NET中。而苹果则选择了MVC。
至于javascript,请看一下最近的framework riot.js https://moot.it/blog/technology/riotjs-the-1kb-mvp-framework.html
虽然它不是一个特别的"node.js框架",但它是一个向"同构javascript"(在客户机+服务器上运行的javascript层)这一术语发展的例子,并且可以通过吸引来自不同经验和背景的许多工程师而将其带到桌面上。
从那篇文章:
Riot models define your application. It's your business logic exposed to outer world with a well-thought API. A completely isolated, testable unit that can be run in browser and server (node.js).
根据我的经验,请原谅我即将发表的总括声明,为什么MVP在这项技术中看不到那么多,是因为许多人要么没有听说过,要么忘记了它,或者只是没有看到什么不同于"控制器"是什么和"演示者"是什么。这并不意味着没有区别,tero piirainen已经在riot.js文章中为来自其他javascript MVC框架的用户很好地概述了一些事情。
在Nodejs没有任何MVP的好例子。我们做了大量的研究,并在
它还不完美,但我认为它填补了一个空白。欢迎提出请求。
https://github.com/echogloballogistics/mvp
我们最近用Nodejs和Express构建了一个Web应用程序。在进行这项工作时,我们在Express之上构建了一个小框架,以便更好地组织代码。框架强制您为GET请求编写单独的处理程序(演示者),并为POST请求编写命令。(见martinfowler.com/bliki/cqrs.html)。该框架还通过只允许从命令进行重定向来强制发布重定向获取模式(en.wikipedia.org/wiki/post/redirect/get)。NPM包是ExpressMVP(https://www.npmjs.org/package/expressMVP)。
tl;dr查看flatiron框架,尤其是cli插件。本文还介绍了https://blog.nodejitsu.com/writing-cli-apps-with-flatiron及其示例部分。
回答你的第一个问题,我会说,MVP并不是所有的微软,甚至维基百科的文章都说。只是微软的语言设计师选择了隐藏小部件实现细节的范例。
当你作为一个用户与一个小部件交互时,会有很多事情发生。在某种程度上,小部件本身似乎是一个小应用程序,有自己的业务逻辑模型,有自己的视图和控制器。例如,下拉列表:它有一组方法可以在屏幕上实际绘制一些矩形,也有一些方法可以将值列表显示为文本,当您单击某个项目时,背景颜色和文本的颜色会发生变化,这是根据某些规则发生的(考虑业务逻辑)。微软的.NET平台与用户界面有很大的关系。这就是为什么选择一个更适合这一目标的范例是如此重要。
另一方面,节点是一个完整的后端平台,它不是用于创建Web应用程序的框架。我不是说你不能或者不应该用它创建一个网络应用。我要说的是,节点代码在Web应用程序中的作用应该限于IO。获取请求、发送响应、向/从存储发送/接收数据,或者解析。当然,您可以在节点顶部创建一个用于创建Web应用程序的框架。
尝试在创建Web应用程序时跟踪MVP,您可能希望演示者尽可能接近小部件的实际呈现。如果Web应用程序是浏览器。在这种情况下,节点将扮演REST服务器的角色(或者可以使用任何其他首选的数据交换方式来代替这里的REST)。
节点可以用来创建不同类型的应用程序。这些将是CLI应用程序。在这里,您可以使用MVP创建应用程序,并让演示者位于节点中。要查找示例,我建议查看Flatiron Web框架,它对创建CLI应用程序有很好的支持,并且也有一些此类应用程序的示例:https://blog.nodejitsu.com/writing-cli-apps-with-Flatiron。
还有https://github.com/msdex/node-ncurses。这可以给你一个机会"滚动你自己的MVP"。当你的目标是探索事物时,这是一个很好的实践。
以mv*方式使用节点是绝对可能的。以下是我在构建应用程序时用作指导的一些非常好的问题/答案:
如何构造express.js应用程序?
ExpressJS如何构造应用程序?
节点也有一些基于mv*的框架:
- 斗牛士
- 新的sails.js(基于rails)
- 大多数节点框架都是建立在express.js上的,正如上面的答案所解释的,express.js可以调整为mv*。
这里是一个以mv*方式构建在纯Express上的示例应用程序。