最近在Angular社区的原型开发者间,一种全Javascript的开发架构MEAN正忽然流行起来。其首字母分别表明的是:(M)ongoDB——noSQL的文档数据库,使用JSON风格来存储数据,甚至也是使用JS来进行sql查询;(E)xpress——基于Node的Web开发框架;(A)agular——JS的前端开发框架,提供了声明式的双向数据绑定;(N)ode——基于V8的运行时环境(JS语言开发),能够构建快速响应、可扩展的网络应用。javascript
MEAN的支持者宣称,若是整个开发栈均能使用JS,必然会大大地提升效率,这一点毋庸置疑是一个很大的卖点。这样一来,开发人员(不管是前端仍是后端)不只能使用一致的数据模型,在其它方面也一样能够得到一致的编程体验。css
例如,拿Mongo来讲,你可使用类JSON格式(BSON,二进制的JSON)来存储数据,而后在Express/Node中调用JSON查询语句,再将结果以JSON格式传给前端的Angular显示,这样,也天然使调试程序容易了不少。前端
注意: 事实上,在MEAN架构中,前端的Angular并非必须的,你能够将它替换成其余的前端框架,如Backbone、Ember或者Polymer。java
如上所提,这个架构最重要的优点在于能使用单一语言,这也是其选择了Mongo的首要缘由。 这里就不讨论noSQL的是与非了。一些人对MEAN架构的指责在于,MongoDB能够很好地胜任中小型的应用,可是对于大规模应用(百万级用户)来讲可能就捉襟见肘。我想说的是,这彻底取决于你如何使用它。node
SQL数据库自己是强类型的,所以能够在很大程度上保证某种层次的一致,从而确保许多类型的脏数据一开始就没办法进入数据库。而NoSQL则是弱类型的数据库,这使得它在数据验证方面力不从心,而只能交给开发人员来实现,基于这样的特性,它尤为适合存储那些不规范的数据,特别是在原型开发阶段,此时数据模型正在经历快速变化。git
SQL和noSQL间的技术差异,归根结底是要在性能和稳定性间做出平衡。有些状况下,对数据的事务处理一旦设定后就不会轻易变化,那么此时使用Mongo就很是合适;然而有时候也会涉及更为复杂的事务处理,会牵扯到许多独立的业务逻辑,因为Mongo并无提供一个简单的数据模型来支持必定级别的原子操做,所以SQL在这个时候能够派上用场。github
但不管如何,不论你是否选择MEAN中的M,你最终都须要根据自身的需求选择出合适的工具来作正确的事情,sql
能够简单地把Express当作是一个在Node平台下搭建Web应用的工具集。在Node的基础上,它提供了许多简洁的接口来建立请求节点、处理cookie等,此外还提供了许多功能来帮助你搭建本身的服务器。总的来讲,Express在如下几个方面有优点:数据库
1
|
app.get(/account/:id, function(req, res){ /* req.params('id') is available */ }); |
1
|
app.get('/', function(req,res){ res.json({object: 'foo'}); }); |
若是想要很快上手MEAN,那么mean.io是一个很不错的选择。该项目旨在解决MEAN架构中一些常见的集成问题, 目前维护得很好,文档也很清楚,并且能够很方便地自行添加第三方库,还能和Yeoman配合使用(经过 generator-mean by James Cryer)。express
在进一步阅读前,先假定咱们赞成如下观点:(a)Mongo至少很是适合于全Javascript堆栈的原型设计;(b) 认可即便像Angular般如日中天,终有一天也会被其余的一些JS框架给取代,只要它们能帮助咱们快速方便地将这个架构快速搭建起来。
接下来就要介绍Yeoman 了,它由3个你所熟知的工具构成:
笔者在一年之前,曾和其余一些人建立过一个叫ExpressStack的项目,其想法很简单,就是要提供一些工具可以快速生成构建全JS的Web应用所须要的一切。可是,这个项目夭折了,尽管如此,许多相似的项目却如雨后春笋般涌现出来。
下面对这些项目做些介绍:
注意: 你可能须要装好Yeomam(npm install -g yo)和如下一些生成器(npm install -g <generator-name>)。
这是一个AngularJS的生成器,集成了Express,可选MongoDB。主要功能以下:
可参考: http://tylerhenkel.com/creating-apps-with-angular-and-node-using-yeoman/
另外一个MEAN架构的生成器,集成了grunt-express,功能以下:
可参考:https://github.com/Grievoushead/generator-express-angular
集成了Mongo,Express,Angular,Yeoman,Karma和Protractor(做自动测试)。
和其余的很相似,不过使用的是Mongoose和Stylus,其余的一些功能包括:
该生成器很是全面,添加了许多第三方的库,包括Passport用于用户登陆,Browserify加载js。
看了这么多的生成器,天然要问,我该选择哪个呢?事实上,以上列表是有顺序的,依据的是其与最新版的Yeoman的兼容性以及维护的活跃度。
不得不认可,若是开发堆栈的每一层都能使用JavaScript将会是一件很棒的事情(至少对于原型开发来讲是这样),然而千万要注意,不要为了追求这一目标,而把本身而束缚住了。尽管的确有愈来愈多的大规模应用都在采用相似的架构,如Walmart、LinkedIn,但并不意味着模仿他们就必定能成功。
另外一个须要注意的是,相对于其余的语言(如Ruby,Python或Java),在Node上搭建后端要困可贵多。你可能要本身处理内存泄漏,避免在事件循环中进行耗时运算,还要很是当心异常处理,若是这些处理不当就颇有可能会致使整个应用服务器崩溃,可是这些问题在其余平台上却已经处理得很好了。然而,这并非说,Node不能运用在生产环境下,固然能够,但要格外用心。
实话实说,想要“一揽子”为Web应用提供一个大而全的解决方案将很是困难,MEAN架构也确定有其局限性。在前端与后端的设计模式、原则和风格中有大量的演化,若是你以为PHP或Rails是更明智的选择,那就继续使用下去,不然的话,不妨试试MEAN,至少在当下值得一试。
【原文:http://addyosmani.com/blog/full-stack-javascript-with-mean-and-yeoman/ 】