Sails.js v0.10系 新機能まとめ

Sails.js のバージョンがついに v0.10へとアップデートしました。

今回はRC版がコンスタントに上がっていき、色々機能的なテストを行っている印象でした。

幾つかv0.9系からの変更点もあるので、ここで纏めておきたいと思います。

  • Node.js: v0.10.26
  • Sails.js v0.10.2

sails コマンド

sails new

--linker オプションが廃止され sails-linker はデフォルトで使用するようになりました。

対象ファイルは/config/pipeline.js に設定します(後述)

sails generate api

v0.9.x では sails generate @Hogeを実行すると HogeController.js@Controller と Hoge.js@Model が生成されました。

これはHoge@CRUDを実現するために、model とcontroller を同時に生成するコマンドですが、api として新たに追加されました。

つまり、今まで sails generate user としていたものが sails generate api user と実行することになります。

gruntファイル分割

/tasks フォルダ以下に config, register フォルダで構成されています。

config フォルダ

各プラグインのタスクの設定をします。

例えば、grunt-contrib-coffee の coffee タスクは tasks/config/coffee.js に記述します。

grunt.config.set('coffee', {}) とset 関数でcoffee としていますが、ファイル名も同一としているようです。
(ユーザ独自のものは纏めて設定してもいいかもしれませんが、この辺りはそれぞれの運用ルールで)

register フォルダ

各実行タスクの設定をします。

grunt default の実行タスクであれば tasks/register/default.js
こちらも、grunt.registerTask('default’,[“xxx”,”yyy”])としていますが、ファイル名も同一です。

pipeline.js

前述しましたが、v0.9.xのオプションあった ``--linker`` はデフォルトで適用されるようになりました。

今まで Gruntfile.js 内の設定 であった sais-linker のファイル定義部分を pipeline.js へ記述します。

sails-linker は、本番環境(--prod)実行時、pipeline.js で記述されたファイル群の自動ロード / 結合・圧縮を行い、layout.ejs 内のパスを自動で書き換えるモジュールです。

sails-linker 参考記事

Gruntfile.js

Gruntfile.js の 関数 loadTasks により、config, register フォルダ以下の .js ファイルは自動で読み込みます。 (※プラグインのロードを自動で行うわけではない)

CoffeeScript(.coffee)のファイルも読み込みたい場合は loadTasks 関数を書き換えます。

	/**
	 * Loads Grunt configuration modules from the specified
	 * relative path. These modules should export a function
	 * that, when run, should either load/configure or register
	 * a Grunt task.
	 */
	function loadTasks(relPath) {
		return includeAll({
			dirname: require('path').resolve(__dirname, relPath),
			filter: /(.+)\.(js|coffee)$/
		}) || {};
	}

あと、いまさら grunt なの? というなかれ、その辺りは Sails Generator (※後述) で対応します。
(個人的にはデフォルトでgruntfile の生成をOffしてもらえると良いのですが・・

npm_module ファイル

``sails new`` で出力された npm_modules 内の各フォルダは Sails.js を global インストールしたファイルへのシンボリックリンクとなっているので、改めて実体をインストールする場合はフォルダを削除後 ``npm i`` で再度インストールします。

config

adapters.jsの廃止

DB接続設定は ``config/adapters.js`` から ``config/connection.js`` へ変更されました。 また、各設定のプロパティ項目 `` module `` は `` adapter `` へと変更されています。

なお、adapters.js に設定があったデフォルトDBの設定は config/models.js に記述します。
connections.js はDB接続の定義のみを記述することになります。

module.exports.models = {
 
  /***************************************************************************
  *                                                                          *
  * Your app's default connection. i.e. the name of one of your app's        *
  * connections (see `config/connections.js`)                                *
  *                                                                          *
  ***************************************************************************/

  connection: 'localDiskDb'
};

使うmodelごとで個別にDB接続定義を設定することも出来ます。

例えば、よく使うUserModel(sails generate api user) で、このmodelのみ mongodbを利用する場合、下記のようになります。

connection.js デフォルト設定値を使う例

/api/models/User.js
/**
* User.js
*
* @description :: TODO: You might write a short summary of how this model works and what it represents here.
* @docs        :: http://sailsjs.org/#!documentation/models
*/

module.exports = {

     adapter: 'someMongodbServer',

     attributes: {


     }

};

これにより
http://example.com/user/@CRUD で使うデータベースだけを mongoDBで利用したり、他のAPIでは Redis を使うなど柔軟に設定が変更出来ます。

global.js

以前からSails.jsではとても大きな global オブジェクトに色々と定義されていたのですが、その要不要を変更する設定が追加されています。
{
     _: true,
     async: true,
     sails: true,
     services: true,
     models: true
}

views.js

Viewテンプレートに変更はありません。
config/view.js
views.engine: ejs

ejs がデフォルトです。

http.js

Sails.js では内部的にExpressを利用しています。
サーバ立ち上げ時に使う Expressのmiddleware 実行を

sails.config.express.customMiddleware

で定義していましたが、

sails.config.http.customMiddleware

に変更されました。

また、orderプロパティで実行順も定義することが出来るようになりました。

Hookオブジェクト

(ejs) テンプレート内で sails.config にアクセスする際 v0.9.x では Hook オブジェクトを参照していましたが、v0.10.x では、sails オブジェクトを参照します。
// v0.9系
Hook.config.port
// v0.10系
sails.config.port

Sails Generator

v0.10系の目玉機能(?)です。

Sails.js に限った話ではありませんが、Frameworkが基本構成のファイルを生成する機能は最低限の構成であったり、逆に不必要なファイルが生成されることが有ります。
その結果、結局 コマンド( Sails.js であれば sais new )を使わず、一度生成したファイル群をカスタマイズし、git にコミットして必要なときにclone するといったことをしてしまいがちです。
そうなると、Frameworkのバージョンアップに合わせてカスタマイズしたファイル群も更新するなど、とても非効率な状態になってしまいます。

そこで、生成するファイル群を自分で定義、もしくはnpm moduleからインストールしておき、sails new / sails generator 実行時に必要な構成を取捨選択し使う機能として Sails Generator を利用することが出来ます。

大きく分けて2つの使い分けがあります。

もともと、new コマンドは、sails-generate-frontend -> sails-generate-gruntfile というように、実行していきます。
それらの sails-generate-xxxx は、小さな npm_modules として作成されています。

1つ目は、new 実行時にコマンドを Hookし、内部的に実行される sails-generrate-xxxを入れ替える (例えば sails-generate-gruntfile と sails-generate-gulp) といった使い方をすることが出来ます。

2つ目は、new コマンドで一度、生成した初期ファイル群に対して、必要な機能(例えば passport ログイン認証に必要なファイル群)を追加するという、アドオン的な使い方も出来ます。

詳細は別記事にまとめました。