JavaScriptというと、ブラウザ版JavaScriptが一般的だと思いますが、自分の場合TitaniumMobileでJavaScriptを覚えたのでブラウザ版JavaScriptがいまいちよくわかっていません。

最近ブラウザ版JavaScriptを触りまくってみて感じたことなどを。

感じたこと1
jQueryは捨てるべきか。
まあ確かに便利なんだが、使うAPIはほんの一部だし(セレクタ、ajaxくらいかな。。)、コーディング中に、これは生のDOMオブジェクトなのかjQueryオブジェクトなのかわからなくなる。
とりあえず$(this)しとけー的な。
jQueryオブジェクトはaddEventListenerも動かない(?)様子だし、バージョンでAPIの仕様かわるし。。
jQueryはやめて使う分だけ自前で実装してしまった方が自分には合ってるんじゃないかなーとか妄想中。でも効率的なライブラリの開発手法までは知らないので勉強中。

感じたこと2
データバインドは必要なのか。
Vue.jsやangular.jsを触ってみてデータバインド確かに便利そうに思えたけど、デスクトップアプリのようなSPAでも目指さない限りいらなくね?と感じた。
ViewとModelを切り離す設計はとてもいいと思うので、observerパターンでModelの変更通知をviewに伝える機構だけあればええんちゃうかと思った。

感じたこと3
coffeeScriptは覚える気にもなれない。クラス書くときに便利そうだけど、そんなにクラス書きまくるほどのアプリケーションを作らないかな。

感じたこと4
HTMLを動的に書き換えるのはSEO的にどうなのよ?
クローラーボットに対しては静的で出力するという話も聞いたが、それもそれでSEO的にどうなのよ?クローラーに違う表示させるのは昔流行ったスパムじゃないすか。

感じたこと5
いろんなJavaScriptライブラリやフレームワーク使ってみんな何してんの?
正直そんなに使いどころがあるとは思えないのだが。。。
そんなにページ遷移させたくないのかしら。。
Titaniumで生(?)のcreateUI系を直接叩くのはあまり好きではない。
後で変更しようと思った時に簡単に変更できるように関数でラップしておくが好き。

exports.createWindow = function(param){
return Titanium.UI.createWindow(param);
}

みたいな。

あとで、
window全体の色をかえたいよぉ。。。
androidのwindowだけちょめちょめしたいよぉ。。。
っていうとき。

exports.createWindow = function(param){
param.backgroundColor = "#000";
if(isAndroid()) param.backgroundColor = "#FFF";
return Titanium.UI.createWindow(param);
}

みたいな感じでデフォルトを追加できるしね。

ってことでやってきたんだけど、
UI分exports関数作るのすらだるくなってきたのでこうした。

function ui(method, p){
if(!p) p = {};
switch(method){
case "createWindow":
if(!p.backgroundColor) p.backgroundColor = "#FFF";
break;
case "createLabel":
if(!p.font){
p.font = {fontSize:16, fontWeight:"bold"};
}
break;
}
return eval("Titanium.UI." + method + "(" + JSON.stringify(p) + ")");
};

var window = ui("createWindow");

eval使ってんじゃねぇよ!って言われそうだけど気にしない。
ゲームを作っていると、いろんなviewに対して非同期で実行していかないといけないので複雑なプログラムになります。

例えばドラクエだと。

1. 勇者の攻撃メッセージ

2. 勇者の攻撃エフェクト

3. モンスターがダメージを受けるエフェクト

4. ダメージメッセージ

5. モンスターの攻撃メッセージ

6. モンスターの攻撃エフェクト

7. 勇者がダメージを受けるエフェクト(画面揺れたり)

8. ダメージメッセージ and HP表示の再描画

こんなのが、非同期で実行しないといけない。

1が終わったら2を実行して、3を.....

終わったらcallbackのネストが深くなるのでなんとかならんかなぁということで、observerパターンを検討。

適当なオブジェクト(model)に状態(state)をもたせて、stateが切り替わったことを各viewに通知(notify)する。

非同期だけど、同期処理っぽくかけるぜひゃっはーって思ってたら、
viewのupdate処理中にmodelのstateを書き換えちゃうと、次のviewへのnotifyを待たずに新規のnotifyが走っちゃう。

どうしたもんか。