2015-02-05 25 views
5

Modüllerimi projelerimden birine yüklemek için RequireJS kullanıyorum. ben require çağrıyı (ve define) kullanarak modülleri gerektirecek web farklı şekillerde etrafında bkz.RequireJS ne zaman arama asenkron gerektirir? Ne zaman senkronize edilir?

ben "JQuery" adlı bir modül var ve bunu gerektirir istiyorum varsayalım. Ben örneklerde gördüğümüz gibi İki Ayrı:

require(["JQuery"], function($){ 
    $.doSomething(); 
}) 
  • Ve bu:

    1. Bu

      var $ = require("JQuery"); 
      $.doSomething(); 
      

    Sorum yük olarak zaman uyumsuz olduğu takdirde RequireJS documantation, ikinci sözleşmenin nasıl işleyeceğini söylüyor? $'un tanımlandığından ve ikinci satırın yürütülmesi için ilk satırın tamamlandığından nasıl emin olabilirim?

  • cevap

    8

    RequireJS hep uyumsuz modüllerini yükleyen ama senkron görünüyor require bir şekilde izin. İkinci snippet'iniz gerçekten bazı önemli kodları kaçırıyor. (Ayrıca, jQuery için modül adı jquery kodlanmıştır. jQuery olarak başvuruda bulunmanıza izin veren bir yapılandırma yazabilirsiniz, ancak hiçbir anlamı yoktur.) require çağrıları bu biçimi, modüllerin içinde kullanılmak üzere tasarlanmıştır:

    define(['jquery'], function (require) { 
        var $ = require("jquery"); 
        $.doSomething(); 
    }); 
    

    Not Ekle define ilk argüman olarak bağımlılık eklenmesini: RequireJS yukarıdaki kod ile neyi

    define(function (require) { 
        var $ = require("jquery"); 
        $.doSomething(); 
    }); 
    

    çalıştırmadan önce bu dönüşmesi olduğunu. RequireJS kodu çalıştırdığında, bağımlılığı bulur, jquery yükler ve sonra anonim işlevi çağırır. require("jquery") zamanla karşı karşıya, modül zaten yüklü. Günün sonunda numaralı çağrı'u eşzamanlı olarak görüntülerken, gereksinim duyduğu modülün yüklenmesi yine de eşzamansız olarak gerçekleşir.

    Bu require zaman uyumlu formunu define numaralı aramanın dışında kullanabilir misiniz? Sadece başarısızlıklardan şikayetçiysen. kendisine geçirilen modül zaten yüklü değilse Bu require çağrı başarısız olacaktır. Sen rezil hatayı alıyorum: Yukarıda gösterilen ettik gibi bir define içinde

    Module name ... has not been loaded yet for context: ... 
    

    bunu kullanma güvenlidir.

    require(['jquery'], function (require) { 
        var $ = require("jquery"); 
        $.doSomething(); 
    }); 
    

    olur işi ancak elle bağımlılık tekrarlayarak ne anlamı var: Ya sen yapabileceğini tahmin. (Eğer RequireJS Ben yukarıda gösterdiğim gibi define çağrıyı dönüştüren aynı şekilde burada örnekte var gibi bir geri arama ile bir require çağrıyı dönüştürmek değildir, merak ediyorum.)

    +0

    teşekkür ederim. Şimdi tüm açık, kod ben gördüğüm gibi ikinci şekilde biraz daha güzel ve temiz görünüyor. :) – Er85

    0

    require.js dokümanlar göre, bir sarıcı. Bu nedenle, senkronize olmayan bir şekilde çalışmak için kodu yeniden oluşturuyor. CommonJs sarıcı denir. o here

    0

    Ben requirejs bilmiyorum hakkında sen daha fazla bilgi bulabilirsiniz. Ama hem sync ve async yollarla modülü yüklemek mümkün olduğunu düşünüyorum.

    function require(name,cb){ 
        if(cb !== undefined){ 
         requireAsync(name,cb); 
        }else{ 
         requireSync(name); 
        } 
    } 
    
    İlgili konular