Amber - 将 Rails 和 Phoenix 融入 Crystal
这篇 Robert Carpenter 的客座文章将向您介绍 Amber,一个为 Crystal 语言打造的类似 Rails/Phoenix 的 Web 框架。如果您想分享您自己的经验,请不要忘记 联系我们。
Amber 框架 是一款年轻且不断发展的 Web 框架,由我们最喜爱的语言 Crystal 编写。它与 Rails 具有很多相似之处,但与 Crystal 本身一样,与 Rails 的兼容性并非其设计目标。
以下是一些我 <3 Amber 的原因
- 熟悉的框架设计
- 编译时检查,可以让你保持理智,甚至拯救你的灵魂
- 开放且友好的框架开发团队
- 原始速度
熟悉的框架设计
Amber 项目遵循与 Rails 和其他以 MVC 为中心的 Web 框架类似的设计。它借鉴了成功的设计和概念,并在此基础上进行构建,以提高开发效率或简化操作。
Rails 老手会立即认出这些文件和文件夹
.. (up a dir)
</repositories/offline_pink/
▸ db/migrations/
▾ src/
▾ controllers/
application_controller.cr
user_controller.cr
▸ mailers/
▾ models/
user.cr
▾ views/
▾ user/
new.slang
show.slang
模型、视图、控制器和迁移都位于您预期的位置。您会感到宾至如归。环境配置文件遵循熟悉的风格,开箱即用的工作资产管道可用,如果您需要的话(感谢 webpack)。
编译时检查
由于 Crystal 的存在,Amber 项目的大部分内容在编译时进行评估。您将再也不会收到来自生产环境的电子邮件,抱怨诸如 Missing Template
、controller#action missing
或 Undefined method .downcase for nil:NilClass
这样平凡的问题。
Amber 甚至解析并编译模板和布局文件,这不仅验证了代码是否安全地调用方法和获取器,还节省了请求期间的大量时间。
当对变量的某个方法调用对于该变量的所有可能类型都不有效时,Crystal 会出色地提出警告。Amber 利用这种能力,尽可能确保应用程序在运行时不会崩溃。
观察在使用此损坏的模板编译 Amber 应用程序时会发生什么
- if domain.nam.blank?
p No domain name
编译器会发出警告,通知您问题,甚至建议您进行更正
in macro 'macro_4598546880' expanded macro: embed:1, line 1:
> 1. if domain.nam.blank?
2. __kilt_io__ << "
3. "
4. __kilt_io__ << "<p"
5. __kilt_io__ << ">"
6. __kilt_io__ << HTML.escape(("No domain name").to_s).to_s(__kilt_io__)
7. __kilt_io__ << "</p>"
8. end
undefined method 'nam' for Domain (did you mean 'name'?)
当一个意外的拼写错误溜进您的路由文件,或者您不小心忘记提交视图模板时,这些编译时检查可以让您保持理智。
开放且友好的开发团队
Amber 项目是活跃的。对工具、框架、库和文档的开发是持续不断的。然而,我作为 Amber 贡献者却被接纳到其中,因为核心团队乐于审查和合并我的拉取请求,讨论框架的方向和目标,并公开接受来自休闲贡献者以及频繁受益者。这张图片来自 Github Pulse,它展示了该项目本月的活跃程度
原始速度
最后但并非最不重要的是,由于 Crystal 的存在,Amber 速度很快。编译后的 Web 是真实的,并且现在比以往任何时候都更加友好。
查看我一直在开发的一个项目的日志摘录
10:49:15 Request | Started 2018-01-11 10:49:15 -07:00
10:49:15 Request | Status: 200 Method: GET Pipeline: web Format: html
10:49:15 Request | Requested Url: /domain/30
10:49:15 Request | Time Elapsed: 17.52ms
这个特定的请求以 Amber 的标准来说很慢,但它涵盖了所有要点
与 Rails 5 应用程序中具有类似数据库和呈现开销的页面进行比较
processing by BookmarksController#index as HTML
Completed 200 OK in 251ms (Views: 217.9ms | ActiveRecord: 15.9ms)
没错。由于 Crystal 的速度,Amber 可以在大约 Rails 查询数据库所需的时间内完成整个请求。这意味着每台服务器可以处理更多流量,对拒绝服务攻击更具弹性,并且每个页面都更具响应性4。
为了获得真正的速度示例,此摘录来自一个基本的读取路由,例如以下代码
def profile
user = current_user
render "show.slang"
end
01:19:11 Request | Started 2018-01-11 13:19:11 -07:00
01:19:11 Request | Status: 200 Method: GET Pipeline: web Format: html
01:19:11 Request | Requested Url: /my/profile
01:19:11 Request | Time Elapsed: 1.75ms
或者更快,提供静态文件
01:19:11 Request | Started 2018-01-11 13:19:11 -07:00
01:19:11 Request | Status: 200 Method: GET Pipeline: static Format:
01:19:11 Request | Requested Url: /dist/main.bundle.js
01:19:11 Request | Time Elapsed: 329.0µs
令人惊奇的是,由于 Amber 视图已编译,因此当应用程序为此配置时,呈现模板和布局的速度可能明显快于提供静态文件5
01:45:15 Request | Started 2018-01-17 13:45:15 -07:00
01:45:15 Request | Status: 200 Method: GET Pipeline: web Format: html
01:45:15 Request | Requested Url: /
01:45:15 Request | Time Elapsed: 371.0µs
01:45:16 Request | Started 2018-01-17 13:45:15 -07:00
01:45:16 Request | Status: 200 Method: GET Pipeline: static Format: js
01:45:16 Request | Requested Url: /dist/main.bundle.js
01:45:16 Request | Time Elapsed: 80.01ms
无论您的应用程序在做什么,Amber 都能以更快的速度完成。
总结
如今,大量软件都是为 Web 开发的。Ruby 和 Rails 向世界展示了开发不必对开发人员造成痛苦。Crystal 是一种开发简便与速度兼具的语言,而 Amber 则是建立在这一传统之上的框架。开发人员友好与原始速度和强大功能相结合,适用于 Web。或者借用 Amber 的标语:生产力。性能。快乐。