gpt4 book ai didi

javascript - Requirejs 无法编译我的 dojo 依赖模块

转载 作者:搜寻专家 更新时间:2023-11-01 04:17:53 25 4
gpt4 key购买 nike

更新:我在下面尝试了 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)

更新 2:由于 Jeff 认为 Dojo 的插件与 RequireJS 不兼容是正确的,因此我决定改用 grunt-dojo。而不是 build 道场。我仍然在自己的代码中使用 RequireJS,并简单地覆盖要忽略的 dojo 依赖项。

原帖:

我正在尝试使用 grunt 来编译单个 JS 文件,以减少浏览器需要发出的 HTTP 请求量。由于 Dojo 1.9 是 AMD 兼容的,我想我会使用 Grunt 的 requirejs 插件来优化我的代码。但是,在使用 Grunt 插件和直接使用 r.js 时,我都收到以下错误:

>> Tracing dependencies for: mymodule/core
>> TypeError: Cannot call method 'createElement' of undefined
>> In module tree:
>> mymodule/core
>> dojo/behavior
>> dojo/query
>> dojo/selector/_loader
{ [Error: TypeError: Cannot call method 'createElement' of undefined
In module tree:
mymodule/core
dojo/behavior
dojo/query
dojo/selector/_loader

at eval (eval at <anonymous> (/Users/EugeneZ/Workspace/presentment/web/js/node_modules/grunt-contrib-requirejs/node_modules/requirejs/bin/r.js:23690:38), <anonymous>:6:24)
]
originalError:
{ [TypeError: Cannot call method 'createElement' of undefined]
moduleTree:
[ 'dojo/selector/_loader',
'dojo/query',
'dojo/behavior',
'mymodule/core' ],
fileName: '/Users/EugeneZ/Workspace/presentment/web/js/dojo_release/dojo/selector/_loader.js' } }

查看 _loader Dojo 模块的代码,假设它在浏览器中运行并依赖于 document 全局:

var document;
var testDiv = document.createElement("div");

但是为什么 requirejs 不允许这样做呢?我搜索了他们的文档,但找不到任何方法来关闭此检查。我假设我误解了什么或做错了什么,但无法弄清楚。

这是我的 Gruntfile.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 构建器/优化器不兼容。最好的办法是在 https://bugs.dojotoolkit.org 上记录问题让某人添加必要的插件 Hook ,以便解决这个问题。

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

如果你想继续使用 requirejs(就像我做的那样),另一个解决方法(直到 dojo 修复插件兼容),你可以从优化中排除使用这些 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 兼容是最终的解决方案,因此我们不需要做这个 hack。因此,即使您使用此解决方法,也请为 dojo 添加一个问题,以便一劳永逸地解决这个问题。提及您最终不得不排除的所有文件,以帮助开发人员了解要修复的内容。然后在这里发表评论让其他人 +1。

关于javascript - Requirejs 无法编译我的 dojo 依赖模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com