Requjs ile jQuery eklentisi nasıl yüklenebilir


88

Requirejs + jquery ile çalışıyorum ve bir jQuery eklentisinin Require ile iyi çalışmasını sağlamanın akıllı bir yolu olup olmadığını merak ediyordum.

Örneğin jQuery-cookie kullanıyorum. Doğru anladıysam jquery-cookie.js adında bir dosya oluşturabilirim ve do

define(["jquery"], // Require jquery
       function($){
// Put here the plugin code. 
// No need to return anything as we are augmenting the jQuery object
});
requirejs.config( {
    "shim": {
        "jquery-cookie"  : ["jquery"]
    }
} );

jQuery'nin yaptığı gibi şeyler yapıp yapamayacağımı merak ettim, bu şöyle:

if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
    define( "jquery", [], function () { return jQuery; } );
}

veya jQuery eklentilerini requirejs veya herhangi bir amd ile uyumlu hale getirmenin tek yolu buysa

Yanıtlar:


67

Sadece EITHER yapmanız gerekir

define(["jquery"], // Require jquery
       function($){
// Put here the plugin code. 
// No need to return anything as we are augmenting the jQuery object
});

jquery-cookie.js'nin sonunda VEYA

requirejs.config( {
    "shim": {
        "jquery-cookie"  : ["jquery"]
    }
} );

jquery-cookie eklemeden önce herhangi bir yere (örneğin, data-main'in işaret ettiği her yerde).

Gönderdiğiniz son kod bloğu, yeniden dağıtılan ve bir AMD ortamında olabilecek veya olmayabilecek jQuery gibi şeyler için iyidir. İdeal olarak, her jQuery eklentisi bunu zaten kurmuş olmalıdır.

Dahil edilen kitaplıkları olabildiğince karıştırılmadan tutmayı tercih ederim, bu nedenle sayfa başına bir kez global shim yapılandırması bana en temiz çözüm gibi görünüyor . Bu şekilde yükseltmeler daha güvenlidir ve CDN'ler bir olasılık haline gelir.


1
İkisini de yapmazsanız tanımlamak ve pul şeyler i $ .cookie bir işlev hata mesajı değil değil iş alırım
Nicola Peluchetti

Deneyimlerime göre, tanımlayıcı işlevden herhangi bir şey döndürmemek yeterli değil, requirejs modülün yüklendiğini fark etmeyecek. Bu, şim ile uyandırılabilir: {eklentiler: {bağlıdır: ['jquery'], dışa aktarır: 'eklentiler'}
honzajde

JQuery eklenti komut dosyasının gerçekten çalışması gerektiğine dikkat etmelisiniz. Uzman değilim, ancak basit bir çözüm buldum, böylece tek bir require(['plugin1', 'plugin2']);vb. Var. Geri arama yapılmaz, bu nedenle eklenti betikleri dışında hiçbir şey çalışmaz. Bu, daha sonra kendilerini ekleyecekleri anlamına gelir, jQuery.fnböylece başka her yerde bağımlılık olarak 'jquery'yi listeleyebilirsiniz ve bunlar dahil edilir. Dediğim gibi, bu konuda oldukça yeniyim ve daha iyi bir yaklaşım olabilir (sadece bir scriptetiket kullanmak gibi ) ama bu işe yarıyor.
Joshua Bambrick

3
Josh: Her şeyin doğru sırada yükleneceğine dair kumar oynuyorsunuz. Sitenizdeki bazı kullanıcılar muhtemelen bozuk şeyler görüyor. Sorun eklentinin yüklendiği kadar değil , eklentinin ne zaman yüklendiğidir ve o sırada başka ne yürütülüyor? Kullanmanın ana nedeni, tahmin yürütmekten ziyade bağımlılıklara dayanan mantıklı bir işlem sırası sağlamaktır.
Hans

104

RequireJS'de şim yapılandırmasının kullanılmasıyla ilgili bazı uyarılar vardır, http://requirejs.org/docs/api.html#config-shim'de belirtilmiştir . Yani, optimize ediciyi kullanırken "CDN yüklemesini bir yapıda shim yapılandırması ile karıştırmayın".

Aynı jQuery eklenti kodunu RequireJS içeren ve içermeyen sitelerde kullanmanın bir yolunu arıyordum. JQuery eklentileri için bu pasajı https://github.com/umdjs/umd/blob/master/jqueryPlugin.js adresinde buldum . Eklentinizi bu koda sarın ve her iki şekilde de düzgün çalışacaktır.

(function (factory) {
if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module depending on jQuery.
    define(['jquery'], factory);
} else {
    // No AMD. Register plugin with global jQuery object.
    factory(jQuery);
}
}(function ($) {

    $.fn.yourjQueryPlugin = function () {
        // Put your plugin code here
    };  

}));

Kredi jrburke'ye gider; javascript gibi, diğer işlevler üzerinde hareket eden işlevlerin içinde işlev görür. Ama sanırım ne yaptığını çözdüm.

factoryİlk satırdaki fonksiyon argümanı , $argümandaki eklentiyi tanımlamak için çağrılan bir fonksiyondur . AMD uyumlu bir yükleyici olmadığında, eklentiyi global jQuerynesnede tanımlamak için doğrudan çağrılır . Tıpkı yaygın eklenti tanımı deyimi gibi:

function($)
{
  $.fn.yourjQueryPlugin = function() {
    // Plugin code here
  };
}(jQuery);

Bir modül yükleyici varsa factory, yükleyicinin jQuery'yi yükledikten sonra çağırması için geri arama olarak kaydedilir. JQuery'nin yüklenen kopyası bağımsız değişkendir. Eşdeğeri

define(['jquery'], function($) {
  $.fn.yourjQueryPlugin = function() {
     // Plugin code here
  };
})

3
Bu yanıtı beğendim çünkü soru bir jQuery eklentisi hakkında olsa da, bu sadece jQuery için değil, her tür modül veya kitaplık için çalışıyor. Kafamı kodunuzun etrafına sarmam bir dakikamı aldı, ama bir kez yaptım, çok mantıklı geldi.
Adam Tuttle

1
Kesinlikle anlaşılmaz bir javascript. Nasıl çalıştığına dair bazı açıklamalar ekledim.
Carl Raymond

Bunun nasıl yapılacağına ve jQuery veya Zepto ile çalışan bir eklentinin nasıl yapılacağına dair herhangi bir ipucu var mı? AMD olmayan kodu ile kolayca değiştirebilirsiniz factory(jQuery || Zepto);, ancak AMD bölümünü nasıl yapardınız bilmiyorum. JQuery "yolunu" zepto olarak ayarlamanız gerektiğini düşünüyorum. paths: { jquery: 'vendor/zepto/zepto.min' }
Ryan Wheale

vay uzun süredir bu kod parçacığını anlamak istiyordum. Çok teşekkürler, shimesasen bunu yapmak değil mi? Sanırım hayır .. çünkü yukarıdaki gibi elle kodladığınızı söylediniz.
eugene

Benim gibi aptallar için protip: pasajda yazdığı yerde eklenti adını $.fn.jqueryPlugindeğiştirin jqueryPlugin!!
Matt Lacey

2

Tıpkı bazı jquery eklentileri için bir FYI'nin zaten amd / require kullanması gibi, shim'de herhangi bir şey bildirmeniz gerekmez. Aslında bunu yapmak bazı durumlarda sizin için sorunlara neden olabilir.

Jquery çerezi JS'ye bakarsanız, aramaları tanımlayın ve gerekli (["jquery"]) göreceksiniz.

ve jquery.js'de bir tanımlama çağrısı göreceksiniz ("jquery", [], function () ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.