无法使用 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 模块的主要内容,如果未能解决你的问题,请参考以下文章