Requirejs domReady plugin vs Jquery $(документ).готов()?
я использую RequireJS и должен инициализировать что-то на DOM ready. Теперь RequireJS предоставляет domReady
плагин, но у нас уже есть в jQuery $(document).ready()
, который доступен для меня, так как я потребовал jQuery.
так что у меня есть два варианта:
-
использовать
domReady
плагин:require(['domReady'], function (domReady) { domReady(function () { // Do my stuff here... }); });
-
использовать
$(document).ready()
:$(document).ready(function() { // Do my stuff here... });
какой из них я должен выбрать, и зачем?
оба варианта, похоже, работают так, как ожидалось. Я не уверен в jQuery, потому что RequireJS делает свою магию; то есть, поскольку RequireJS будет динамически добавлять скрипты, я беспокоюсь, что DOM ready может произойти до загрузки всех динамически запрашиваемых скриптов. В то время как RequireJS добавит нагрузку на дополнительные JS только для domReady
когда у меня уже есть jQuery требуется.
вопросы
- почему RequireJS обеспечить
domReady
плагин, когда мы можем иметь jQuery$(document).ready();
? Я не вижу никакого преимущества в том, чтобы включить другую зависимость. - если его просто кормить нужно, то почему бы не предоставить один для кросс-браузера AJAX?
насколько я знаю, модуль, который требует domReady
не будет извлечен или выполнен после того, как документ будет готов, и вы можете сделать то же самое, требуя jQuery:
require(['jQuery'], function ($) {
$(document).ready(function () {
// Do my stuff here...
});
});
чтобы быть более ясным на мой вопрос: в чем разница между требованиями domReady
или jQuery
?
5 ответов:
кажется, все ключевые моменты уже были поражены, но несколько деталей упали через трещины. В основном:
domReady
это одновременно плагин и модуль. Если вы включаете его в массив требований w / A trailing
!
ваш модуль не будет выполняться, пока он не будет" безопасным " для взаимодействия с DOM:define(['domReady!'], function () { console.info('The DOM is ready before I happen'); });
обратите внимание, что загрузка и выполнение различны; Вы хотите, чтобы все ваши файлы загружались как можно скорее, это выполнение содержимого это важный момент.
если вы опустите
!
, тогда это просто обычный модуль, который является функцией, которая может принимать обратный вызов, который не будет выполняться до того, как DOM будет безопасно взаимодействовать с:define(['domReady'], function (domReady) { domReady(function () { console.info('The DOM is ready before I happen'); }); console.info('The DOM might not be ready before I happen'); });
преимущество при использовании domReady в качестве плагина
код, который зависит от модуля, который в свою очередь зависит от
domReady!
имеет очень значительное преимущество: ему не нужно ждать, пока DOM будет готов!сказать, что у нас есть блок кода, A, который зависит от модуля, B, который зависит от
domReady!
. Модуль B не завершит загрузку до того, как DOM будет готов. В свою очередь, не будет работать до загрузки.если вы используете
domReady
как обычный модуль в B, также было бы необходимо, чтобы A зависел отdomReady
, а также обертывание его кода внутриdomReady()
вызов функции.кроме того, это означает, что
domReady!
пользуется тем же преимуществом над$(document).ready()
.Re различия между domReady и $(документ).готов()
оба вынюхивают, готов ли / когда DOM по существу одинаково.
снова опасаясь стрельбы с jQuery в самый неподходящий момент
jQuery будет запускать любой готовый обратный вызов, даже если DOM загружается до jQuery (ваш код не должен заботиться о том, что происходит первым.).
попытка ответить на ваш главный вопрос:
почему
requirejs
предоставляетdomReady
плагин, когда мы можем иметь jquery$(document).ready();
?они делают две разные вещи, на самом деле. RequireJS'
domReady
зависимость означает, что этот модуль требует полной загрузки DOM перед его запуском (и поэтому может быть найден в любом количестве модулей в вашем приложении, если вы этого хотите), в то время как$(document).ready()
вместо этого запускает функции обратного вызова когда DOM закончит загрузку.разница может показаться тонкой, но подумайте об этом: у меня есть модуль, который должен быть каким-то образом связан с DOM, поэтому я могу зависеть от
domReady
и соедините его во время определения модуля, или поставьте$(document).ready()
в конце его с обратным вызовом функции init для модуля. Я бы назвал первый подход чище.между тем, если у меня есть событие, которое должно произойти прямо, как DOM готов, то
$(document).ready()
событие будет go-to, поскольку это, в частности, не зависит от выполнения модулей загрузки RequireJS, при условии, что выполняются зависимости кода, из которого вы его вызываете.также стоит учитывать, что вы не обязательно используете RequireJS с jQuery. Любой библиотечный модуль, который нуждается в доступе DOM (но не полагается на jQuery), будет по-прежнему полезен с помощью
domReady
.
отвечая на ваши пули в порядок внешний вид:
- Они оба делают то же самое
- Если у вас есть оговорки о jquery по какой-либо причине, то используйте domReady
- правильно, так что просто используйте jQuery
- потому что не все используют jQuery
- Я согласен, просто используйте jQuery
- Плагины по определению 'кормить надо'.
- Кросс-браузер ajax-это не вещь. Кросс-Домен? Вероятно, есть, и если есть нет, то есть нет необходимости, чтобы накормить.
- , -, -, - ОК
когда дело доходит до этого, вы слишком много думаете об этом. Это механизм для выполнения javascript на domReady. Если бы у вас не было jQuery, я бы защищал плагин domReady. Поскольку у вас есть jQuery, то не загружайте больше скриптов, чтобы сделать что-то, что уже доступно.
Обновить Ясности
плагин domReady собирает функций, чтобы позвонить, когда документ "готов". Если он уже загружен, то они выполняются немедленно.
JQuery собирает функции и связывает a отложенный объект чтобы дом был "готов". Когда dom будет готов, отложенный объект будет разрешен, и функции будут запущены. Если dom уже "готов", то отложенный уже будет разрешен, поэтому функция будет выполняться немедленно.
Это означает, что фактически они делают то же самое.
после некоторых экспериментов с requirejs с несколькими модулями я предлагаю использовать domReady.
Я заметил, что функция, связанная с $(документ).готовый.(..) не вызывается, когда несколько модулей загружаются requirejs. Я подозреваю, что dom готовится до того, как будет выполнен весь код requirejs, и обработчик обратного вызова jQuery ready вызывается до того, как он будет связан с пользовательской функцией, т. е. в коде основного модуля.
require(['jquery', 'underscore', 'text!some_template.html', './my_module_1', './my_module_2', 'domReady', 'other_dependency_1', 'other_dependency_2' ], function($, _, someTemplate, myModule1, myModule2, domReady) { $(document).ready(function() { console.info('This might never be executed.'); console.info('Dom might get ready before requirejs would load modules.'); }); domReady(function () { console.info('This runs when the dom gets ready and modules are loaded.'); }); });
Я обнаружил, что делаю это как часть основной записи, чтобы весь мой javascript был гарантирован, что DOM готов и jQuery загружен. Не уверен, насколько это здорово, поэтому приветствую любую обратную связь, но вот моя главная.js:
require(['domReady!'], function(domReady){ console.log('dom is ready'); require(['jquery', 'bootstrap'], function(){ console.log('jquery loaded'); require(['app'], function(app){ console.log('app loaded'); }); }); });