Piszę skrypt, który ma być osadzony w witrynach stron trzecich w celu dodania do nich funkcjonalności. Niedawno wyrzuciłem mój dość niechlujny kod niestandardowego programu ładującego i zacząłem zastępować go programem requirejs. Jedną z bibliotek, która opcjonalnie jest ładowana dla mnie (zależy od niektórych parametrów przekazywanych) jest jQuery.Make requireJs nie ponownie ładuje jQuery, jeśli już na stronie
Działa to dobrze, dopóki mój skrypt nie zostanie dołączony do strony, na której jQuery już jest, w którym to przypadku wydaje się, że niektóre wtyczki częściowo się wczytują, requirejs ładuje jQuery przez wersję strony, a wtyczki natychmiast się psują.
Pytanie klientów, aby przepisali swoje strony tylko po to, by użyć tego skryptu, nie wchodzi w grę, więc chciałbym wykryć, czy jQuery jest już załadowany, jeśli tak, to pominąć ładowanie go przez requirejs i po prostu użyć już załadowany jeden (Może to otworzyć mnie na przypadki i błędy o dziwnych krawędziach, gdy używają znacznie starszej wersji jQuery, ale nie mam dużego wyboru).
To, co myślałem, że zrobię, to napisanie nowego modułu, który najpierw sprawdzi, czy jQuery jest załadowany, jeśli jest, po prostu wyeksportuj obiekt jQuery, a jeśli nie, załaduj go, a następnie wyeksportuj. Jednak wydaje mi się, że jestem utrudniony, ponieważ funkcja definicji modułu wydaje się być synchroniczna do pracy, więc nie mogę wyjść i wczytać innego skryptu, który byłby asynchroniczny, a następnie załadować eksport do requirejs.
Czy brakuje mi czegoś w dokumentach? Czy to, co próbuję, uniemożliwia?
Czy pomogłoby to [załadować dwie różne wersje jQuery w tym samym czasie] (http://stackoverflow.com/q/1566595/33732)? –
To rozwiązałoby problemy z wersjami. Nie wydaje się to jednak rozwiązać problemu deptania wtyczek, ponieważ najprawdopodobniej wersja na stronie załaduje się przed moją kopią i nie będzie miała wpływu na noc. Przypuszczam, że mógłbym zmodyfikować obsługiwaną wersję jQuery, aby nie deptać obiektów $/jQuery, i po prostu ujawnić się jako moduł, ale wolałbym to zrobić jako ostatnią deskę ratunku, ponieważ wtedy musiałbym pamiętać, aby to zrobić zmienić po aktualizacji jQuery. –
To nie powinno mieć znaczenia. Tylko jedna z bibliotek musi mieć świadomość trybu braku konfliktu.Kiedy wywołasz 'noConflict' na twojej kopii jQuery, wartości' $ 'i' jQuery' zostaną przywrócone do oryginałów, zanim załadowano twoją kopię. Wtyczki, które używały oryginalnej instancji, będą ją nadal odnosić. Oryginalna instancja jQuery przyjmie, że jest jedyną, która jest w porządku. –