🔰

Dart Frogを触ってみた

2023/08/06に公開

本記事の概要

主にモバイルアプリ開発などに利用されるFlutterですが、今回はその開発言語であるDartでバックエンド開発をおこなっていきます。
 DartのバックエンドフレームワークではServerpodがのバージョン1.0が2023年2月にリリースされていますが、今回、2023年8月にバージョン1.0がリリースされたDart Frogを利用してみようと思います。

まずはインストール

まずは公式ホームページを参考にインストールをしていきます。

https://dartfrog.vgv.dev/

インストールは簡単で以下のコマンドを実行するだけ。

dart pub global activate dart_frog_cli

インストールできたらPATHを追加していきましょう。
Macを利用しているのでターミナルから以下で追加します。

echo 'export PATH=$PATH:$HOME/.pub-cache/bin' >> ~/.zshrc

インストールできていれば、以下のコマンドでバージョンの確認ができるようになります。

dart_frog --version

dart_frogのバージョンを更新したい場合は dart_frog updateで実行できます。
ただし、Dartのバージョンが古いとバージョン1.0が利用できないので、その場合は flutter upgrade でdartのバージョンをあげましょう。

dart_frog update

Completion files installed. To enable completion, run the following command in your shell:
source /Users/{username}/.zshrc

✓ Checked for updates (0.4s)
✗ Updating to 1.0.0 (0.7s)
Error updating Dart Frog CLI: The current Dart SDK version is 2.19.1.

Because pub global activate depends on dart_frog_cli >=0.3.7 which requires SDK version >=3.0.0 <4.0.0, version solving failed.

これでインストールは完了です。

プロジェクトを作成、まずは実行

さて、dart_frogがインストールできたので、プロジェクトを作成していきます。
ワークスペースで、以下のコマンドを実行します。
成功していれば、指定した名前のディレクトリが作成されいるはずなので、移動します。

dart_frog create dart_frog_sample_project
cd dart_frog_sample_project

プロジェクトの中身は以下のようなディレクトリツリーになっています。

.
├── README.md
├── analysis_options.yaml
├── pubspec.lock
├── pubspec.yaml
├── routes
│   └── index.dart
└── test
    └── routes
        └── index_test.dart

この階層でdart_frog devで実行します。
成功したら以下のようにメッセージが表示されURLが記載されているので、ブラウザからhttp://localhost:8080 にアクセスしてみます。

 dart_frog dev
✓ Running on http://localhost:8080 (0.1s)
The Dart VM service is listening on http://127.0.0.1:8181/h8-jd1VSJk8=/
The Dart DevTools debugger and profiler is available at: http://127.0.0.1:8181/h8-jd1VSJk8=/devtools?uri=ws://127.0.0.1:8181/h8-jd1VSJk8=/ws
[hotreload] Hot reload is enabled.

VMやDevTool用のURLも一緒に表示されており、ブラウザからCPUやメモリ、ログの確認ができるようになっています。この辺りはまた別の機会があれば。

ホットリロードの確認

ホットリロードが効くか実行中のまま、以下のroutes/index.dartを書き換えてみます。

routes/index.dart
import 'package:dart_frog/dart_frog.dart';

Response onRequest(RequestContext context) {
-  return Response(body: 'Welcome to Dart Frog!'); 
+  return Response(body: 'Hello Dart Frog!');
}

保存したら、実行中のターミナルで、ホットリロードした旨のメッセージが表示されます。

[hotreload] 21:50:59 - Application reloaded.

ブラウザで再表示してみると、ちゃんと書き換えた内容が表示されていることがわかりますね。

ルーティング情報について

dart_frogはNext.js同様にファイルベースルーティングを利用しているので、新たに機能を追加したい場合は、routes配下にディレクトリやファイルを作成すれば、それがそのままルーティング情報に追加されていきます。

 .
 ├── README.md
 ├── analysis_options.yaml
 ├── pubspec.lock
 ├── pubspec.yaml
 ├── routes
+│   ├── api
+│   │   └── sample.dart
 │   └── index.dart
 └── test
     └── routes
         └── index_test.dart
routes/api/sample.dart
import 'package:dart_frog/dart_frog.dart';

Response onRequest(RequestContext context) {
  return Response(body: 'this is api/sample');
}

※ちなみにroutes配下のdartファイルにはonRequestメソッドが存在しないとエラーになります。

[hotreload] 21:50:59 - Application reloaded.
[hotreload] 22:09:31 - Hot-reloading code failed:
 .dart_frog/server.dart:35:46: Error: Method not found: 'onRequest'.
    ..all('/sample', (context) => api_sample.onRequest(context,));
                                             ^^^^^^^^^

追加したファイルパスをURLに置き換えてブラウザからhttp://localhost:8080/api/sampleにアクセスしてみます。

今回はVS Codeからフォルダとファイルを作成しましたが、コマンドラインからdart_frog new route api/sampleと実行しても作成可能です。これ何気に便利!!

最後に

Dartでバックエンド開発ができるDart Frogを簡単に触ってみました。
他にもDIやWebsocketも利用できるようなので、また近々触ってみようと思います。

Discussion