昨天一个名为Lotus的Ruby Web框架,登上了Hacker News头条区。
框架的作者是Luca Guidi,一位住在意大利罗马的资深全栈工程师,目前效力于Litmus公司,此前他作为核心成员的开源项目Redis Store很受欢迎,关注数超过了1000。
Guidi在介绍文章中说,因为对Web框架的现状失望(此前他曾经多次批评Rails),他秘密地利用业余时间开发自己的框架,从零开始,不做任何假设,经过多次写了又推翻、丢弃的过程,不断减去非必要的东西,最终得到了一个“优雅与性能兼得、方便与设计坚实俱备”的Web框架。各种权衡取舍都考虑了真实开发场景中的痛点。
到了2014年年初,Guidi公开宣布了Lotus项目,同时发布Lotus::Utils和Lotus::Router两个组件,并承诺以后每月23日放出一个组件。但社区似乎反应并不强烈:Talk is cheap, show me the code。
在那篇发布文章中,Guidi这样描述Lotus的设计理念:
简洁,少用DSL,少用约定,多用对象,不折腾(原文是monkey patch)核心语言和标准库,分离MVC层的各个关注点。建议而不是强迫使用模式,开发者可以自由设计自己的架构,选择继承结构。简化测试,鼓励类之间责任单一、定义明确。
6个月后,框架本身终于出来了。轻量、快速、方便测试,要让面向对象编程再次回到Web开发中。每个库代码都小于500行,可以随意组合。Lotus支持智能复用机制,一个Ruby进程里可以跑多个框架副本。架构上支持微服务。
目前已有的组件包括:
- Lotus::Router HTTP路由器,支持Rack协议
- Lotus::Controller 控制层,支持Rack协议
- Lotus::View 视图层
- Lotus::Model 模型层,依赖于Sequel
- Lotus::Utils 核心扩展和类实用工具
项目到现在GitHub上关注数已经达到680个。
Hacker News上,Rails项目的contributor Ernie Miller(emiller829)评价:
这是一个很有前途的开始。一段时间以来我也觉得,对于感觉Rails和Ruby两种方式不太相得的同学,在Rails之外需要一些比较好的替代品。不过从例子来看,DSL的味道好像也很重啊……只要足够简单,这将有机会成为Ruby生态系统中的重要部分。
另一些同学将Lotus与Sinatra、Rameze和Lean做了比较和讨论。也有人说,这让人想起了与Rails合并之前的Merb。还有人提到Padrino(基于Sinatra的一个框架)。
一个很热烈的讨论是jaredcwhite挑起来的,他说:为啥不直接用JavaScript统一前后端,共享一套面向对象代码呢?反正有Opal嘛(Ruby-JavaScript源码转换器)。事实上,已经有基于Opal的框架了,叫Vienna。
有一个讨论聚合了几个Lotus案例程序,可以参考:
Ruby China社区里,billy这样评论:
暂时发现几个特点:
- 颠覆Rails命名系统,直接使用Ruby namespace来管理。我觉得这个好,又简单又灵活。
- model设计意见性很强,强制隐藏所有通用query比如where, limit, oder等等。强迫开发者自己写有意义的API。这个好。
不明白的地方:没有migration,只有create table。那要更改数据库结构怎么办?
2005年12月,Rails横空出世,通过引入约定大于配置等特性,改变了Web开发的面貌,各语言后来都陆续山寨了各自的Rails。今天,它也变得越来越重,问题不少。比如,Rails的控制层很难测试,ActiveRecord模型过于臃肿等等。
Lotus代表正确的方向吗?它有望成为新一代框架的代表吗?还是像某些人评论的,一切已经太晚,框架时代已经过去,微服务和SOA才是未来?
欢迎评论。