勉強会で教えて頂いてからずっと気になっていたものの、ガッツリ触れずにいましたが、ようやく機会が訪れたので Sails を使いはじめました。

昨今、Node のフレームワークとしてはなにやら Meteor がグイグイ来ている様ですが、要件的な都合と好みから自分的には Sails がフィットしそうな予感がしています。

未だドキュメント読んでる最中なので不適切な説明あれば随時修正していきます。

Sailsとは

そもそも Sails.js とは何か。公式から引用します。

Sails is, of course, a web framework. But take a step back. What does that mean? Sometimes, when we refer to the “web”, we mean the “front-end web.” We think of concepts like web standards, or HTML 5, or CSS 3; and frameworks like Backbone, or Angular, or jQuery. Sails is not “that kind” of a web framework. Sails works great with Angular and Backbone, but you would never use Sails instead of those libraries.

On the other hand, sometimes when we talk about “web frameworks”, we mean the “back-end web.” This evokes concepts like REST, or HTTP, or WebSockets; and technologies like Java, or Ruby, or Node.js. A “back-end web” framework helps you do things like build APIs, serve HTML files, and handle hundreds of thousands of simultaneous users. Sails is “that kind” of web framework.

What is Sails?

軽く意訳してみました。

Sails はもちろん「Webフレームワーク」です。
しかし、そもそもそれはどういう意味でしょうか?

我々が「Web」を考えるとき、それは「フロントエンドWeb」を意味する事があります。
世の中にはWeb標準、またはHTML5やCSS3のような概念や、Backbone、Angular、およびjQueryなどのフレームワークがありますが、Sails はそれらの替わりになるものではありません。

一方で、「Webフレームワーク」といえば、時にそれは「Webバックエンド」を意味します。
つまりRESTやHTTP、WebSocketなどを扱う Java (Servlet)やRuby (on Rails)、またはNodeなどのサーバサイドの技術です。
APIを構築したり、HTMLを配信したり、そして同時に数十万人の接続を制御したりする時、「Webバックエンド」のフレームワークがその助けになるでしょう。

Sails も「そのような」Webフレームワークです。

Sails は Node.js 上で動く、 scaffolding や UnitTest、ORマッパなどをサポートするフルスタックなフレームワークです。

Rails や CakePHP っぽいやつです。

本記事内ではSEO的にあえて Sails.js の表記も混ぜてますが Sails で良いみたいです。その辺はNodeとかと同じですね。

インストールなど

npmでインストールしてからプロジェクトを作成し起動するまでです。

rails や cake bake みたいなノリです。

npm i -g sails

sails new chat

cd chat

sails lift

sails lift するとデフォルトで http://localhost:1337/ とかで見られる様になります。

最初、sails lift をしないと 後述の.tmpとかを更新するタスクが走らないのかと思ってましたが、node app で起動しても特に問題無いようです。

最初まよったこと

まだ使い始めなんで判らない事だらけです。取り敢えず気付いた事をメモします。

コントローラとアクションどうやって作れば

sails generateします。

例えばloginアクションとlogoutアクションを持つauthコントローラを作る場合はこんな感じです。

sails generate controller auth login logout

その結果、api下にコントローラのファイルが作られて、

api/controllers/AuthController.js

/auth/login とか /auth/logout でアクセス出来るようになる様です。

特に route を足すとかいう必要は無くて規約的にそうなる様です。

このへんRailに乗ってる感あります。Sailだけど。

ファビコンはどこに

ここでいいみたいです。

assets/favicon.ico
ブラウザタイトルはどうやって変えれば

レイアウトのテンプレートファイルがこれっぽいです。

views/layout.ejs

他のejsはBodyだけ書く流儀らしいです。

クライアントサイドのJavaScriptはどうすれば

tasks/pipeline.js に下記を読み込む順序で書いて、assetsの下におけけば良いらしい。

そうすると sails lift すると layout.ejs が更新され、assets が .tmp/public (これはdevの場合で多分Productionは別のトコになる) に反映されるらしいです。

JavaScriptはこんな感じで

var jsFilesToInject = [
  'js/dependencies/sails.io.js',
  'js/dependencies/**/*.js',
  'js/dependencies/jquery-x.x.x.min.js',
  'js/client/bootstrap.min.js',
  'js/client/hogehoge.js',
  'js/client/*.js'
];
css や lessはどーすれば

同じく tasks/pipeline.js の cssFilesToInjectの中で

var cssFilesToInject = [
  'assets/styles/importer.less',
  'css/*.css'
];

としたうえで、

assets/styles/importer.less に追記してやれば、これも layout.ejs と .tmp/public に反映されるらしいです。

@import 'assets/less/style_a.less';
@import 'assets/less/style_b.less';
@import 'assets/less/colors.less';

cssFilesToInjectで指定されている通り css は規定では assets/css/の直下におけばいい事になります。

感想など

最初アセットパイプラインの動きが判らなくて無駄な時間を過ごしたけど、めっちゃドキュメントの最初の方に書いてました。

触っているうちに雰囲気つかんで疑問点がうきぼりになってからドキュメントに目を通そうとか思っていましたが、このへんのCoCなフレームワークは最初にきちんとドキュメントに目を通した方が結局近道ですね。

Concepts: Table of Contents | Sails.js Documentation

まだ使い始めなんで、express と比べてどう幸せになれるかキッチリ説明できませんが、既にそういう気分になっています。

個人的なモチベーションとしてはORマッパ(Walter Line) を使えば MySQL が使えて scaffold による手抜きAPI開発が出来るという所や、i18nサポートとかmochaとの連携とかがフレームワークに組み込まれているあたりです。また機会があればその辺書きます。

参考にさせて頂いたサイト

Node.js の MVCフレームワーク Sails.js が良さげなので少し試してみた