multipleDefine:Dojo AMD加载程序与VideoJS库冲突

时间:2018-01-18 08:30:34

标签: javascript dojo video.js loader amd

我想升级到最新的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;
&#13;
&#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...

enter image description here

我不知道评论args[0]是否可能是一个线索,但我认为referenceModule的测试失败并且它落在multipleDefine上导致了问题。在此之后不久,将记录dojo/parser,并在抛出状态时检查状态的详细信息,显示it

enter image description here

0 个答案:

没有答案