Требовать domReady плагин против JQuery $(document).ready()?
Я использую RequireJS и вам нужно инициализировать что-то в DOM. Теперь 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 может произойти до загрузки всех динамически запрошенных скриптов. В то время как RequireJS добавит нагрузку на дополнительную JS только для domReady
, когда у меня уже есть jQuery.
Вопросы
- Почему RequJS предоставляет плагин
domReady
, когда мы можем иметь jQuery $(document).ready();
? Я не вижу никаких преимуществ от включения другой зависимости.
- Если это просто для того, чтобы удовлетворить потребность, то почему бы не предоставить один для кросс-браузерного AJAX?
Насколько мне известно, модуль, который требует domReady
, не будет извлечен или выполнен после того, как документ будет готов, и вы можете сделать то же самое, что и jQuery:
require(['jQuery'], function ($) {
$(document).ready(function () {
// Do my stuff here...
});
});
Чтобы яснее ответить на мой вопрос: какая разница между требованием domReady
или jQuery
?
Ответы
Ответ 1
Кажется, что все ключевые моменты уже были поражены, но несколько деталей провалились сквозь трещины. Главным образом:
domReady
Это и плагин, и модуль. Если вы включите его в массив требований w/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. В свою очередь, A не будет работать до загрузки B.
Если бы вы использовали domReady
как обычный модуль в B, также было бы необходимо, чтобы A зависел от domReady
, а также обернул его код внутри вызова функции domReady()
.
Кроме того, это означает, что domReady!
пользуется тем же преимуществом по сравнению с $(document).ready()
.
Повторите разницу между domReady и $(document).ready()
Оба вынюхивают, будет ли/когда DOM готов по существу таким же образом.
Попытайтесь стрелять в jQuery в неподходящее время
jQuery будет запускать любой готовый обратный вызов, даже если DOM загружается до того, как выполняется jQuery (ваш код не должен заботиться о том, что происходит в первую очередь.).
Ответ 2
Попытка ответить на ваш основной вопрос:
Почему requirejs
предоставляет плагин domReady
, когда мы можем иметь jquery $(document).ready();
?
На самом деле они делают две разные вещи. RequireJS 'domReady
означает, что этот модуль требует, чтобы DOM был полностью загружен до его запуска (и поэтому его можно найти в любом количестве модулей в вашем приложении, если вы этого желаете), в то время как $(document).ready()
вместо этого отключает его функции обратного вызова, когда DOM загружается.
Разница может казаться тонкой, но подумайте об этом: у меня есть модуль, который каким-то образом должен быть связан с DOM, поэтому я могу либо зависеть от domReady
, либо связывать его с временем определения модуля, либо указывать a $(document).ready()
в конце его с обратным вызовом функции init для модуля. Я бы назвал первый подход чище.
Между тем, если у меня есть событие, которое должно произойти правильно, так как DOM готов, событие $(document).ready()
было бы go-to, поскольку это, в частности, не зависит от того, что RequireJS выполняется, загружая модули, при условии, что зависимости кода, из которого вы его вызываете.
Также стоит учитывать, что вы не обязательно используете RequireJS с jQuery. Любой библиотечный модуль, который нуждается в доступе DOM (но не полагается на jQuery), по-прежнему будет полезен с помощью domReady
.
Ответ 3
Отвечая на ваши пули в порядке появления:
- Они оба выполняют одно и то же
- Если у вас есть оговорки о jquery по любой причине, используйте domReady
- Правильно, поэтому просто используйте jQuery
- Поскольку не все используют jQuery
- Я согласен, просто используйте jQuery
- Плагины по определению 'feed a need'.
- Cross Browser ajax - это не вещь. Перекрестный домен? Вероятно, есть, и если нет, тогда нет необходимости кормить.
- -, -, - Ok
Когда дело доходит до этого, вы слишком задумываетесь об этом. Это механизм для запуска javascript на domReady. Если у вас не было jQuery, я бы отстаивал плагин domReady. Поскольку у вас есть jQuery, не загружайте больше скриптов, чтобы сделать что-то, что уже доступно.
Обновление Clarity
Плагин domReady собирает функции для вызова, когда документ "готов". Если он уже загружен, они выполняются немедленно.
JQuery собирает функции и связывает отложенный объект, чтобы dom был "готов". Когда dom будет готов, отложенный объект будет разрешен, и функции будут срабатывать. Если dom уже "готов", отложенные будут уже решены, поэтому функция будет выполняться немедленно.
Это означает, что эффективно они делают то же самое.
Ответ 4
После некоторых экспериментов с requirejs с несколькими модулями я предлагаю использовать domReady.
Я заметил, что функция, связанная с $(document).ready(...), не вызывается, когда несколько модулей загружаются requirejs. Я подозреваю, что dom готовится до того, как выполняется весь код requirejs, и обработчик обратного вызова jquery готов к вызову до того, как он будет связан с пользовательской функцией, то есть внутри основного кода модуля.
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.');
});
});
Ответ 5
Я обнаружил, что я делаю это как часть основной записи, так что всем моим javascript гарантируется, что DOM готов и загружен jquery. Не уверен, как здорово это так приветствовать любую обратную связь, но вот мой main.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');
});
});
});