Requirejs domReady插件vs Jquery $(document).ready()?

我使用的是RequireJS,需要在DOM上准备好一些东西。 现在,RequireJS提供了domReady插件 ,但是我们已经有了jQuery的$(document).ready() ,因为我需要jQuery,所以我可以使用它。

所以我有两个select:

  1. 使用domReady插件:

     require(['domReady'], function (domReady) { domReady(function () { // Do my stuff here... }); }); 
  2. 使用$(document).ready()

     $(document).ready(function() { // Do my stuff here... }); 

我应该select哪一个,为什么?

这两个选项似乎按预期工作。 我对jQuery没有信心,因为RequireJS正在做它的魔法; 也就是说,因为RequireJS会dynamic地添加脚本,所以我担心在加载所有dynamic请求的脚本之前DOM就绪可能会发生。 而RequireJS会在我已经有jQuery需求的时候为domReady增加额外的JS负担。

问题

  • 为什么RequireJS提供了一个domReady插件,当我们可以有jQuery的$(document).ready(); ? 我没有看到包括其他依赖项的任何优势。
  • 如果只是为了满足需求,那么为什么不提供一个用于跨浏览器的AJAX呢?

据我所知,一个需要domReady的模块在文档准备就绪之后不会被获取或执行,你也可以做同样的要求jQuery:

 require(['jQuery'], function ($) { $(document).ready(function () { // Do my stuff here... }); }); 

要更清楚我的问题: 要求domReadyjQuery之间有什么区别?

似乎所有的关键点已经被打破,但一些细节通过裂缝。 主要是:

domready中

它既是一个插件,也是一个模块。 如果您将它包含在需求数组中,并带有拖尾! 您的模块将不会执行,直到与DOM进行交互为止“安全”:

 define(['domReady!'], function () { console.info('The DOM is ready before I happen'); }); 

请注意,加载和执行是不同的; 你想要所有的文件尽快加载,这是对时间敏感的内容的执行。

如果你省略了! ,那么它只是一个正常的模块,它恰好是一个函数,它可以在DOM可以安全地与之交互之前执行一个不会执行的callback:

 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!的模块的代码domReady! 有一个非常显着的优势:它不需要等待DOM准备就绪!

假设我们有一块代码A,依赖于一个模块B,依赖于domReady! 。 模块B在DOM准备好之前不会完成加载。 反过来,A在B加载之前不会运行。

如果你要在D中使用domReady作为一个常规模块,那么A依赖于domReady以及在domReady()函数调用中包装它的代码也是必要的。

而且,这意味着domReady!$(document).ready()享有同样的优势。

重新domReady和$(document).ready()之间的区别

两者都以基本相同的方式嗅探DOM / DOM何时准备就绪。

不要害怕jQuery在错误的时间开火

即使在jQuery之前加载DOM,jQuery也会触发任何已经准备好的callback(你的代码不应该在意第一个会发生什么)。

试图回答你的主要问题:

为什么requirejs提供了一个domReady插件,当我们可以有jQuery的$(document).ready();

他们真的做了两件不同的事情。 RequireJS的domReady依赖关系表示这个模块需要在运行之前完全加载DOM(因此,如果你愿意,可以在你的应用程序的任意数量的模块中find),而$(document).ready()代替当DOM完成加载时触发它的callback函数。

差别可能看起来很微妙,但想到这个:我有一个模块需要以某种方式耦合到DOM,所以我可以依赖于domReady并在模块定义时耦合它,或者放下$(document).ready()在它的末尾,callback一个模块的init函数。 我会打电话给第一个清洁方法。

同时,如果我有一个需要在DOM准备好的情况下发生的事件,那么$(document).ready()事件将成为前提,因为这并不是特别依赖RequireJS来完成加载模块,您所调用的代码的依赖性得到满足。

同样值得考虑的是,你不一定在jQuery中使用RequireJS。 任何需要DOM访问(但不依赖于jQuery)的库模块都可以通过使用domReadydomReady

按照外观顺序回答你的子弹:

  • 他们都完成同样的事情
  • 如果你对jquery有任何理由的保留,那么使用domReady
  • 正确,所以只需使用jQuery
  • 因为不是每个人都使用jQuery
  • 我同意,只是使用jQuery
  • 根据定义,插件“满足需求”。
  • 跨浏览器AJAX是不是一件事。 跨域? 可能有,如果没有,那就没有必要喂养了。
  • , -, -, – 好

当它归结于它时,你正在超越这个。 这是一个在domReady上执行javascript的机制。 如果你没有jQuery,我会主张domReady插件。 既然你有jQuery,那么不要加载更多的脚本来做一些已经可用的东西。

清晰度更新

domReady插件收集文档“准备就绪”时调用的函数 。 如果它已经被加载,那么它们立即执行。

JQuery收集函数并将一个延迟对象绑定到“准备就绪”的dom上。 当dom准备就绪时,延迟对象将被parsing,并且这些函数将被触发。 如果dom已经“准备就绪”,那么延迟将已经被parsing,所以函数将立即执行。

这意味着他们有效地做同样的事情。

经过一些与多个模块requirejs的实验后,我build议使用domReady

我注意到,在requirejs加载多个模块时,不会调用与$(document).ready(…)相关的函数。 我怀疑在执行所有requirejs代码之前,dom已经准备好了,并且在用户定义的函数(即在主模块代码内)绑定jquery就绪callback处理程序之前被调用。

 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被加载。 不知道这是多么伟大,所以欢迎任何反馈,但这里是我的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'); }); }); });