Устранение конфликта множественных определений зависимых библиотек Dojo и JQuery с помощью Javascript

На этот вопрос уже отвечали много раз, и я знаю, что одно из решений - просто изменить его, чтобы додзё (Esri) загружалось последним.

Проблема в том, что я работаю над модульным виджетом, у которого нет доступа к HTML-коду страницы для изменения порядка, я должен загружать библиотеки только через AMD Loader Dojo.

Структура папки:

/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, для которого требуется jquery-3.3.1.min.js

Итак, если мне повезет, запрос будет загружаться по порядку в зависимости от задержки, что не очень надежно...

2) Общие файлы javascript Bootstrap и Datatable вызывают ошибку «multipleDefine», вероятно, из-за того, что они пытаются определить «jquery», я действительно не уверен, как это исправить (иметь локальную отредактированную копию их не было бы идеальным )

Как я могу решить эти 2 проблемы?


person Mojimi    schedule 06.07.2018    source источник


Ответы (1)


Для заказа вы, вероятно, можете сделать что-то вроде:

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){ ... }
    });
});

Что приведет к разрешению в определенном порядке.
Ошибка multipleDefine возникает, когда два компонента пытаются создать функцию define в глобальной области (здесь window).
Довольно сложно дать точный ответ. на этом.
Если вы можете настроить скрипку или что-то подобное, я мог бы посмотреть глубже.
Одна вещь, которая приходит мне на ум: вы можете попробовать delete window.define прямо перед загрузкой одного из файлов, которые вызывают ошибка... Но это некрасиво и может даже не сработать...

person ben    schedule 16.07.2018
comment
Да, мне пришлось изменить файлы локально, удалив часть window.define, я действительно не уверен, возможен ли какой-либо другой способ. - person Mojimi; 16.07.2018
comment
Только один вопрос: чтобы определить модуль Dojo, не нужно ли начинать с определения? Поскольку таким образом он начинается с требований, на мой взгляд, мне нужно было бы связать определения, но это тоже не сработало. - person Mojimi; 28.07.2018
comment
Вам нужно определить сам компонент, но вы можете обернуть его в require. Я использовал этот трюк много раз - person ben; 29.07.2018