- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
更新:我在下面尝试了 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/
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!