2.0 系列的第一个预览版本,应用简化,新路由器,重写 actions,新代码重载策略。

你好呀迷人的社区!❤️🌸
今天我们很高兴宣布 v2.0.0.alpha1 发布🙌。

全新的开始

今天的发布是 Hanami 2 系列的开始,最终的 2.0 版本将在今年晚些时候发布。
我们决定全新开发这个框架,因为技术债务框架内部代码需要清理,要达成目标需要付出很多努力。1.3 版本已包含 4k 行代码,我们从头开始会很有意义。
这意味着这个版本和 1.3 版本功能方面并不具有可比性,它更像是 Hanami 2 的预览版本。

Application

DRY-up settings
在 Hanami 1 看来重大变化之一是删除所有 Application(web,admin) 改为微配置(micro-configure) 。

在过去我们有:

  • config/enviroment.rb
  • apps/{web,admin,...}/application.rb

配置从文件加载,这是每个应用的默认响应格式,比如 sessions, cookies, base URL,仅举几例。
这个概念是将所有设置统一 config/application.rb,然后它们可以在整个 App 中使用,也是最好的 DRY。

这是一个例子 config/application.rb

  1. # frozen_string_literal: true
  2. module Soundeck
  3. class Application < Hanami::Application
  4. config.cookies = { max_age: 600 }
  5. config.sessions = :cookie, { secret: ENV["SOUNDECK_SESSIONS_SECRET"] }
  6. config.middleware.use Middleware::Elapsed, "1.0"
  7. config.environment(:production) do |c|
  8. c.base_url = ENV["SOUNDECK_BASE_URL"]
  9. c.logger = { level: :info, formatter: :json }
  10. end
  11. end
  12. end

配置 Configuration

我们基于 getter 和 setter为应用程序配置引入了一种新语法,而不是我们在 Hanami 1 中使用的 DSL。

之前:

  1. cookies max_age: 600

之后:

  1. config.cookies = { max_age: 600 }

这种新语法有助于简化内部,明确地将读取与设置意图分开。 Hanami::Configuration 现在都是原子/线程安全的。

预设 Defaults

与过去的另一个区别是配置现在附带默认值,而不是在生成的应用程序中使所有内容都显式,让我给你举个例子:
之前,这是每个应用程序配置的显式设置

  1. # apps/web/application.rb
  2. security.x_frame_options = "DENY"

之后,现在将该值作为默认值,因此生成的代码为空:

如果你想要更改默认值,它将会应用全局生效:

  1. # config/application.rb
  2. config.security.x_frame_options = "sameorigin"

路由 Router

hanami-router 早在一年前重写,它的性能更高(简单的 Rack 基准测试为 +10k req/s),它现在基于 mustermann 路径匹配器,它也为 Sinatra 路由提供支持。
在 Hanami 1 中,我们有多个地方来配置应用路由:apps/{web,admin,...}/config/routes.rb ,现在这些文件已经转移项目的根目录中的额 config/routes.rb 文件。

这种变化对简化性能都有影响。

多亏了 hanami-router2,我们可以在同一个地方为所有应用定义路由 config/routes.rb

  1. # frozen_string_literal: true
  2. Hanami.application.routes do
  3. mount :web, at: "/" do
  4. root to: "home#index"
  5. end
  6. mount :admin, at: "/admin" do
  7. root to: "home#index"
  8. end
  9. end

请注意与过去的不同之处:

  • 多个应用程序不再有多个文件和多个路由实例
  • 全应用单路由 🙌
  • 安装应用程序不再代理到 Hanami.configure,会让 config/environment.rb 变得混乱
  • 应用特定类的已经去掉(例如 Web::Application),符号更好
  • 使用 mount 注册的应用程序在内部容器中激活

操作 Actions

已重新设计操作以改善其性能。在 Hanami 1 中,对于每个传入的 HTTP 请求,我们必须创建一个新的动作实例,因为分配实例变量(例如 @book)并将它们用作暴露,我们必须使用新动作重新创建一个空白状态。从长远来看,这给 Ruby 垃圾收集器带来了压力。
为了解决这个问题,我们使操作不可变。为了将数据从操作传递到视图,您可以使用:

  1. response[:book] = Book.new

这也消除了通过 exposeDSL 声明数据的需要,现在已经消失了。
从过去的另一个重要变化是,Hanami::Action 现在是一个继承的超类。在您的应用程序中,您将为每个子应用程序提供基本操作类(例如 apps/web/action.rb ):

  1. # frozen_string_literal: true
  2. module Web
  3. class Action < Hanami::Action
  4. end
  5. end

此基类旨在与其子类共享代码,例如,动作 apps/web/actions/books/show.rb 将如下所示:

  1. # frozen_string_literal: true
  2. module Web
  3. module Actions
  4. module Books
  5. class Show < Web::Action
  6. def handle(req, res)
  7. res[:book] = BookRepository.new.find(req.params[:id])
  8. end
  9. end
  10. end
  11. end
  12. end

代码重载 Code reloading

我们从 hanami 核心提取代码重新加载到 hanami-reloader
新实现基于 guard-rack:此 gem 监视文件系统,并在检测到文件更改时重新启动服务器。这使代码重新加载框架的外部特性,不再内置于其核心。之前基于内置的实现 shotgun 导致兼容性问题(JRuby,Windows,better_errorsgem),它是 bug 的根源。
该功能仍然集成到 hanami server(可以用 --no-code-reloading 跳过)。有趣的是,如果 hanami-reloader 没有安装,hanami server 将不会使用代码重载,因为它不是由 Hanami 实现的。这在生产中非常有用,您不需要重新加载代码。

命令行 CLI commands

因为这是2.0的第一个预览版,所以目前只有两个CLI命令可用:

  • hanami version
  • hanami server

一旦我们实现相关功能,我们将重新添加 1.3 版本中的所有常用 CLI 命令。

发布 Released Gems 💎

  • hanami-2.0.0.alpha1
  • hanami-cli-1.0.0.alpha1
  • hamami-controller-2.0.0.alpha1
  • hanami-router-2.0.0.alpha1
  • hanami-utils-2.0.0.alpha1
  • hanami-reloader-1.0.0.alpha1

如何尝试 How to try it ⌨️

  1. $ gem install hanami --pre

如果你想看一个有效的例子,请查看 https://github.com/jodosha/soundeck

下一步是什么?⏰

我们将于2019年4月发布新的alpha版本。
快乐编码!🌸

原文:http://hanamirb.org/blog/2019/01/30/announcing-hanami-200alpha1.html