IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

MochiKit を dojo toolkit の管理下に置く際の注意

MochiKitdojo toolkit で管理しようと思った

http://svn.mochikit.com/mochikit/trunk/MochiKit/MochiKit.js

if (typeof(JSAN) != 'undefined' || typeof(dojo) != 'undefined') {
    if (typeof(dojo) != 'undefined') {
        dojo.provide('MochiKit.MochiKit');
        dojo.require("MochiKit.*");
    }

MochiKit はその辺も考慮されて作られているようだ。

しかし、実際に使ってみると

<script type="text/javascript" src="/js/dojo.js"></script>
<script type="text/javascript">
// <![CDATA[
  dojo.setModulePrefix('MochiKit', '/js/MochiKit');
  dojo.require('MochiKit.MochiKit');
// ]]>
<script>

こんなエラーが出た。

symbol 'MochiKit' is not defined after loading '__package__.js'

調べてみると

http://svn.mochikit.com/mochikit/trunk/MochiKit/__package__.js

dojo.hostenv.conditionalLoadModule({
    "common": [
        "MochiKit.Base",
        "MochiKit.Iter",
        "MochiKit.Logging",
        "MochiKit.DateTime",
        "MochiKit.Format",
        "MochiKit.Async",
        "MochiKit.Color"
    ],
    "browser": [
        "MochiKit.DOM",
        "MochiKit.Style",
        "MochiKit.Signal",
        "MochiKit.LoggingPane",
        "MochiKit.Visual"
    ]
});
dojo.hostenv.moduleLoaded("MochiKit.*");

これの dojo.hostenv.conditionalLoadModule, dojo.hostenv.moduleLoaded がないのが原因らしい

という訳で grep してみると dojo/src/compat/0.2.2.js というのがあった

http://svn.dojotoolkit.org/dojo/trunk/src/compat/0.2.2.js

dojo.hostenv.moduleLoaded = function(){
	return dojo.hostenv.startPackage.apply(dojo.hostenv, arguments);
}
:
:
dojo.hostenv.conditionalLoadModule = function(){
	dojo.kwCompoundRequire.apply(dojo, arguments);
}

なるほど、0.2.2 の次のバージョンで大きく関数名の変更があったのか。

じゃあよみこんでみよう。

<script type="text/javascript" src="/js/dojo.js"></script>
<script type="text/javascript" src="/js/src/compat/0.2.2.js"></script>
<script type="text/javascript">
// <![CDATA[
  dojo.setModulePrefix('MochiKit', '/js/MochiKit');
  dojo.require('MochiKit.MochiKit');
// ]]>
<script>

おお。うまくうごいた

dojo のお作法的には

こうする。

<script type="text/javascript">
// <![CDATA[
  var djConfig = {
    compat: '0.2.2'
  };
// ]]>
</script>
<script type="text/javascript" src="/js/dojo.js"></script>
<script type="text/javascript">
// <![CDATA[
  dojo.setModulePrefix('MochiKit', '/js/MochiKit');
  dojo.require('MochiKit.MochiKit');
// ]]>
<script>

おお。うまくうごいた

めでたし、めでたし