bouzuya.hatenablog.com

ぼうずやのにっき

bouzuya/alertwil 0.1.0 をつくった

bouzuya/alertwil の 0.1.0 をつくった。

alertwil は Twilio を使った alert を通知する仕組みだ。

alertwil 自体の目的は alert に気づかないことを防ぐためで、手段として Twilio を使って気づくまで何度も発信する。……のだけど、どちらかというと meta な目的である koa や bath, time-keeper, beater, npm-run-all, cpx などの検証こそがねらいだ。

2016-06-23 にも一度 alertwil のことを書いている。日付から分かるとおり、もう一ヶ月もだらだらとつくっている。

2016-06-23 にも書いたとおり alertwil を経て、ぼくの package.json は大きく変わった。npm-run-all, cpx, rimraf で shell への依存を減らした。特に npm-run-all をおすすめしたい。 npm-run-allnpm run XXX を並列・直列に実行する。これにより &&paralellshell などの利用を避けられる。npm run XXX にするため、複雑な shell command を個別の npm run-script に分割する。これが package.json の簡素化に有効だったと感じる。

ほかには koa 1.x をためした。率直な感想を言えば、いまひとつ良いものだと思えない。

function* や koa middleware の構造は必然性に欠けている気がする。見た目は悪くない。しかし、ただそれだけという印象がある。非同期処理を含む middleware の入れ子構造や、次の呼び出しの制御。これだけの問題のためにあの構造を導入するのは大げさだ。見た目を気にしないなら単に Promise でも上から下への書き下しができないくらいで、さほど問題にならない。むしろ素直で良い。雑だけど次のような雰囲気。

const middlewares = [
  (next) => {
    console.log('middleware 1 before')
    return next().then(() => {
      console.log('middleware 1 after');
    });
  },
  (next) => {
    console.log('middleware 2 before')
    return next().then(() => {
      console.log('middleware 2 after');
    });
  }
];

const call = (middlewares, index) => {
  const middleware = middlewares[index];
  return middleware
    ? middleware(() => call(middlewares, index + 1))
    : Promise.resolve();
};

call(middlewares, 0);

構造にけちをつけるなら this を利用する構造もいまっぽくない。() => ...; との組み合わせが良くない。

また、うまく切り離せればいいのだけど、 koa の構造を持ち回すことになる気がした。 function*入れ子this を。構造に引きずられるという意味で、ぼくは redux を思い浮かべた。優れているとも思えない構造に引きずられるのは良くない。

ぼくの捉え方が間違えているのかもしれない。だけど、koa 2.x で function*async に変わるし、this もなくなるところを見ると、そこまで間違えていないと思う。

TypeScript 2.0 beta / @types/* の採用は見送った。これは時機の問題なので、次の開発からは TypeScript 2.0 になるだろう。

testdouble も見送った。.d.ts がなくてつらそう。触っていないけどざっと見た感じ。 DSL とか覚えたくないし、使いたくもない。

bath / time-keeper は未使用。また beater は使用しているが、function* には触れられていない。

alertwil 0.2.0 では bath / time-keeper / beaterfunction* 対応を含めたい。