2016-12-28 58 views
7

Co to jest "autorytatywny" sposób wykrywania, czy zmienna _ jest załadowana z domieszką lub podkreślnikiem?Wykrywanie, czy _ jest domieszką lub podkreślnikiem

Używam lodash dla projektu w środowisku, w którym underscoremoże być załadowany również.

Obecnie mam wymyślić to:

/** 
* lodash defines a variable PLACEHOLDER = '__lodash_placeholder__' 
* so check if that is defined/contains the string "lodash" 
*/ 
if (typeof(_.PLACEHOLDER) == 'undefined' || _.PLACEHOLDER.indexOf('lodash') < 0) { 
    // _ is underscore, do what I need to access lodash 
} 

Ważna aktualizacja: Powyższy kod nie działa!

Czy istnieje "autorytatywny" sposób wykrycia, czy _ jest lokalem lub podkreślnikiem?

Uwagi:
Jest to szczególny wniosek, aby znaleźć sposób, aby określić, czy lodash lub podkreślenia jest ładowany w zmiennej _:
1. To jest poza moją kontrolą, czy podkreślenia jest załadowany czy nie. (lodash jest w ramach mojej kontroli i zawsze będzie załadowany).
2. Nie można powoływać się na kolejność ładunków na podszycie/podkreślenie.
3. Wersja podkreślnika, która jest ładowana, prawdopodobnie ulegnie zmianie (jest częścią struktury CMS, którą można zaktualizować).
4. Lodash 4.17.x ma ponad 300 funkcji. Mój kod wykorzystuje wiele funkcji w lodash.
5. Lodash zawiera wiele funkcji, które podkreślają , a nie.
6. Niektóre funkcje istniejące w obu bibliotekach mają różne implementacje.

+0

Jedyne co mogę myśleć jest '_ .VERSION "obecne w' lodash' ale nie w 'podkreśleniu' – bhantol

+2

@bhantol: underscore ma również wersję' VERSION' (przynajmniej wersja na swojej stronie). –

+1

'isLodash = _.toString().indexOf ('lodash')> = 0 ' – bhantol

Odpowiedz

1

Kod zaksięgowany w pytaniu nie działa pod numerem, ponieważ PLACEHOLDER to zmienna prywatna, która zmienia nazwę w trakcie minifikacji.

Dlatego też zaadaptowałem pojęcie "wykrywania cech", jak wspomniano w komentarzach. Należy zauważyć, że metoda ta może rozbić jeśli przyszłe wersje rolki podkreślenia we wszystkich tych funkcji, lub jeśli lodash deprecates żadnej z tych funkcji:

var isLodash = false; 
 
// If _ is defined and the function _.forEach exists then we know underscore OR lodash are in place 
 
if ('undefined' != typeof(_) && 'function' == typeof(_.forEach)) { 
 
    // A small sample of some of the functions that exist in lodash but not underscore 
 
    var funcs = [ 'get', 'set', 'at', 'cloneDeep' ]; 
 
    // Simplest if assume exists to start 
 
    isLodash = true; 
 
    funcs.forEach(function (func) { 
 
    // If just one of the functions do not exist, then not lodash 
 
    isLodash = ('function' != typeof(_[ func ])) ? false : isLodash; 
 
    }); 
 
} 
 

 
if (isLodash) { 
 
    // We know that lodash is loaded in the _ variable 
 
    console.log('Is lodash: ' + isLodash); 
 
} else { 
 
    // We know that lodash is NOT loaded 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.3/lodash.js"></script>

3

Idąc podobny sposób jak @bhantol już wspomniano, istnieje Migrating doc z listą różnic między lodash i podkreślenia, że ​​były nie kompatybilizacji z. Nie można ich użyć? Na przykład,

if (typeof(_.invoke) !== 'undefined'){ 
    // it's lodash 
} 

Ale tak, wzmacniając komentarzy @ Felix-Kling i @tadman i innych, jeśli to możliwe, to może być bardziej wiarygodne, aby ograniczyć pytanie do funkcji (np: specyficzne metody) poziom zamiast całej biblioteki.

+3

'_.invoke' jest dostępny na obu. '_.at' będzie lepszym wyborem (tylko na lodash od wersji 1) – Jack

+1

Dodałem to pytanie, aby wyjaśnić: ** Wersja podkreślenia, która jest ładowana, prawdopodobnie ulegnie zmianie (jest częścią struktury CMS który może być aktualizowany), więc nie można polegać na braku określonej funkcji. ** –