Kodougu で使っていた dojo を 0.4.3 から 1.0.1 に上げました。0.4.x から 0.9 の段階でドラスティックに変わっていたので、Kodougu の JavaScript は 3000 行に満たないのですが、移行にかなり手こずってしまいました。

まだ、運用環境にはアップロードしていないのですが、大半の機能は動くようになったので、作業ログと感想を載せておきます。

作業環境:Firefox で移行作業を完了させてから、 IE での確認。

■ 疑問と感想
(1) イベント系について
イベント系が dojo._base に組み込まれたのはなぜでしょうか。個人的には従来の名前空間(dojo.event.browser)でもいいかなと感じました。それとも、よく使うものだから dojo 本体に入れ込んだのかな・・・?

(2) dojo.io.bind について
敢えて specific な構造(従来は dojo.io.bind という抽象的なメソッドだったのが、dojo 1.0 では、iframe や XMLHTTPRequest などのプロトコルごとにメソッドが準備されている)に変更されたのは・・・まぁ、なんとなく理由はわかりますが、従来の「とりあえず bind」でもよかったかなという気もします。

(3) dojo.io.FormBind が無くなった
また、dojo.io.FormBind がなくなったのが痛かったです。dojo.io.FormBind は、既存の Form の Submit ボタンが押されたイベントを拾って、Ajax 方式でリクエストをサーバに送信してくれるクラスです。

対策としては、Dojo の Form には、Form の Submit ボタンを押すと実行される OnExecute というイベントがあります。Form.execute というメソッドをオーバーライドして、ここで、xhrPost(Ajax)を送信するようにしました。このため、Rails の Form といまいち相性が良くありません(※)。もしかすると、Form 系は Rails を使わずにすべて dojo でやってしまうのも手かもしれません。Kodougu では、Rails で Form の外枠だけ作って、あとから dojo の Form 系 Widget を生成しています。

※ dojo 使っている時点で、Rails の Ajax 系ヘルパーをそのまま使うことはあきらめるしかないのですが。そのうちだれかが何とかしてくれるでしょうけどね。

(4) 感想
0.4.3 から 1.0.1 と、かなり隔たりのある更新作業だったので、正直大変でした。それでも、感覚としては、「ドラスティックな変更の割には、今のところ互換性による影響はそれほど出てない」と思います。(一番困るのは、「××が廃止されたから○○はできません」みたいなことが起こることですが、それはありませんでした。)dojo もいろいろな意味で品質が上がってきたのかもしれません。

dojo.collections -> dojox.collections のような変更が続くなら、バッドノウハウであるコンストラクタをラッピングするだけの Factory を作りたくなりました。ま、作らないと思いますけど。


■ 作業ログ

(1) 0.4.3 → 1.0.1 スクリプトの入れ替え

(2) dojo.require 関係の修正
・ dojo.require から * の削除

・ dojo から dojox に変更
old:
dojo.require('dojo.collections.ArrayList');
dojo.require("dojo.dom");
dojo.require("dojo.gfx");
dojo.require("dojo.io.cometd");

new:
dojo.require('dojox.collections.ArrayList');
dojo.require("dojox.data.dom");
dojo.require("dojox.gfx");
dojo.require("dojox.cometd");

・ dojo から dijit に変更

Old:
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.TabContainer");
dojo.require("dojo.widget.ContentPane");
dojo.require("dojo.widget.ColorPalette");

New:
dojo.require("dijit.Dialog");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.ColorPalette");

(3) 定義系の変更
dojo.collections -> dojox.collections
dojo.gfx -> dojox.gfx
dojo.gfx.color -> dojox.color
dojo.event.browser.stopEvent -> dojo.stopEvent

(4) dojo.declare に関する変更
initializer -> constructor

(5) dojo.io.bind の変更
従来、dojo の Ajax ラッパーは、プロトコルを意識させないものだったのですが、プロトコルを意識した名前に変更されています。とりあえず、私は XMLHttpRequest ベースの dojo.xhrPost() を使用するように変更しました。

dojo.io.FormBind がなくなったので、Form.execute + dojo.xhrPost() で対処しました。

(6) Widget 系の変更
dojo.widget.createWidget -> それぞれの Widget のコンストラクタ
dojo.widget.byId -> dijit.byId



Posted by あかさた
最近のエントリ
最近の読書メモ