この投稿はDart Advent Calendar 2014の8日目の記事です。

Dartの大きな強みの一つは、サーバーからClient(Web browser)まで一貫してDart platformに乗って開発できることです。 Web開発ではnode.jsを除き、Server SideとClient Side(もちろんJavaScript)では言語もそのエコシステム、コミュニティも異なります。一方、開発者はServer Sideに加えClient SideのJavaScriptも開発、運用をしている事が多いのが実態でしょう。そこでClient SideもServer SideもDartで統一して開発運用すれば、学習、開発、保守運用コストを大きく軽減することが期待できます。また、いわゆるIsomophic Architectureが発展する可能性もあり、一部のFrameworkにおいてそれに向けた取り組みが始まっているようです。

JavaScriptで同様の利点を持つPlatformとしてはnode.jsという素晴らしい先行者が挙げられます。誤解を恐れずに言うとServer SideDartはよく整備された標準ライブラリ+型付きのnode.jsという雰囲気です。node.jsと比較するとServer SideDartは未だ立ち上がったばかりのはるかに小さいエコシステムです。しかしその分node.jsと比較して全体像が把握しやすく、またDart teamが提供しているコアなライブラリと豊富なドキュメントがあるため、(特にnode.jsを知っている人は)学習に苦労しないでしょう。なお公式サイトのドキュメントは全て英語ですが平易な英語で書かれているので、読んで理解するのは難しくないかと思います。(* 日本語への翻訳の需要はあるのだろうか?)

ここでははじめの一歩として、Dart teamが提供しているhttp_serverライブラリを使用して単純なhttp serverを構築します。せっかくなので同project内でClientもDartで書いてGET/POST requestを投げてみます。Client Sideはstagehandでpolymerappをgenerateしています。 Dartのプロジェクトジェネレータ Stagehand

今回のcode

https://github.com/ntaoo/hello_client_server

今回のserver side code

serverの起動

$ dart bin/server.dart

clinetの起動(pub serve)

$ pub serve

http server

Dartではasync operationにはFuture(JSでいうPromise)とStreamが標準的に使用されます。Callback関数の代わりにFuture apiによりHttpServer.bind().then()とchainします。また、routerライブラリによりpathを正規表現で表現して、serve()により生成されるstreamのeventをlisten()でsubscribeし、対応する処理に振り分けています。

get requestをhandleする

とくに問題なく読めるのではないでしょうか。(手抜き)

post requestをhandleする

HttpBodyHandlerでHttpRequestをparseし、HttpBodyを取り出しています。dart:convertを使用してでJSONをdecode, encodeしています。

logging

logging libraryはいくつかありますが、もっとも無難な選択としてはlogging pubを使います。

zone

Dartはsingle threadのevent loopモデルで動作します。Server processでerrorが発生しexceptionがtop levelに到達するとprocessが死んでserverが止まってしまいます。これを防ぎ適切にerror handlingするためにzoneを導入しています(runZoned()の部分)。node.jsではDomainに相当すると思われます。

Frameworks

また、少し前からApp Engine Managed VM上で動くDartの各種APIの開発が進んでいます。1,2年後の採用をにらみ今から学習を開始すると幸せになれるかもしれません。

当たり前ですが、DartはServer SideではJSにcompileを行う必要はなく、DartVM上でそのまま実行できます。私は最近Dart serverを業務で開発運用する機会がありましたが、Dartのシンプルな仕様とSDKとOptional Typeの恩恵を受け、非常にスムーズに開発できました。 DartをServerから始めて見るのもありかと思います。