Re: RequireJSを使うのを止めた理由
を読んで、ほぼ同意だったのですが、意識が高まったのでいくつかコメントを。
嫌だったところ
基本的に、1枚のJSファイルが1モジュール、ファイル名がコードに影響する。
それができるのが良いところだと思ってました。
それもあって、結合・圧縮は r.js という専用のツールが必要になる。Grunt の concat とか uglify とか使えない。
リリース版ではビルドがほぼ必須というのがRequireJSの欠点ですね。
ただGruntについては、grunt-contrib-requirejsを使えばデフォルトでuglifyされますし、concatなど他のGruntタスクと組み合わせることも可能です。
AMD の仕様では、「JSファイルのリストを順番通りに読み込み/実行する」ということができない。実際何が困ったかというと、分割した mocha テストケースを順番通りに実行できなくなったということ。結果は変わらなくても、順番通りに実行されないと結果が見辛いし、問題が起こった時に発見が難しい。
たしかにテストケースは毎回同じ順番に並べたいですね。
実はorderプラグインというのがあって簡単にロード順を制御できたのですが、RequireJS 2.0からはshimがあるんだからそれ使え!っていうことでサポートされなくなってしまいました。
そのかわり、stepプラグインで若干設定が面倒ですが順番指定が可能です。テストの順番指定という用途であれば使えそう。
AMD に対応していないライブラリは、RequireJS 独自規格である shim で定義することになる。で、ほとんどライブラリが AMD 対応してない。
おっしゃるとおりでございます。
キャッシュ対策に使う requirejs.config の urlArgs が全ファイルに付いてしまう。個別に指定したかった。
これはあまり感じたことはないですね。
jQueryと同じニオイを感じるソースですねw
良いところ
依存関係を明示出来る。
多くのWebページで異なった構成のJSファイルを使ったり、1ページ=1JSファイル的なWebページを模したアプリを作るなら、ある規模以上からはほぼ必須だと思う。
モジュール単位で開発できるので、担当を分けたりするのに便利。
何かと影響範囲が大きいため、「とりあえず入れる」のは止めるべき
このあたりは全く同意です。
規模に比例してなんらかのパッケージ管理の必要が増してきて、でもブラウザで動かす都合上、どうしてもちょっと面倒な仕組みにならざるをえない、というのが現状のクライアントJSの実情だと思います。
その損益分岐点を超える場合に使えば良い、っていうことじゃないですかね。
でも、AMDは書きたくないんです。
個人的にはこれにつきるのではないかと。
RequireJSは開発環境ではビルドが不要なのと引き換えに、AMDという縛りを受け入れました。ただこのAMDっていう記法がスマートじゃないし、ましてやUMDなんて手書きしたくないわけです。
その上、最近はJSもCSSもコンパイルが前提みたいになってきて、watchする環境はすでにあったりするので、ビルド不要っていうアドバンテージも弱くなってきてるんですよね。
加えて開発版とプロダクト版で二重にビルド設定書かないといけなくて、しかもちょっと複雑なことしようとするとどっちかで動かないみたいなこともあったりして。
とは言え現行ブラウザでは致し方ない面もあったり他に良い方法もなかったりするので*1、だましだまし使いつつ*2、ES6やTypeScriptのモジュールに夢を馳せております。