Mojito(モヒート)は、Javascriptで記述されたWebアプリケーション用のフレームワークです。米Yahoo!がオープンソースとして公開しました(2012/4/1)。
Javascriptを使う機会が増えてきた昨今、非常に興味深いフレームワークです。MojitoはMVC構造を採用しており、コードのきり分けを明確にしています。また、1つのソースで複数のデバイスへ対応させるなど、挑戦的な試みも行っています。
今回は、Mojitoを使ってHello worldアプリを作成してみます。
OSはLinux系(ここではMac OS X使用)、Node.jsが入っていることを前提とします。インストールには、npmコアマンド(Node.jsのパッケージ管理ツール)を使います。
$ sudo npm install mojito -g
ちなみに、今回使用したMojitoのバージョンは0.3.26です。バージョンは以下のコマンドで確認できます。
$ mojito version
早速、Hello worldアプリを作成してみましょう。mojitoでのアプリケーション作成は次の手順となります。
① アプリの生成
② 機能単位の生成(mojit)
③ 各種機能の実装
④ デバイス毎の実行
ここではサーバ側で稼働するアプリを作成します。
① アプリの生成
適当なディレクトリを作成・移動し、以下のコマンドを実行します。Mojitoの処理は、このmojitoコマンドで実行します(詳しくは、YahooのドキュメントMojito Command Line)。
$ mojito create app sample_app
これでカレントディレクトリの中にsample_appディレクトリが作成されます。このsample_appディレクトリ内に、mojitoアプリ用のファイルやディレクトリが生成されています。ディレクトリを移動しましょう。
$ cd sample_app
ディレクトリ中を見てみると以下のようになっています。
├── application.json   [アプリ全体の設定]
├── assets             [アプリ共通のリソース]
│   └── favicon.ico
├── index.js           [アプリをサーバ上で起動するスクリプト]
├── mojits             [アプリの各種機能]
├── package.json       [デプロイ時の設定]
├── routes.json        [ルーティング設定]
└── server.js          [Mojitoサーバ生成スクリプト]
この段階では、サーバ側で表示する内容が何もありません。各種設定ファイルは後ほど編集します。次に実行することは、実際に表示する内容を作成することです。
② 各種機能(mojit)の生成
アプリを生成した後は、必要な機能を生成していきます。Mojitoでは、機能単位としてmojitを生成します。名前が紛らわしいのですが、mojit(最後の"o"がありません)であり、mojitoではありません。mojitとは、モジュールのようなものです。公式サイトによると、mojitという単語は、モジュール(module)とウィジェット(widget)を組み合わせて作られたそうです。
実際に作ってみます。以下のコマンドでHelloWorld mojitを生成します。
$ mojito create mojit HelloWorld
mojitはmojitsディレクトリ内に生成されます。実際に、mojitsディレクトリを確認すると次のようになっています。
mojits
└── HelloWorld                [mojitのルートディレクトリ]
    ├── assets                [mojit内のリソース]
    │   └── index.css
    ├── binders
    │   └── index.js
    ├── controller.server.js  [サーバ用のコントローラ]
    ├── definition.json
    ├── models                [モデルディレクトリ]
    │   └── foo.server.js
    ├── tests                 [ユニットテスト用ディレクトリ]
    │   ├── binders
    │   │   └── index.common-tests.js
    │   ├── controller.server-tests.js
    │   └── models
    │       └── foo.server-tests.js
    └── views                 [ビューディレクトリ]
        └── index.mu.html
mojit(ここではHelloWorld)はその内部にMVC構造を持っています。ここからコントローラ、モデル、ビューや各種設定を編集していきます。
③ 各種機能の実装
単純にHello Worldと表示する機能を実装します。mojits/HelloWorld/controller.server.jsを以下のように編集します。実際には、index: function(ac) {...}の部分を変更しただけです(コメント部分は割愛しています)。
mojit/HelloWorld/controller.server.js
YUI.add('HelloWorld', function(Y, NAME) {
    Y.mojito.controllers[NAME] = { 
        init: function(config) {
            this.config = config;
        },  
        index: function(ac) {
            ac.done('Hello world');
        }
    };
}, '0.0.1', {requires: ['mojito', 'HelloWorldModelFoo']}); 
Javascriptファイルの編集はこれだけです。後は、アプリケーションの設定を行います。アプリのルートディレクトリにある、2つの設定ファイル(application.json、route.json)を編集します。まずは、application.jsonに、インスタンス(アプリ内で使用するmojit)を設定します。
application.json
[
    {   
        "settings": [ "master" ],
        "appPort": 8666, 
        "specs": {
            "hello": {
                "type": "HelloWorld"
            }
        }   
    },  
    {   
        "settings": [ "environment:development" ],
        "staticHandling": {
            "forceUpdate": true
        }   
    }   
]
appPortで使用するポート番号を設定できます。また、specsで指定したオブジェクトにインスタンス名("hello")とその内容("HelloWorld" mojitを使用)を記述します。これでHelloWorld mojitを使用する準備が整いました。
次に、URLとインスタンスを紐づけるルーティングの設定を行います。route.jsonを次のように編集します。
route.json
[{
    "settings": [ "master" ],
    "hello-world": {
        "verbs": ["get"],
        "path" : "/",
        "call" : "hello.index"
    }
}]
hello-worldルートを作り、対象メソッドにGET、パスに"/"を指定しています。そして"call"部分で、このルートに紐付けるmojitとメソッドを設定します。ここではhello.indexと記述することで、helloインスタンス(HelloWorld mojit)のindexメソッドを指定しています(localhost:8666/にアクセスされると実行)。
④ デバイス毎の実行
最後に、サーバを起動してブラウザからアクセスしてみます。サーバの起動は、sample_appディレクトリ直下にて次のコマンドを実行します。
$ mojito start
ブラウザから、localhost:8666にアクセスすると、Hello worldと表示されます。もし、何らかのエラーが発生したら、コンソール画面に表示されます(console.logもコンソール画面に表示されます)。
ちなみに、ここまでで作成したコードからHTML5アプリを生成することもできます(Hello worldではあまり意味ないですけど)。
$ mojito build html5app
すると、sample_app内にartifactsディレクトリが生成され、この中のhtml5appディレクトリ内にHTML5アプリが作成されます。内部を少し見ると、以下のようになります。route.jsonの中で、"/"パスに指定した画面がindex.htmlとして生成されています。
├── application.json
├── artifacts
│   └── builds
│       └── html5app
│           ├── cache.manifest
│           ├── index.html
│           ├── index.js
│           └── static
│               ├── HTMLFrameMojit
│               │   └── definition.json
│               ├── HelloWorld
│               │   ├── assets
│               │   │   └── index.css
│               │   ├── binders
│               │   │   └── index.js
│               │   ├── controller.server.js
│               │   ├── definition.json
│               │   ├── models
│               │   │   └── foo.server.js
│               │   └── views
│               │       └── index.mu.html
...
今回は、サーバ側の単純なアプリ作成の紹介でした。実際には、モデルやビューを作成して画面を作ることになり、もっと本格的なアプリを作ることも可能です。また、mojitoからxcodeプロジェクトを作成することもできるようです。