Ruby on Rails到Crystal上的Lucky:燃烧速度快,错误少,乐趣多。

Ruby on Rails到Crystal上的Lucky:燃烧速度快,错误少,乐趣多。

我爱Ruby,也爱Rails,但我发现自己在寻找更多东西。 快速的东西,所以我不需要添加缓存。 一种类型安全的东西,因此客户看到的错误更少。 使用起来很有趣,所以我实际上很喜欢构建应用程序。

Elixir会痒吗? 这是一个好的开始。 编写漂亮的代码使它变得很有趣,但是我仍然遇到生产中的错误,这些错误可能是更好的类型系统所捕获的。

有榆树 很美丽。 好玩 但仅在前端可用。

我曾与Go和Rust一起玩过,但我觉得类型系统和语法对我来说太不友好了,无法使用它们。

最后,我尝试了水晶

刚开始,我对Crystal很不满意。 它看起来几乎与Ruby相同,那么为什么要尝试呢?

好吧,最终我确实尝试了,但是我坠入爱河了。

尽管Crystal看起来与Ruby类似,但Crystal是另一种野兽 它足够熟悉,可以快速上手,但是又足够新,以有趣的方式挑战您。 我对Crystal的某些爱好:

  1. 漂亮的语法 -毫不逊色于Ruby。 有些人可能不喜欢它,但我喜欢它。
  2. 在编译时捕获错误 -编写此代码让我感到焦虑: Undefined method on Nil 我已经看过太多次了。 Crystal有助于在编译时捕获这些错误,因此它们永远不会消失。
  3. 使用宏进行元编程-Crystal使用宏为您生成代码。 再见样板。
  4. 令人难以置信的快速 -在许多基准测试中,Crystal击败了Go,Elixir和原始的C代码。 很快

介绍Lucky (为Crystal编写的Web框架)

目标是:防止错误,忽略大多数性能问题,并花费更多时间在代码上,而不是调试和编写测试。

总之, 使编写出色的Web应用程序变得快速,有趣和容易

为什么要尝试呢?

  1. 易于获取 -直观的API和有用的编译时错误有助于简化操作。 如果遇到困难, 指南和我们有用的聊天室将为您提供帮助。
  2. 包括电池-不再有100万个图书馆。 幸运包括大多数应用程序需要的内容。 电子邮件,一个 M代表与数据库,模板的WebPack设置你的,自动化的浏览器测试,认证和易于部署的工作。
  3. 快如闪电 -不必再担心性能以及所需的服务器数量。 大多数带有大量HTML和多个数据库请求的响应在价格适中的服务器上每秒处理数千个请求。
  4. 为您找到错误 -花费更少的时间来担心测试范围和偷偷摸摸的类型错误。 让Crystal编译器为您提供帮助。
  5. 灵活 -生成服务器呈现的HTML,使用SPA的内置webpack配置或通过使用--api初始化项目来构建JSON API
  6. 不再有N + 1问题 -如果您意外忘记预加载关联,Lucky可以通过在开发过程中进行加注来防止缓慢的N + 1查询。

子弹点很无聊,看起来像什么?

处理HTTP请求

  • 呼叫route自动为”/users”设置路由。
  • 如果需要,您可以设置自定义路由,例如为非REST路由get “sign_in”
  • 如果您忘记传递页面需要的内容,Lucky将在编译时通知您。

建立模型

  • 设置您要使用的列及其类型
  • 您可以添加? 列可以为nil时的类型。 然后,Crystal将帮助您记住不要在其上调用不起作用的方法。
  • Lucky将为必填字段( nameemail因为它们未标记为nilable)设置状态验证。

查询数据库

  • 定义模型时,将自动生成User::BaseQuery 从其继承以定制查询。
  • 使用实例方法设置命名范围。
  • Lucky为所有列设置方法,以便如果您错列名,它将在编译时告诉您
  • 在“字符串”列上使用lower方法,以确保Postgres对所有小写字母进行排序。 Lucky具有许多强大的抽象功能,可用于创建复杂的查询并键入特定的方法(例如lower )。

防止可怕的N + 1查询

  • 如果您忘记预加载关联,Lucky将在开发和测试环境中引发运行时错误。 不再因N + 1查询而意外降低请求速度。
  • 在生产中,查询不会引发。 这样,如果您不小心进行了更改并且没有测试,它不会为您的用户抛出错误。 相反,您可以稍后解决性能问题。
  • 有时,您只想加载没有预加载舞蹈的关联,并且对性能略有影响就可以了。 ! 加载关联而不会触发运行时错误。

渲染HTML

  • needs users : UserQuery告诉编译器必须将其传递给UserQuery类型的users
  • 如果您忘记传递页面需要的内容,它将在编译时通知您。 更少的错误和更快的调试。
  • 使用Crystal方法编写标签。 标签将自动关闭并删除空格。
  • 由于页面由常规类和方法组成,因此可以轻松提取命名方法。 这使您的HTML页面非常易于阅读
  • 轻松链接到其他页面。 只需使用操作名称: Users::New 通过Users::Show.with(user.id)传递参数。 无需再想起路径助手,以及助手是否是多元的
  • 如果您忘记将参数传递给路线,Lucky会在编译时通知您。
  • 由于我们定义了column age : Int32? 作为nilable,如果您只是输入了text user.age ,那么Lucky将无法编译页面,因为它不允许打印nil 因此,我们添加了一个后备广告。 无需再意外地用HTML打印空文本!

开始使用Lucky

这是一些入门方法

忧虑

总有一个问题,Crystal和Lucky也是如此。

Lucky和Crystal都不是1.0,这意味着在升级某些新版本时,您必须进行更改。 与Ruby和其他更成熟的语言相比,库和教程也更少。

对于某些人来说,这是一个有趣的机会,可以进入底层并帮助塑造社区,但这并不适合所有人。

如果您有兴趣, 但还没有做好跳跃的准备请在Twitter上关注@luckyframework, GitHub上 给我们加星

From: https://hackernoon.com/ruby-on-rails-to-lucky-on-crystal-blazing-fast-fewer-bugs-and-even-more-fun-104010913fec