Amber - CrystalでRailsとPhoenixをクリスタル化
これはRobert Carpenterによるゲスト投稿で、Crystal向けのRails/PhoenixライクなWebフレームワークであるAmberを紹介します。ご自身の経験を共有したい場合は、ぜひご連絡ください。
Amberフレームワークは、私たちのお気に入りの言語であるCrystalで書かれた、若く成長しているWebフレームワークです。Railsとの多くの類似点を共有していますが、Crystal自身と同様に、Railsとの互換性は設計目標ではありません。
私が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のタグラインを借りれば:生産性。パフォーマンス。幸福。