Webサービス作るのに必要そうなのを色々入れたYeoman generator作ってみた

expressでWebサービスを作り始めるのに必要そうな
npm packageをつめたYeomanのジェネレータ
[generator-express-kick-starter](https://www.npmjs.org/package/generator-express-kick-starter)を作ってみた。

# 使い方
※ mongodbをlocalhostで動かしておく必要あり。

## install
```bash
$ npm install -g generator-express-kick-starter
$ yo express-kick-starter
```

## test
```bash
$ grunt spec     # server test
$ grunt coverage # server coverage
$ grunt mocha    # client用test
```

## サーバ起動
```bash
$ grunt serve
```

# 使っているライブラリ

## Core
* [express](http://expressjs.com/) -- ウェブフレームワーク
* [jade](http://jade-lang.com/) -- htmlテンプレートエンジン
* [sass](http://sass-lang.com/) -- CSS extension language

## セッション管理
* [connect-mongo](https://github.com/kcbanner/connect-mongo) -- mongodbでセッション管理

## 認証

* [passport](http://passportjs.org/) -- 認証周りを管理するライブラリ
* [passport-facebook](https://github.com/jaredhanson/passport-facebook) -- facebook認証用のpassportライブラリ
* [passport-twitter](https://github.com/jaredhanson/passport-twitter) -- twitter認証用のpassportライブラリ

### Token-Based Application

* [express-jwt](https://github.com/auth0/express-jwt)
  * APIの認証のために、json web token用ライブラリを入れてます。
    * 詳しくは[Cookies vs Tokens. Getting auth right with Angular.JS](https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/)

## mongodbクライアント

* [mongoose](http://mongoosejs.com/)

## config

* [node-config](https://github.com/lorenwest/node-config) -- `NODE_ENV`の違いに合わせてconfigファイルを設定出来る
  * ここにSNSのコンシューマーキー等を設定します。

## 静的ファイル

* [st](https://github.com/isaacs/st) -- 静的ファイル配信時に必要な設定(etagsなど)を設定できるライブラリ

## テスト

### サーバーサイド

* [mocha](http://visionmedia.github.io/mocha/) -- テストフレームワーク
* [expect.js](https://github.com/LearnBoost/expect.js) -- アサーションライブラリ

## クライアントサイド 

* [mocha](http://visionmedia.github.io/mocha/) -- テストフレームワーク

## Logger

* [log4js-node](https://github.com/nomiddlename/log4js-node) -- ログ用ライブラリ。ログローテートも設定出来る。

## ユーティリティ

* [lodash](http://lodash.com/)
* [async](https://github.com/caolan/async)
* [require-directory](https://github.com/troygoode/node-require-directory)
* [express-validator](https://github.com/ctavan/express-validator)

## ドキュメント

* [swagger-express](https://github.com/fliptoo/swagger-express) -- APIドキュメント。`localhost:3000/docs` で表示できるようにした。

## 開発ツール

* [nodemon](https://github.com/remy/nodemon)
* [node-inspector](https://github.com/node-inspector/node-inspector) 

# Gruntタスクライブラリ

* [grunt-mocha](https://github.com/kmiyashiro/grunt-mocha) -- clientのmochaテスト実行
* [grunt-mocha-test](https://github.com/pghalliday/grunt-mocha-test) -- サーバー用コードのmochaテスト実行
* [grunt-istanble](https://github.com/taichi/grunt-istanbul) -- カバレッジツール
* [grunt-contrib-clean](https://github.com/gruntjs/grunt-contrib-clean) -- ファイルやディレクトリの削除処理
* [grunt-contrib-concat](https://github.com/gruntjs/grunt-contrib-concat) -- ファイルの結合
* [grunt-concurrent](https://github.com/sindresorhus/grunt-concurrent) -- Gruntタスクを並列実行
* [grunt-contrib-copy](https://github.com/gruntjs/grunt-contrib-copy) -- ファイルやディレクトリのコピー
* [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin) -- CSSのminify
* [grunt-contrib-jshint](https://github.com/gruntjs/grunt-contrib-jshint) -- JSHintの実行
* [grunt-contrib-uglify](https://github.com/gruntjs/grunt-contrib-uglify) -- JavaScriptのminify
* [grunt-contrib-watch](https://github.com/gruntjs/grunt-contrib-watch) -- watchタスク
* [grunt-env](https://github.com/jsoverson/grunt-env) -- タスク内で環境変数を設定する
* [grunt-node-inspector](https://github.com/ChrisWren/grunt-node-inspector) -- node-inspectorの実行
* [grunt-nodemon](https://github.com/ChrisWren/grunt-nodemon) -- nodemonの実行
* [load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks) -- `grunt.loadNpmTasks` を省略できるタスク。パッケージ名の頭が `grunt-`の場合、ロードするみたいなことをしているので、prefixが`grunt-`でないパッケージをロードしたい場合は、自分で書く必要がある。

# 作ってみた感想

* まだデプロイ周りとかフロント周りとか入れきれてない。
  * フロントは「backboneとかangularが...」
    * その場合は、Yeomanでどれをインストールするか..?
  * とにかく少しでも汎用的に書こうとすると、ジェネレータ書く結構手間が一気に上がる。
  * deployはcapistranoでまとめきれそう。
* `subgenerator` で　`Vagrantfile`や`Capfile`,`Dockerfile`を作ると便利かも。
* 似たような名前や処理のnpm packageがよくある
  * 精査や好みが個人毎に分かれそう。

なので、時間が許されるならば
**色々なジェネレータを参考にしつつ、自分やチーム用のジェネレータを作るのが、一番良い**気がしました。