受託メインのWeb制作者に捧げるURLディスパッチャーを書いた


[url-dispatcher](https://github.com/haribote/url-dispatcher)

いまさら需要があるかどうか分かりませんが、URLに応じてJSの処理を振り分けるためのディスパッチャーを書きました。
受託メインのWeb制作現場（たとえば[弊社](http://maboroshi.biz/)とか！）では画面によって必要な処理がまちまちだったりしてJSが散らかりがちですが、URLディスパッチャーを利用すれば全ての画面の処理を1つのJSにまとめて書いておくことも可能です。

こういった機能は以前からスニペットとしてネット上に色々転がっているのですが、[Backbone](http://backbonejs.org/)の[Router](http://backbonejs.org/#Router)のようにURLからパラメーターを受け取れる機能を持ったものがほしかったので自分で書きました。

URLの解析パターンやマッチングなどはBackboneのコードを参考にしまくりました。
まじでありがとうBackbone！

## インストール
いくつかのインストール方法を用意していますのでお好きなやり方をお選びください。

### npm
```sh
npm install url-dispatcher --save
```
```JavaScript
var Dispatcher = require('url-dispatcher');
```

### Bower
```sh
bower install url-dispatcher --save
```

`bower_components/url-dispatcer/dest`ディレクトリに収録されているファイルをコピーするなどしてください。

```html
<!-- IE9以上で良ければ -->
<script src="path/to/script/dispatcher.min.js"></script>

<!-- IE8に対応したければ -->
<script src="path/to/script/dispatcher.compat.min.js"></script>
```

### 手動
1. ファイルを[ダウンロード](https://github.com/haribote/url-dispatcher/archive/master.zip)する
2. ファイルを解凍する
3. `dest`ディレクトリに収録されているファイルをコピーするなどしてください。

```html
<!-- IE9以上で良ければ -->
<script src="path/to/script/dispatcher.min.js"></script>

<!-- IE8に対応したければ -->
<script src="path/to/script/dispatcher.compat.min.js"></script>
```

## 使い方
とりあえず以下がサンプルコードです。

```JavaScript
/**
 * コンストラクターにルーティングマップを渡す
 */
var dispatcher = new Dispatcher({
  routes: {
    '/': function () {
      return 'root';
    },

    '/hoge': function () {
      return '/hoge';
    },

	// :piyo みたいに書くとコールバック関数に値が渡される
    '/hoge/:piyo': function (piyo) {
      return {
        piyo: piyo
      };
    },

    '/hoge/:piyo/:fuga': function (piyo, fuga) {
      return {
        piyo: piyo,
        fuga: fuga
      };
    },

	// urlクエリーがマッチした場合の第1引数はクエリー文字列全体
    '/hoge?piyo=:fuga&foo=:bar': function (search, fuga, bar) {
      return {
        search: search,
        fuga  : fuga,
        bar   : bar
      };
    },

	// *splat みたいに書くとパスとクエリー文字列に分けて渡される
    '/foobar/*splat': function (path, search) {
      return {
        path  : path,
        search: search
      };
    }
  }
});

/**
 * runメソッドにURL文字列を渡して実行すると対応するコールバック関数が呼ばれる
 */
dispatcher.run(location.href);
```

### 初期化
まずはコンストラクターに[Backbone.Router](http://backbonejs.org/#Router)と同じような書式でルーティングマップを渡します。
マッチさせたいパスと、そのパスにおいて実行したいコールバック関数をセットにして`routes`オブジェクトにまとめてください。

### 定義した処理の呼び出し
コンストラクターから作成したインスタンスの `run`メソッドにURL文字列を渡して実行すれば、ルーティングマップで定義した条件に従ってコールバック関数が呼び出されます。
例えば上記のコードにおいてページのURLが `http://maboroshi.biz/hoge/1/2`だった場合は以下のような実行結果となります。

```JavaScript
// location.href が 'http://maboroshi.biz/hoge/1/2' の場合
dispatcher.run(location.href);
// => { piyo: '1', fuga: '2' }
```

## 例えばこんな使い方
例えば特定のページにのみ必要なライブラリーなどを非同期に読み込ませる、なんてこともできます。

```JavaScript
/**
 * コンストラクターにルーティングマップを渡す
 */
var dispatcher = new Dispatcher({
  routes: {
    '/hoge': function () {
      $.ajax('mono-sugoi-library.js', {
      	dataType: 'script'
      }).done(function () {
      	// 'mono-sugoi-library.js' が読み込まれたあとの処理
      });
    }
  }
});

/**
 * runメソッドにURL文字列を渡して実行すると対応するコールバック関数が呼ばれる
 */
dispatcher.run(location.href);
```
上記のコードでは、例えばページのURLが `http://maboroshi.biz/hoge` だった場合に `mono-sugoi-library.js` が読み込まれます。

## バグとか
バグなどありましたら[GitHub](https://github.com/haribote/url-dispatcher)にissueとかprとか是非お寄せください！