2013-04-09 4 views
7

Próbuję załadować jquery w trybie noConflict za pomocą wymagająJak użycie require.js załadować jQuery z noConflict

require.config({ 
    paths: { 
     'jquery': 'libs/jquery-req', 
     underscore: 'libs/underscore', 
     backbone: 'libs/backbone' 
    }, 
    shim: { 
     jquery: { 
      init: function() { 
       console.log('jq init'); 
       var jq = this.jQuery.noConflict(true); 
       jq.support.cors = true; 

       return jq; 
      }, 
      exports: '$' 
     }, 
     backbone: { 
      deps: ['underscore', 'jquery'], 
      init: function() { 
       console.log('b init'); 
      }, 
      exports: 'Backbone' 
     }, 
     underscore: { 
      exports: '_' 
     } 
    } 
}); 

i używać go tak:

define([ 
    'jquery', 
    'underscore', 
    'backbone' 
], function(jq, _, Backbone) { 
    console.log(jq); 
    var initialize = function() { 
//  Router.initialize(); 
    }; 

    return { 
     initialize: initialize 
    }; 
}); 

niestety wydaje podkładkę. Funkcja jquery.init nigdy nie jest wywoływana. Czy ktoś może mi pomóc zrozumieć, dlaczego? Co dziwne, gdy zmieniam nazwę jquery -> jquery-reg, to wydaje się działać, ale wymaga zmiany zależności zdefiniowanej w każdym pliku.

+1

zobacz to pytanie: http://stackoverflow.com/questions/15613577/correct-way-to-implement-jquery-with-require-js – explunit

+0

dzięki explunit – mrok

Odpowiedz

23

Utwórz następujący moduł noconflict.js:

define(["jquery"], function($) { 
    //drop the `true` if you want jQuery (but not $) to remain global 
    return $.noConflict(true); 
}); 

Następnie w require.config dodają:

map: { 
    "*": { 
    "jquery": "noconflict" 
    }, 
    "noconflict": { 
    "jquery": "jquery" 
    } 
} 

Wersja noconflict jQuery zostanie przekazana do wszystkich modułów (z wyjątkiem noconflict). Pozbądź się podkładki jQuery.

Należy zauważyć, że przejście na ścieżkę utrzymywania jQuery poza globalną przestrzenią nazw uniemożliwi korzystanie z jakichkolwiek wtyczek jQuery, które nie są AMD, bez modyfikowania tych wtyczek jako modułów AMD. Shim nie robi nic magicznego, aby skorzystać z tej konfiguracji. To samo dotyczy dowolnego modułu innego niż AMD, który możesz chcieć podpalić, zależnie od tego, co zrobiłeś "czystym" AMD.

+2

Zauważ, że jeśli chcesz tylko usunąć przejęcie jQuery z $, możesz zrobić 'return $ .noConflict();', który będzie przechowywać window.jQuery. W ten sposób wtyczki jQuery powinny wszystkie ładować się dobrze (jak przypuszczam tylko podkładki) i nadal możesz mieć czyste $ (inne biblioteki do użycia.) –

+0

Edytowane w celu odzwierciedlenia tej opcji. – neverfox

+0

Potrzebowałem dodać 'delete window. $' Po wywołaniu '$ .noConflict()', ponieważ zostało ustawione na 'undefined', a mocha zgłosi to jako globalny wyciek. – jeremija

0

Używam tego:

require.config({ 
    paths: { 
     jquery: 'libraries/jquery/jquery.min', 
     underscore: 'libraries/underscore.min', 
     backbone: 'libraries/backbone.min', 
     jquery_ui: 'libraries/jquery/jquery.ui.min', 
    }, 

    shim: { 
     'backbone': { 
      deps: ['underscore', 'jquery'], 
      exports: 'Backbone' 
     }, 
     'underscore': { 
      exports: '_' 
     }, 
     'jquery_ui': { 
      deps: ['underscore', 'jquery'], 
      exports: 'ui' 
     } 
    } 
}); 

Wtedy w mojej aplikacji i korzystania z lokalnych zakresów zdefiniować instancję jQuery. W poniższym przykładzie $ jest jquery, ale może to być również coś innego.

define([ 
    'jquery', 
    'backbone' 
    ], function ($, Backbone) { 

    'use strict'; 

    var app = Backbone.View.extend({ 
     el: 'body', 

     initialize: function() { }, 

    }); 

    return app; 

}); 
+0

Myślę, że $ będzie nadal w zasięgu globalnym z podejście (nawet jeśli nie nazwiesz parametru $), czyli tego, co mrok próbował uniknąć. – explunit

+0

To nieprawda. Przetestowałem to by być pewnym: '' Uncaught ReferenceError: $ nie jest zdefiniowany –

+0

Nie sądzę, że istnieje sposób na załadowanie jquery bez dodawania $ do zasięgu globalnego. Mój przypadek jest taki, że już załadowałem jquery1.4.2 i chciałbym użyć najnowszej wersji (ładowanej przez require) w trybie bez konfliktów. Chris Próbowałem twojego kodu, a $ załadowano do globalnego zasięgu - więc nie mam pojęcia, skąd się wzięło, że "$ is not defined" może próbowałeś go użyć zanim go załadowałeś? https://github.com/mrok/require – mrok