我想升级到最新的https://videojs.com版本,但它现在使用AMD加载程序,这导致在使用Dojo的同时遇到麻烦。我如何同时使用这两个库,或者目前是不可能的?
简单地包括dojo.js和video.js以及调用require()本身会导致崩溃:
<script src="//vjs.zencdn.net/5.4.6/video.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.12.3/dojo/dojo.js"></script>
<div>Watch the console for multipleDefine errors.</div>
&#13;
<!DOCTYPE html>
<head>
<script src="../lib/dojo-premierrange/dojo/dojo.js"></script>
<script src="//vjs.zencdn.net/5.4.6/video.js"></script>
</head>
<body>
<script>
require(['dojo/parser'], function (parser) {
parser.parse();
});
</script>
</body>
&#13;
由于某种原因,堆栈溢出Snippet不会产生此错误..但CodePen中的代码与Chromium和Firefox中的代码相同:https://codepen.io/neekfenwick/pen/xpQrbG?editors=1010
或等效的独立测试文件(稍后在我的屏幕截图中使用):
Error: multipleDefine
at c (VM289 dojo.js:9)
at Na (VM289 dojo.js:30)
at VM289 dojo.js:31
at d (VM289 dojo.js:8)
at ab (VM289 dojo.js:31)
at r (VM289 dojo.js:28)
at HTMLScriptElement.<anonymous> (VM289 dojo.js:33)
记录的错误消息:
function(f) {
if (typeof exports === "object" && typeof module !== "undefined") {
module.exports = f()
} else if (typeof define === "function" && define.amd) {
define([], f)
} else {
var g;
if (typeof window !== "undefined") {
g = window
} else if (typeof global !== "undefined") {
g = global
} else if (typeof self !== "undefined") {
g = self
} else {
g = this
}
g.videojs = f()
}
}
看起来麻烦的是,video.js有一系列的嗅探,它试图检测一个预先存在的AMD加载器,它成功找到了Dojo,但后来调用了一个空数组:
define([], f)
第5行 runDefQ = function(referenceModule, mids){
// defQ is an array of [id, dependencies, factory]
// mids (if any) is a vector of mids given by a combo service
var definedModules = [],
module, args;
while(defQ.length){
args = defQ.shift();
mids && (args[0]= mids.shift());
// explicit define indicates possible multiple modules in a single file; delay injecting dependencies until defQ fully
// processed since modules earlier in the queue depend on already-arrived modules that are later in the queue
// TODO: what if no args[0] and no referenceModule
module = (args[0] && getModule(args[0])) || referenceModule;
definedModules.push([module, args[1], args[2]]);
}
consumePendingCacheInsert(referenceModule);
forEach(definedModules, function(args){
injectDependencies(defineModule.apply(null, args));
});
};
似乎是个问题。最终结果是dojo的加载器中的情况,defQ有一个空元素,所以这段代码:
args[0]
最终module =
为空,这导致dojo/parser
行分配referenceModule,在我的情况下dojo/parser
..但multipleDefine
已经加载,并且所以记录了explicit define indicates...
。
我不知道评论args[0]
是否可能是一个线索,但我认为referenceModule
的测试失败并且它落在multipleDefine
上导致了问题。在此之后不久,将记录dojo/parser
,并在抛出状态时检查状态的详细信息,显示it
。