修复Dojo和JQuery的多个依赖库通过Javascript定义冲突

6ss1mwsb  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(174)

这个问题以前已经回答过很多次了,我知道一个解决方案是简单地改变它,这样(Esri的)dojo是最后加载的。
问题是我正在处理一个模块化的小部件,它不能访问页面的html来改变顺序,我必须只通过Dojo的AMD加载器加载库。
文件夹结构:

/Widget
--/Main.js
--/Datatable.js

这是Main.js文件:

define([
  './Datatable', 
  'https://code.jquery.com/jquery-3.3.1.min.js',
  'https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.bundle.js',
  ],
function(Datatable){ ... }

和Datatable.js(只是我为组织创建的另一个模块):

define([
    'https://cdn.datatables.net/v/bs4/dt-1.10.18/r-2.2.2/datatables.min.js'
    ],function(){ ... }

我在这里有两个主要问题:
1)AMD加载程序是异步的,并且不解析非AMD模块依赖项,这意味着顺序应该很重要
datatables.min.js需要bootstrap.bundle.js,而bootstrap.bundle.js需要jquery-3.3.1.min.js
所以,如果我幸运的请求将加载顺序取决于延迟,不是很可靠...
2)Bootstrap和Datatable通用javascript文件都引发了一个“multipleDefine”错误,可能是因为它们试图定义“jquery”,我真的不知道如何修复这个错误(拥有一个本地编辑的副本并不理想)
如何解决这两个问题?

xurqigkl

xurqigkl1#

对于订单,您可以执行以下操作:

require(['https://code.jquery.com/jquery-3.3.1.min.js'], function() {
    require(['https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.bundle.js'], function() {
        define(['./Datatable'], function(Datatable){ ... }
    });
});

这将强制按特定顺序执行决议。
当两个组件尝试在全局范围(这里是window)上创建函数define时,会引发multipleDefine错误。
很难给予一个完美的答案。
如果你能装个小提琴之类的东西,我就能看得更清楚。
我想到一件事:你可以尝试delete window.define的权利之前,加载的文件抛出的错误之一...但这是丑陋的,甚至可能不工作...

相关问题