2013-08-07 13 views
12

के लिए मैं Modernizr सुविधा लोड करने के लिए कोशिश कर रहा हूँ requireJS साथ गतिशील रूप से पता लगाता है।
जैसा कि मॉडर्निज़र ने AMD में बनाया है, यह समस्या नहीं होनी चाहिए।requireJS विन्यास Modernizr

मेरे requireJS विन्यास Modernizr स्रोत निर्देशिका के लिए पथ शामिल है और सुविधा के लिए निर्देशिका का पता लगाता है:

requirejs.config({ 
    paths: { 
    "modernizr" : "components/modernizr/src", 
    "feature-detects": "components/modernizr/feature-detects" 
    } 
}); 

अपने विचार svg परीक्षण की आवश्यकता होगी में से एक मान देता है।
मेरा विचार परिभाषा लग सकता है की तरह this

define(["feature-detects/svg"], function() { .. }); 

दुर्भाग्य svg.js नहीं Modernizr.js क्योंकि सभी सुविधा का पता लगाता है और Modernizr स्रोत फ़ाइलें किसी भी निर्देशिका निर्दिष्ट किए बिना Modernizr लोड पा सकते हैं: define(['Modernizr'], ..

कौन सा में परिणाम एक बहुत बदसूरत require.config

requirejs.config({ 
    paths: { 
    "Modernizr": "components/modernizr/src/Modernizr", 
    "addTest": "components/modernizr/src/addTest", 
    "ModernizrProto": "components/modernizr/src/ModernizrProto", 
    "setClasses": "components/modernizr/src/setClasses", 
    "hasOwnProp": "components/modernizr/src/hasOwnProp", 
    "tests": "components/modernizr/src/tests", 
    "is": "components/modernizr/src/is", 
    "docElement": "components/modernizr/src/docElement", 
    "feature-detects": "components/modernizr/feature-detects" 
    } 
}); 

वहाँ एक क्लीनर तरीका जब भी यह फ़ाइल नहीं मिल सकी components/modernizr/src/ में खोज करने के लिए requireJS बताने के लिए है?

अद्यतन

मैं एक example github project जो बुनियादी सेटअप और एक चल demonstration शामिल बनाया।

+0

जिज्ञासु उपयोग कर सकते हैं? आपको फ़ाइल को सिंक्रनाइज़ लोड करने की आवश्यकता है ताकि परीक्षण शेष पृष्ठ प्रस्तुत करने से पहले चलाया जा सके। अगर मुझे सही याद है, तो एएमडी मुख्य रूप से निर्माण प्रक्रिया की सहायता के लिए चुना गया था - https://github.com/Modernizr/Modernizr/issues/713 –

+0

@ सिमोनस्मिथ मैं अपने ऐप को एक में बनाने के लिए जरूरी जेएस 'r.js' स्क्रिप्ट का उपयोग कर रहा हूं फ़ाइल। यह शानदार होगा अगर मैं जरूरतों का उपयोग कर आधुनिकता निर्भरताओं को परिभाषित कर सकता हूं। – jantimon

+0

मुझे लगता है कि आप संपत्तियों के प्रबंधन के लिए बोवर की तरह कुछ उपयोग कर रहे हैं, इसलिए आपका 'घटक' फ़ोल्डर प्रोजेक्ट फ़ोल्डर जैसा नहीं है (दूसरे शब्दों में, आप मॉडर्निज़र को इंगित करने के लिए RequJS में' baseUrl' का उपयोग नहीं कर सकते हैं)। दुर्भाग्यवश, ऐसा लगता है कि उन निर्भरताओं को जोड़ने का कोई आसान तरीका नहीं है और जिस तरह से आपने इसे हल किया है, वह एकमात्र विकल्प है। वैकल्पिक मॉड्यूलर पर 'r.js' चल रहा होगा और फिर आपके ऐप में पैक की गई फ़ाइल भी शामिल होगा। अभी भी महान नहीं है। – danielepolencic

उत्तर

19

मॉडर्निज़र की एएमडी संरचना (वर्तमान में) केवल अपनी आंतरिक निर्माण प्रक्रिया के लिए है। हमने इसका खुलासा करने पर चर्चा की है ताकि इसका उपयोग किया जा सके जैसा कि आपने कोशिश की है, लेकिन अभी तक ऐसा करने के सुविधाजनक तरीके से सहमत नहीं है। A Modernizr plugin for RequireJS एक विकल्प हो सकता है।

क्या आप बोवर का उपयोग कर रहे हैं? यदि ऐसा है, तो यह आधुनिकizr isn't suitable for use with Bower yet पर ध्यान देने योग्य है।

इस समय आपकी बिल्ड प्रक्रिया में मॉडर्निज़र को टाई जाने का अनुशंसित तरीका grunt-modernizr का उपयोग कर रहा है, जो स्वचालित रूप से आपके कोड में मॉडर्निज़र का पता लगाता है (या आप उन्हें स्पष्ट रूप से परिभाषित कर सकते हैं), तो आप केवल परिणामी मॉडर्नइज़र बिल्ड का उपयोग कर सकते हैं किसी अन्य एएमडी निर्भरता की तरह जब भी आप इसकी आवश्यकता है:

define(['path/to/built/modernizr.js'], function (Modernizr) { 
    if (Modernizr.svg) { 
     ... 
    } 
}); 
+0

बहुत बहुत धन्यवाद! अगर अब तक यह एकमात्र तरीका है तो मैं बदमाश हो जाऊंगा। – jantimon

+0

यदि मेरे पास पहले से ही आधुनिकता का कस्टम निर्माण है (इसे ज़र्ब फाउंडेशन के साथ मिला है), यह एएमडी का समर्थन कैसे करता है? मुझे मॉड्यूल के लिए कोई परिभाषित() नहीं दिख रहा है। मैं देखता हूं कि पहली पंक्ति में विंडो से जुड़ा एक वैश्विक चर है। क्या आप विस्तार से समझा सकते हैं? – elanh

+3

@elanh एक निर्मित Modernizr स्क्रिप्ट AMD- संगत नहीं है, इसलिए आपको एक [shim config] (http://requirejs.org/docs/api.html#config-shim) का उपयोग करना चाहिए। –

-1

अगर मैं आपके सवाल का सही ढंग से समझ, तुम बस इतना की तरह अपने सुविधा को परिभाषित नहीं होगा: अपनी सुविधा का पता लगाने कोड चलाता है से पहले

define([ 
    "modernizr", 
    "feature-detects/svg" 
], function(Modernizr) { 
    Modernizr.addTest(); 
}); 

इस तरह modernizr लोड किया जाएगा।

+0

मैं अपनी सभी निर्भरताओं के साथ एक सुविधा का पता लगाना चाहता हूं – jantimon

11

मेरे सुझाव एक शिम

कॉन्फ़िग

paths: { 
     'Modernizr': 'PATH TO MODERNIZR' 
    } 
shim: { 
     'Modernizr': { 
      exports: 'Modernizr' 
     } 
    } 
है करने के लिए किया जाएगा

=================

आपके पास अपनी स्क्रिप्ट में परिभाषित Modernizr साथ एएमडी उपयोग करने का कारण के रूप में

define(['Modernizr'],function(Modernizr) { 
    'use strict'; 

console.log(Modernizr) 
// This should log the Modernizr function 

//For Example 
if(Modernizr.boxshadow){ 
    // Do something here 
} 

};