2014-11-23 3 views
0

Мне была предоставлена ​​библиотека дизайна из большого клиента сотрудничества, построенного с использованием Bootstrap 3 и Require.js. Он очень надежный и хорошо построенный с различными скриптами, используя Require.js для загрузки jQuery. Проблема в том, что Drupal уже загрузил jQuery, а двойная нагрузка приводит к сбою некоторых элементов. Если я удалю все вызовы Require.js, материал Drupal jQuery отлично работает. Если я удалю файл Drupal jQuery базы, все вещи, использующие материал Require.js, отлично работают. Вот варианты я рассмотрел:Drupal и Require.js не играют хорошо - двойная загрузка jQuery

  1. Stop JQuery от загрузки с Drupal, использование требует, чтобы загрузить JQuery на каждой странице - я не пробовал еще, но это только кажется неправильным. Я думаю, что я могу удалить jQuery с hook_library_alter() в моей теме? Удивление, если кто-то пробовал это ... Мои интерфейсные и административные экраны фактически используют две разные темы, поэтому я думаю, что мне придется изменить оба.
  2. Остановить jQuery от загрузки с помощью Require.js - я пробовал это, и ни одна из других библиотек, которые загружаются с require.js, не может найти запрос, если он не загружен Require.js, поэтому я не думаю, что этот параметр работает. Это мой первый раз с использованием require.js, так что, может быть, есть какое-то удовольствие для этого, я не понял?
  3. Добавить все библиотеки на сайт с помощью Drupal - Это похоже на массу грязной работы, так как мне пришлось бы удалить все зависимости require.js в библиотеке, и есть ожидание того, что мы не будем изменять библиотеку/фреймворк, так что внедрение новых выпусков легко.

Любые другие рекомендации?

UPDATE в ответ Никоса Параскевопулос:

Я установил Drupal, чтобы загрузить версию JQuery, поставляемой вместе с пакетом require.js и Drupal доволен этим. Так что теперь на каждой странице я нагружении в следующем порядке:

/components/jquery/jquery.js 
/misc/jquery.once.js 
/misc/drupal.js 
/components/requirejs/require.js 
/js/require.config.js 

Мой requires.config выглядит следующим образом:

requirejs.config({ 
    baseUrl: "./", 
    paths: { 
     ..... 
     jquery: 
     "components/jquery/jquery", "jquery-csv": "components/jquery-csv/src/jquery.csv", 
     "jqueryui-sortable-amd": "components/jqueryui-sortable-amd/js/jquery-ui-1.10.2.custom", 
     ..... 
    }, 
    shim: { 
     "jquery-backstretch": [ 
      "jquery" 
     ], 
     masonry: [ 
      "jquery" 
     ], 
     OpenLayers: { 
      exports: "OpenLayers" 
     }, 
     "jquery-csv": [ 
      "jquery" 
     ] 
    } 
}); 

Если удалить запись Jquery из путей, а также добавить:

jquery: { 
     exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME 
    } 

я сразу получаю ошибки, такие как:

Uncaught ошибка: ошибка сценария для: jqueryui-сортировкой-драм

Что имеет смысл, поскольку все они были объявлены вместе. uggg.

ответ

1

Что касается варианта 2:

Я не знаю, как точно все нагрузки, но я думаю Drupal нагрузки JQuery + другие вещи ему нужно, затем RequireJS загружен, который, в свою очередь, загружает свою собственную версию JQuery + другие вещи, в которых он нуждается.

Прежде всего, вы должны убедиться, что оба Drupal и ваше приложение RequireJS могут играть с той же версией jQuery. Затем в вашей конфигурации RequireJS shim jQuery вместо обычной загрузки, например.вместо:

require.config({ 
    ... 
    paths: { 
     // REMOVE THIS IF USED (PROBABLY IS) 
     jquery: 'lib/jquery-x.y.z' 
     ... 

Do:

require.config({ 
    ... 
    shim: { 
     jquery: { 
      exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME 
     } 
     ... 

Объяснение: Если Jquery загружается после RequireJS, она определяет себя как jquery (строчной Q). Это имя, используемое другими модулями, зависит от jQuery. С другой стороны, если он загружен до RequireJS, он не определяет itdelf, и вы остаетесь с глобальными глобальными (и, возможно, $). Прокладка выше указывает, что RequireJS использует глобальную переменную jQuery всякий раз, когда модуль зависит от модуля jquery, который, надеюсь, достигает того, что вы хотите, то есть загружаете jQuery только через Drupal.

Смежные вопросы