Node.js
Laravel
Adonis
adonis.js

Laravelライクに書けるnode.jsのフレームワーク 「Adonis」の紹介

More than 3 years have passed since last update.

ネットサーフィンをしていたら、とても興味深いnode.jsのフレームワークを見つけたのでご紹介します。

その名は「Adonis」です。

以前からnode.jsには興味があったのですが、仕事では使用しておらず、

またjs自体に苦手意識があったので、躊躇していました。

そんな時に、こちらの記事を見つけました。


Laravelライクなnode.jsのフレームワーク「adonis.js」

http://co.bsnws.net/article/25


なんと、node.jsがLaravelの記述方式で書けるだと....

普段Laravelを使用して開発を行っているので、衝撃的でした。

そして、実際に触ってみた所、ほとんどlaravelと同じ感覚で書け、簡単にプログラムが出来たので、感動しました!

ということで、Laravelと比較しながら紹介してみます。

ただ、node.jsやjsについては素人なので、少しおかしな事を書いてる所があるかもしれません。

ご指摘あればコメント下さい。

今回使用するAdonisのバージョンは、最新版の2.0.9になります。


インストール

npmからインストールします。

npm install -g adonis-cli

インストール完了後、adonisコマンドか使えるようになるので

adonis new プロジェクト名

これでプロジェクトが出来上がります。

とても簡単です。


起動してブラウザから確認

プロジェクトルートに入った後、npm startをすると起動します。

初期設定ならlocalhost:3333でアクセスできます。

そして、最初の画面はこんな感じです。

無題11.png

「Everything has beauty, but not everyone sees it.」

この文章を検索すると、結構ヒットするので、割と有名な言葉なのかな。

google翻訳によると、

「全てのものは美しさを持っている。しかし誰もが気づくわけではない。」

だそうです。


.envが使える

最初に設定されている値はこんな感じです。

そして、dotenvって調べてみると色々な言語で使えるんですね。知らなかったです :sweat_smile:


.env

APP_PORT=3333

APP_HOST=0.0.0.0
SESSION_DRIVER=cookie
NODE_ENV=development
CACHE_VIEWS=true
APP_KEY=個別に設定されるキー



ディレクトリ構成

公式サイトにも載っているのですが、こちらにも引用して載せておきます。

├── app/

│ ├── Commands/
│ ├── Http/
│ │ ├── Controllers/
│ │ ├── Middleware/
│ │ ├── routes.js
│ │ ├── kernel.js
│ ├── Model/
│ ├── Services/
├── bootstrap/
│ ├── app.js
│ ├── http.js
│ ├── kernel.js
│ ├── start.js
├── config/
├── migrations/
├── public/
├── providers/
├── resources/
│ ├── views
├── storage/
│── .env
│── ace
│── server.js
│── package.json

Laravel5と同じような構成です。


ルーティング

app/Http/routes.jsに記述していきます。

phpがjsになっただけです。


app/Http/routes.js

'use strict'

/*
|--------------------------------------------------------------------------
| Routes
|--------------------------------------------------------------------------
|
| Routes helps you in defining http endpoints/urls which will be used
| by outside world to interact with your application. Adonis has a
| lean and rich router to support various options out of the box.
|
*/

const Route = use('Route')

Route.get('/', 'HomeController.index')


中身もほぼ同じで驚きました :flushed:

そして、ミドルウェアやwhere絞り、名前付きルート等々、Laravelで出来ることは一通り出来ます。


ミドルウェア

こちらもLaravelと同じようにグローバルと、名前付ミドルウェアの登録が出来ます。

新規で作成したミドルウェアはapp/Http/kernel.jsに登録します。

また、標準でグローバルに、csrfのミドルウェアが登録されている所も一緒です。

ただ少し違うのは、Shieldという名前になっている所です。


app/Http/kernel.js

'use strict'

const Middleware = use('Middleware')

/*
|--------------------------------------------------------------------------
| Global Middleware
|--------------------------------------------------------------------------
|
| Global middleware are executed on every request and must be defined
| inside below array.
|
*/

const globalMiddleware = [
'Adonis/Middleware/Cors',
'Adonis/Middleware/BodyParser',
'Adonis/Middleware/Shield',
'Adonis/Middleware/Flash'
]

//省略



コントローラー

app/Http/Controllers以下に作成していきます。

インストール直後は、サンプルとしてHomeController.jsが作成されています。


app/Http/HomeController.js

'use strict'

class HomeController{
* index (request, response){
const index = yield response.view('index')
response.send(index)
}
}


