无法使用 RequireJs 加载 Dojo 模块

Posted

技术标签:

【中文标题】无法使用 RequireJs 加载 Dojo 模块【英文标题】:Cannot load Dojo modules with RequireJs 【发布时间】:2012-10-13 19:11:06 【问题描述】:

我认为我缺少一些东西。我已经读到您可以使用 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);

提前致谢!

【问题讨论】:

相当老的帖子,但我想知道你是否加载过requirejs和dojo 【参考方案1】:

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

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

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

这样做已经为我解决了这个问题。

Further info

【讨论】:

【参考方案2】:

将你所有的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);

就是这样。

【讨论】:

【参考方案3】:

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

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

然后,您应该检查您的 devtools 网络选项卡,以确保 require.js 正在加载正确的文件并且路径正确。请记住,location 相对于 baseUrl

希望有帮助!

【讨论】:

包配置不应该是一个包含包参数的对象数组吗?而且我知道该位置是相对于 baseUrl 的。在我的示例中,“dojo”应该加载 js/lib/dojo/main.js。但是 dojo 对象的值是“未定义”... 好吧,如果你不需要特殊设置,你可以在配置中定义name,否则你需要一个对象:require.config( packages: [ "cart", 名称:“商店”,主要:“商店”]);【参考方案4】:

_3 表明您正在使用缩小的、独立的 dojo 发行版。如果你想通过不同的加载器使用 Dojo,我相信你想使用从 their download page 下载的 Source/SDK。

【讨论】:

以上是关于无法使用 RequireJs 加载 Dojo 模块的主要内容,如果未能解决你的问题,请参考以下文章

带有 requirejs/AMD 的 Webpack

无法使用实习生对依赖于 dojo 1.x 的模块运行单元测试

什么是AMD规范

如何使用 TypeScript 加载 dojo 模块

使用包时RequireJS模块加载超时

RequireJS