ネットサーフィンをしていたら、とても興味深い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でアクセスできます。
そして、最初の画面はこんな感じです。
「Everything has beauty, but not everyone sees it.」
この文章を検索すると、結構ヒットするので、割と有名な言葉なのかな。
google翻訳によると、
「全てのものは美しさを持っている。しかし誰もが気づくわけではない。」
だそうです。
#.envが使える
最初に設定されている値はこんな感じです。
そして、dotenvって調べてみると色々な言語で使えるんですね。知らなかったです
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になっただけです。
'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')
中身もほぼ同じで驚きました
そして、ミドルウェアやwhere絞り、名前付きルート等々、Laravelで出来ることは一通り出来ます。
#ミドルウェア
こちらもLaravelと同じようにグローバルと、名前付ミドルウェアの登録が出来ます。
新規で作成したミドルウェアはapp/Http/kernel.jsに登録します。
また、標準でグローバルに、csrfのミドルウェアが登録されている所も一緒です。
ただ少し違うのは、Shieldという名前になっている所です。
'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が作成されています。
'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するだけです。
以下、使用例(公式ドキュメントから引用)
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と同じ記述で書くことができます。
'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を使用しています。
#公式ドキュメント
こちらです。初めてドキュメントを見た時に、思わず吹き出してしまいました。なんと、Laravelの公式ドキュメントと色以外は、スタイルが同じです
でも、おかげでとても見やすく、分かりやすい内容となっています。
また、Laravelの概念を取り入れている旨も明記されています。
#その他、触ってみた感想とか
正直、node.js版Laravelと言っても良いぐらい、Laravelライクに記述できます。Laravel5を触っている方なら私の様に、node.jsを触ったことが無い方でも、すぐに馴染めると思います。
また、普段PHPしか触らない人にとっては、classが扱えるのと、ヘルパーによる疑似use?が使えるという点も大きいのではないでしょうか。
そして、adonisはおそらく2015年頃に出来たばかりの、新しいフレームワークです。
その為まだまだ、海外でも認知度が低く、未実装の機能も多いので、商用レベルでの導入は難しいかもしれません。しかし、開発は盛んの様で、その状況はTrelloやgithubから確認できます。
ちなみに、日本ではまだ全然認知されていないようで...
日本語の記事は、最初に挙げた記事しか見つかりませんでした。
AdonisもLaravelと同じように少しづつ、認知度が広がればいいなと思います。
以上、今後注目のフレームワークでした
少ししたら、個別に機能紹介をしてみたいと思います。