2016-07-22 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-all
は npm 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
/ beater
の function*
対応を含めたい。