无法使用RequireJs加载Dojo模块

时间:2012-10-13 19:11:06

标签: javascript module dojo requirejs amd

我认为我缺少一些东西。我已经读过你可以使用RequireJS而不是使用Dojo加载器来使用dojo模块。我对RequireJS和定义模块感到满意,但我似乎无法弄清楚发生了什么。我查看了dojo js文件,发现他们使用的是define(),就像我声明自己的模块一样。我的文件组织如下

// File path
-js
    main.js
    - lib
        .require.js
        -dojo
            // All dojo files

我不确定我缺少什么,但是当我尝试加载Dojo模块时,该值未定义。 下面是一些示例HTML:

// index.html
<html>
    <head>
    </head>
    <body>
        // include require script & set main.js
        <script data-main="js/main" src="js/lib/require.js"></script>
    </body>
</html>

和示例main.js文件......

    // Sample main.js file

    // BaseUrl = js/

    require.config({
        packages : [
            name     : 'dojo',
            location : 'lib/dojo';
        ]
    });

    require(['dojo', 'dojo/dom'], function(dojo, dom) {

        // 'dojo'     should load dojo/main.js
        // 'dojo/dom' should load dojo/dom.js

        // But they have a value of "undefined" when I look at them in the console
        console.log(dojo);
    });

任何想法我做错了什么?作为附注,有时我在控制台中出现此错误

TypeError: _3.add is not a function
[Break On This Error]   

_3.add("dom-addeventlistener",!!document.addEventListener);

提前致谢!

4 个答案:

答案 0 :(得分:1)

_3.add("dom-addeventlistener",!!document.addEventListener);实际上是has.add("dom-addeventlistener", !!document.addEventListener);

错误_3.add is not a function是由于与dojo的AMD实现不同的requirejs没有定义has.js API。 Dojo尝试从AMD加载器中提取has.js实现。如果使用外部加载程序,则必须通过dojoConfig指示它。运行缩小的构建时,您需要将staticHasFeatures添加到构建配置文件:

staticHasFeatures: {
    "dojo-has-api": 0 // default 1
}

这样做解决了我的问题。

Further info

答案 1 :(得分:1)

将所有dojo文件放在js文件夹中。

您的文件夹结构应该像

// Folder structure
-js
    -dojo
    -dijit
    -dojox

注意:确保您提供对js / *路径的访问权限。所以网址:http://localhost:8080/app/js/dojo/dojo.js可以访问。

然后使用requireJS使用以下脚本添加dojo模块,

setTimeout(

    function() {
        var dojoConfig = {
            async : true
        };

    require.config({
        packages : 
            [ {
                name : 'dojo',
                location : '../js/dojo'
            } ],    
    });

    require(
        [ 'dojo', 'dojo/dom' ],
        function(dojo, dom) {
            console.log(dojo);
            dom.byId("myDiv").innerHTML = "updatedHTML content";
    });

}, 1000);

就是这样。

答案 2 :(得分:0)

首先,您的包配置定义是一个对象数组:

require.config({
    packages : [
        {
            name     : 'dojo',
            location : 'lib/dojo';
        }
    ]
});

之后,你应该检查你的devtools网络选项卡,以确保require.js正在加载正确的文件并且路径是好的。请注意,location相对于baseUrl

希望这有帮助!

答案 3 :(得分:0)

_3表示您正在使用dojo的缩小的独立分发。如果您想将Dojo与其他加载器一起使用,我相信您希望使用their download page中的Source / SDK下载。