2013-12-19 3 views
0

Мы создали платформу, похожую на shopify, в которой размещаем клиентские веб-страницы для электронной коммерции.Require.JS + JQuery Plugins + Клиент, размещенный в конфликте JQuery

На каждой странице у нас есть javascript платформы, который загружается через requireJS.

Эта платформа javascript использует jquery Cookie в качестве плагина.

Если клиент также устанавливает jQuery, это может привести к тому, что плагин Cookie будет установлен непосредственно на экземпляр jQuery клиентов, а не на наш экземпляр jQuery.

HTML клиент:

<script type="text/javascript" src="/jquery.js"></script> 

app.js [наш код]:

require.config({ 
    "paths": { 
     "jquery": "bower_components/jquery/jquery.min", 
     "jquery-cookie": "bower_components/jquery-cookie/jquery.cookie", 
    }, 
    "shim": { 
     "jquery-cookie": ["jquery"] 
    } 
}); 

platform.js [наш код]:

define(['jquery', 'jquerye-cookie'], function(jQuery, jQueryCookie) { 
    console.dir(jQuery.cookie); // <-- Not available, sometimes 
}); 

Вы можете увидеть на консоли .dir иногда jQuery.cookie не будет доступен, потому что jQuery cookie устанавливает себя в глобальный $, который может быть версией клиента j Запрос или наш.

Единственное исправление, которое у меня действительно есть, - это скомпилированная версия нашей платформы js в любое время. В производстве это прекрасно, так как наш код скомпилирован вместе и включает в себя нашу зависимость jQuery нашего кода, порядок выполнения детерминирован и при загрузке jQuery cookie устанавливается в правильный объект jQuery.

Проблема заключается в разработке, это PITA, чтобы работать только на скомпилированной версии нашей платформы js. Просто время компиляции немного замедляет нас.

Я обсуждаю попытку удалить всю зависимость jQuery в нашей платформе JS. Я не хочу этого делать, так как потеряю петрушку. Есть ли лучшее решение, чтобы избежать этой проблемы?

Update:

режим noconflict не будет работать, так как JQuery куки (и других плагинов JQuery) работа:

(function ($, document, undefined) { 
    $.cookie = function (key, value, options) { 
    }); 
})(jQuery, document); 

Так как вы можете видеть, даже если я повторно пространство имен нашего JQuery что-то вроде «платформы $», плагин по-прежнему будет загружаться в window.jQuery, который будет либо неопределенным, либо версией jQuery клиента.

Edit:

Чтобы быть ясно, что это не "а" клиент, то многие (в конечном счете, тысячи, надеюсь).

+0

Использует ли клиент RequireJS вообще? – Louis

+0

Возможно - но, вообще говоря, нет. – amirpc

ответ

0

Вы разрешаете клиентам добавлять любой HTML-контент на страницу ...? В общем, это плохая идея по соображениям безопасности, плюс ситуации вроде этого, когда совершенно невинный пользователь случайно разбивает ваш сайт. Вы можете попробовать запустить jquery в режиме noconflict http://learn.jquery.com/using-jquery-core/avoid-conflicts-other-libraries/, но если клиент может войти в любой старый javascript, всегда будут способы, которыми они могут разбить javascript вашего сайта. Поэтому я думаю, что реальный ответ будет заключаться в том, чтобы ограничить доступность клиентов.

+0

Отредактировал мой вопрос, чтобы показать, почему я не думаю, что noconflict может работать. Мы пытаемся предоставить клиенту полный контроль над своей платформой и признать, что есть способы, которыми они могут сломать свой сайт и вмешиваться в нашу платформу js. Однако они не могут разбить JUST, включив jQuery. Опять же, это только проблема в режиме dev, в производстве мы просто скомпилируем нашу JS, и невозможно совместить пространства имен jQuery. – amirpc

1

Когда я смотрю current code для плагина cookie jQuery, я вижу, что он обнаруживает, что он работает в загрузчике в стиле AMD (который требует RequireJS) и использует define. Это означает, что для этого плагина не требуется прокладка.

Теперь, как может произойти сбой в вопросе?

  • Клиент также использует RequireJS для своего кода. Это означает, что две переменные передаются в RequireJS. Они могут столкнуться. RequireJS не предназначен для обнаружения таких столкновений. (Пока результирующая конфигурация имеет смысл для RequireJS, она не будет жаловаться.) И в зависимости от того, как выполняется загрузка двух конфигураций, результат может быть неопределенным.

  • Клиент не использует RequireJS для своего кода. Если этот клиент также включает плагин cookie jQuery в своем собственном коде, это, вероятно, создаст проблемы, потому что нет никакой информации о том, что значение $ будет в то время, когда будет загружена их версия плагина.

+0

Это всего лишь опечатка в моем коде, который я отправил в stackoverflow. Я исправлю это. Фактический код не имеет этой опечатки. Как я уже сказал, проблема заключается в прерывистом сбое, и обращение к неправильному пути jquery приведет к 100% -му сбою, не прерывистому. У меня есть проблема с этой проблемой, я очень уверен, что это так, как я описал, а не надзор с моими именами переменных. – amirpc

+0

Что вы ** знаете, может быть, правда, что вы можете сделать вывод о том, что описанный мной сбой был бы 100%, но с объемом информации, которую вы предоставили в вопросе, нет никакого способа, чтобы ** мы ** можем сделать этот вывод. Например, если ваш клиент * имеет * файл с именем '' jquery.cookie'', расположенный в правильном каталоге (в конце концов, многие люди его используют), RequireJS загрузит его. Во всяком случае, я обновил свой ответ с дальнейшими мыслями. – Louis

+0

Отличная игра с версией jQuery cookie. Мы только что поняли, что наша беседка настроена для jquery-cookie 1.2, которая не делала проверку AMD. Я обновил до 1.4, что должно помочь в этом. Теперь единственная проблема заключается в том, что parsleyjs не выполняет ту же проверку. Таким образом, у нас по-прежнему есть такая же проблема с петрушкой. Я думаю, что в это время лучше всего сделать только петрушку fork для наших нужд и заставить ее правильно играть с требованием. – amirpc

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