Javascript Requirejs可以';t编译依赖于dojo的模块

Javascript Requirejs可以';t编译依赖于dojo的模块,javascript,dojo,requirejs,Javascript,Dojo,Requirejs,更新:我尝试了下面Jeff Barczewski的答案,虽然我不再得到下面插件的错误,但我现在得到了一个不同的错误: Error: TypeError: Cannot read property 'normalize' of undefined In module tree: mymodule/core at Object.<anonymous> (/usr/local/lib/node_modules/requirejs/bin/r.js:1193:35) 但是

更新:我尝试了下面Jeff Barczewski的答案,虽然我不再得到下面插件的错误,但我现在得到了一个不同的错误:

Error: TypeError: Cannot read property 'normalize' of undefined
In module tree:
    mymodule/core

    at Object.<anonymous> (/usr/local/lib/node_modules/requirejs/bin/r.js:1193:35)
但是为什么requirejs不允许这样做呢?我已经搜索了他们的文档,找不到任何方法关闭此检查。我假设我误解了什么或做了什么错事,但无法理解

以下是我的Grunfile.js中与requirejs相关的部分:

    requirejs: {
        compile: {
            options: {
                'baseUrl': './',
                'paths': {
                    'dojo': 'dojo_release/dojo',
                    'dojox': 'dojo_release/dojox',
                    'dijit': 'dojo_release/dijit',
                    'mymodule' : 'core/mymodule',
                    'osi': 'osi',
                    'demo': 'demo',
                    'slick': 'core/slick'
                },
                'name': 'mymodule/core',
                'out': './mymodule.js'
            }
        }
    }

Dojo使用的几个插件与r.js构建器/优化器不兼容。最好的办法是登录一个问题,让某人添加必要的插件挂钩,这样就可以解决这个问题

另一种方法是切换到使用dojo builder,但它似乎无法创建requirejs可以使用的代码,因此您也需要使用它们的加载程序,而不是requirejs。(dojo builder使用一些专有的?
{cache:…}
选项来执行其依赖项,而不仅仅是内联定义,因此我无法找到使用requirejs构建和加载的方法)

另一个解决方法(直到dojo将插件修复为兼容)如果您想继续使用requirejs(就像我所做的那样),您可以从优化中排除使用这些dojo插件的文件,只需单独加载这些未优化的文件。因此,除了使用这些插件的文件外,大多数文件都可以优化。这并不完美,但它能让你更亲近。Requirejs将以优化的方式加载大多数文件,然后在运行时单独获取那些被排除的文件

要做到这一点,请在r.js build.js中添加使用错误插件的特定文件的排除项。因此,在运行构建并获得该错误后,将使用插件的文件添加到路径中,即堆栈跟踪中倒数第二个文件

因此,添加到r.js构建选项中

paths: { 
  'dojo/query': 'empty:', // this will exclude it from the build
然后再次运行您的构建并重复,直到您获得所有其他出现错误的文件

当我试图构建dojo的dgrid时,我最终得到了以下排除:

paths: {
    // r.js having issues building these, the plugins are not
    // compatible so let them load normally unoptimized
    'dgrid/extensions/ColumnHider': 'empty:',
    'put-selector/put': 'empty:'
    'dojo/i18n': 'empty:',
    'dojo/selector/_loader': 'empty:',
    'dojo/query': 'empty:',
    'dgrid/extensions/ColumnResizer': 'empty:',
    'dgrid/List': 'empty:',
    'xstyle/css': 'empty:'
您的列表可能因您使用的内容而异

然后,只要在运行时让这些文件(及其依赖项)可用,requirejs就会像在开发中一样加载它们。因此,至少大多数文件都将从一个文件中优化加载,然后再加载这些文件


注意:要求dojo使插件r.js builder/optimizer兼容是最终的解决方案,因此我们不需要进行这种攻击。因此,即使您使用此解决方案,也请为dojo添加一个问题,以便能够一次性解决此问题。提及所有您最终不得不排除的文件,以帮助开发人员知道要修复什么。然后在这里向+1发表评论。

谢谢,这让我更进一步。当我有机会的时候,我会跟进dojo bug追踪器。但是,我仍然会遇到错误:Error:TypeError:cannotread r.js:1193:35上未定义的属性'normalize'。当我删除指定模块对插件的依赖关系时,该模块的错误消失,但下一个具有插件依赖关系的模块仍然存在。选择此答案是因为Dojo插件尚未与RequireJS builder兼容是正确的。然而,我的解决方案是使用来代替dojo构建。您是否找到了“无法读取未定义属性‘normalize’的问题”的解决方案?我没有。最后,我不得不退一步问自己为什么要使用r.js。我最终使用了dojo builder,它无论如何都要强大得多,尽管它也要复杂得多,这正是我最初试图避免的。
paths: { 
  'dojo/query': 'empty:', // this will exclude it from the build
paths: {
    // r.js having issues building these, the plugins are not
    // compatible so let them load normally unoptimized
    'dgrid/extensions/ColumnHider': 'empty:',
    'put-selector/put': 'empty:'
    'dojo/i18n': 'empty:',
    'dojo/selector/_loader': 'empty:',
    'dojo/query': 'empty:',
    'dgrid/extensions/ColumnResizer': 'empty:',
    'dgrid/List': 'empty:',
    'xstyle/css': 'empty:'