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
:
# frozen_string_literal: true
module Soundeck
class Application < Hanami::Application
config.cookies = { max_age: 600 }
config.sessions = :cookie, { secret: ENV["SOUNDECK_SESSIONS_SECRET"] }
config.middleware.use Middleware::Elapsed, "1.0"
config.environment(:production) do |c|
c.base_url = ENV["SOUNDECK_BASE_URL"]
c.logger = { level: :info, formatter: :json }
end
end
end
配置 Configuration
我们基于 getter 和 setter为应用程序配置引入了一种新语法,而不是我们在 Hanami 1 中使用的 DSL。
之前:
cookies max_age: 600
之后:
config.cookies = { max_age: 600 }
这种新语法有助于简化内部,明确地将读取与设置意图分开。 Hanami::Configuration
现在都是原子/线程安全的。
预设 Defaults
与过去的另一个区别是配置现在附带默认值,而不是在生成的应用程序中使所有内容都显式,让我给你举个例子:
之前,这是每个应用程序配置的显式设置
# apps/web/application.rb
security.x_frame_options = "DENY"
之后,现在将该值作为默认值,因此生成的代码为空:
如果你想要更改默认值,它将会应用全局生效:
# config/application.rb
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
:
# frozen_string_literal: true
Hanami.application.routes do
mount :web, at: "/" do
root to: "home#index"
end
mount :admin, at: "/admin" do
root to: "home#index"
end
end
请注意与过去的不同之处:
- 多个应用程序不再有多个文件和多个路由实例
- 全应用单路由 🙌
- 安装应用程序不再代理到
Hanami.configure
,会让config/environment.rb
变得混乱 - 应用特定类的已经去掉(例如
Web::Application
),符号更好 - 使用
mount
注册的应用程序在内部容器中激活
操作 Actions
已重新设计操作以改善其性能。在 Hanami 1 中,对于每个传入的 HTTP 请求,我们必须创建一个新的动作实例,因为分配实例变量(例如 @book)并将它们用作暴露,我们必须使用新动作重新创建一个空白状态。从长远来看,这给 Ruby 垃圾收集器带来了压力。
为了解决这个问题,我们使操作不可变。为了将数据从操作传递到视图,您可以使用:
response[:book] = Book.new
这也消除了通过 exposeDSL 声明数据的需要,现在已经消失了。
从过去的另一个重要变化是,Hanami::Action
现在是一个继承的超类。在您的应用程序中,您将为每个子应用程序提供基本操作类(例如 apps/web/action.rb
):
# frozen_string_literal: true
module Web
class Action < Hanami::Action
end
end
此基类旨在与其子类共享代码,例如,动作 apps/web/actions/books/show.rb
将如下所示:
# frozen_string_literal: true
module Web
module Actions
module Books
class Show < Web::Action
def handle(req, res)
res[:book] = BookRepository.new.find(req.params[:id])
end
end
end
end
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 ⌨️
$ gem install hanami --pre
如果你想看一个有效的例子,请查看 https://github.com/jodosha/soundeck 。
下一步是什么?⏰
我们将于2019年4月发布新的alpha版本。
快乐编码!🌸
原文:http://hanamirb.org/blog/2019/01/30/announcing-hanami-200alpha1.html