yield response.view('index')でテンプレートを指定しています。

そして、一つ注意点ですが、ドット記法が使えないことです。

ディレクトリはスラッシュ区切りで指定します。


aceコマンド

Laravelのartisanコマンドと同等のものです。

ただ、マイグレーションとmake関連が少しあるだけで数は少ないです。


コマンド一覧

Options

--help Get help for all ace commands
--version Get framework version

Available Commands
greet
greet:user I will greet a user

migration
migration:make Create a new migration file
migration:run Run latest migrations
migration:rollback Rollback migrations executed in last batch

make
make:controller Generate a new controller file by passing it's name
make:model Generate a new Database Model
make:command Generate a new ace command file by passing it's name
make:middleware Generate a new HTTP middleware


もちろん、独自のコマンドを作って登録することもできます。

greet:userというのはコマンドのサンプルなので、これが参考になるかと思います。


Lucid ORM

Eloquent ORMと同等のもので、基本的に記述方法はEloquentと一緒です。

モデルも、aceコマンドで作ることができます。

モデルに関連するテーブルの仕様はLaravel準拠となっており

・名前は複数形

・カラムに、id,created_at,updated_atが必要

となっています。

また、ソフトデリートにも対応しています。

仕様通りにテーブルを作っていれば、aceコマンドでモデルを作成するだけで動くようになります。

使い方は簡単でuseするだけです。

以下、使用例(公式ドキュメントから引用)


app/Http/Controllers/UserController.js

const User = use('App/Model/User')

class UserController{

*index (request, response) {
const users = yield User.all()
response.json(users)
}

}



マイグレーション

マイグレーション、クエリービルダーはknex.jsというライブラリを使用しているようです。

./ace migration:make ファイル名 

でmigrationsにファイルが作成されます。

こちらもLaravelと同じ記述で書くことができます。


migrations/1455001855782_Users.js

'use strict'

const Schema = use('Schema')

class NewSchema extends Schema {

up () {
this.create('users', function (table) {
table.increments('id')
table.text('name')
table.timestamps()
table.timestamp('deleted_at')
})
}

down () {
this.drop('users')
}

}

module.exports = NewSchema


後は、

./ace migration:run

で実行

./ace migration:rollback

で元に戻せます。

残念ながら、seed機能はまだ未実装です。


Collection

lodashというライブラリのラッパーの様です。

lodashのAPI仕様を見た所、laravelのCollectionよりも、色々なことができそうな感じでした。

Lucidで取得した値もLaravel同様、Collectionで返ってきます。


テンプレートエンジン

こちらは、Laravelと違います。

node.js初心者の為ソースが全然追えず、twigそのものなのか、twigベースなのか判断出来なかったのですが、記述方式はtwigです。(公式ドキュメントにはtwigの表記は無かった)

テンプレート用のヘルパーもあるようで

例えばcsrfトークンなら以下のように記述できます。

{{ csrfToken }}


スタックトレース

紹介するほどの物では無いと思いますが、Laravel4では標準で入っていたのと同じ、filp/whoopsを使用しています。


公式ドキュメント


http://adonisjs.com/docs/2.0/installation


こちらです。初めてドキュメントを見た時に、思わず吹き出してしまいました。なんと、Laravelの公式ドキュメントと色以外は、スタイルが同じです :grin:

でも、おかげでとても見やすく、分かりやすい内容となっています。

また、Laravelの概念を取り入れている旨も明記されています。


その他、触ってみた感想とか

正直、node.js版Laravelと言っても良いぐらい、Laravelライクに記述できます。Laravel5を触っている方なら私の様に、node.jsを触ったことが無い方でも、すぐに馴染めると思います。

また、普段PHPしか触らない人にとっては、classが扱えるのと、ヘルパーによる疑似use?が使えるという点も大きいのではないでしょうか。

そして、adonisはおそらく2015年頃に出来たばかりの、新しいフレームワークです。

その為まだまだ、海外でも認知度が低く、未実装の機能も多いので、商用レベルでの導入は難しいかもしれません。しかし、開発は盛んの様で、その状況はTrelloやgithubから確認できます。

ちなみに、日本ではまだ全然認知されていないようで...

日本語の記事は、最初に挙げた記事しか見つかりませんでした。

AdonisもLaravelと同じように少しづつ、認知度が広がればいいなと思います。

以上、今後注目のフレームワークでした :laughing:

少ししたら、個別に機能紹介をしてみたいと思います。