Requirejs domReady plugin vs Jquery $(документ).готов()?


я использую RequireJS и должен инициализировать что-то на DOM ready. Теперь RequireJS предоставляет domReady плагин, но у нас уже есть в jQuery $(document).ready(), который доступен для меня, так как я потребовал jQuery.

так что у меня есть два варианта:

  1. использовать domReady плагин:

    require(['domReady'], function (domReady) {
        domReady(function () {
            // Do my stuff here...
        });
    });
    
  2. использовать $(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 96

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');
        });
    });
});