2016-12-28 15 views
7

यह पता लगाने के लिए "आधिकारिक" तरीका क्या है कि _ वैरिएबल लॉनाश या अंडरस्कोर से भरा हुआ है या नहीं?पता लगाना कि _ लॉनाश है या अंडरस्कोर

मैं पर्यावरण में एक परियोजना के लिए lodash का उपयोग कर रहा हूं जहां underscoreकभी-कभी भी लोड हो सकता है।

वर्तमान में, मैं इस के साथ आ गया है:

/** 
* 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 
} 

महत्वपूर्ण अपडेट: ऊपर कोड काम नहीं करता!

क्या _ लॉन्श या अंडरस्कोर है तो पता लगाने के लिए कोई "आधिकारिक" तरीका है?

नोट्स:
यह अगर lodash या अंडरस्कोर _ चर में लोड किया जाता है निर्धारित करने के लिए एक रास्ता खोजने के लिए एक विशिष्ट अनुरोध है:
1. यह अंडरस्कोर या लोड नहीं है कि मेरे नियंत्रण से बाहर है। (lodash मेरे नियंत्रण में है, और हमेशा लोड किया जाएगा)।
2. लॉनाश/अंडरस्कोर का लोड ऑर्डर पर भरोसा नहीं किया जा सकता है।
3. लोड किए गए अंडरस्कोर का संस्करण बदलने की संभावना है (यह एक सीएमएस फ्रेमवर्क का हिस्सा है जिसे अपडेट किया जा सकता है)।
4. लोडाश 4.17.x में 300+ फ़ंक्शन हैं। मेरा कोड लॉनाश में कार्यों के का उपयोग करता है।
5. लोडाश में कई फ़ंक्शन हैं जो अंडरस्कोर प्रदान नहीं करते हैं।
6. दोनों पुस्तकालयों में मौजूद कुछ कार्यों में अलग-अलग कार्यान्वयन होते हैं।

+0

केवल एक चीज मैं के बारे में सोच सकते हैं 'है _ 'संस्करण' में 'संस्करण' मौजूद है लेकिन 'अंडरस्कोर' – bhantol

+2

@bhantol में नहीं है: अंडरस्कोर में 'संस्करण' भी है (कम से कम इसकी वेबसाइट पर संस्करण)। –

+1

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

उत्तर

1

प्रश्न पर पोस्ट किया गया कोड पर काम नहीं करता है, PLACEHOLDER एक निजी चर है जिसे minification के दौरान बदला जाता है।

इसलिए, मैंने टिप्पणियों में उल्लिखित "फीचर डिटेक्शन" की धारणा को अनुकूलित किया है। ध्यान दें कि यह विधि टूट सकता है यदि इन सभी कार्यों के में अंडरस्कोर रोल के भविष्य के संस्करणों, या lodash इन कार्यों में से किसी deprecates यदि:

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

समान लाइनों के रूप में पहले ही उल्लेख किया @bhantol साथ जा रहे हैं, वहाँ थे कि साथ compatibilized नहीं lodash और अंडरस्कोर के बीच मतभेद की एक सूची के साथ एक Migrating doc है। क्या उनका उपयोग नहीं किया जा सकता है? उदाहरण के लिए,

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

लेकिन हाँ, @ Felix-Kling और @tadman और दूसरों के द्वारा टिप्पणियाँ परिवर्धित, यदि संभव हो तो, इसे और अधिक विश्वसनीय सुविधा के लिए प्रश्न को प्रतिबंधित करने के हो सकता है (उदाहरण के लिए: विशेष विधि) स्तर पूरी लाइब्रेरी के बजाए।

+3

'_.invoke' दोनों पर उपलब्ध है। '_.at' बेहतर विकल्प होगा (केवल v1 के बाद से लॉनाश पर) – Jack

+1

मैंने स्पष्टीकरण में सहायता के लिए इसे प्रश्न में जोड़ा है: ** लोड किए गए अंडरस्कोर का संस्करण बदलने की संभावना है (यह एक सीएमएस ढांचे का हिस्सा है जिसे अपडेट किया जा सकता है), इसलिए अनुपलब्ध होने वाले विशिष्ट फ़ंक्शन पर भरोसा करना संभव नहीं लगता है। ** –

संबंधित मुद्दे