बेमेल अनाम परिभाषित () मॉड्यूल


129

जब मैं पहली बार (आमतौर पर अक्षम कैश वाले ब्राउज़र में) अपना वेब ब्राउज करता हूं तो मुझे यह त्रुटि मिलती है

त्रुटि: बेमेल अनाम परिभाषित () मॉड्यूल: फ़ंक्शन (आवश्यकता) {

HTML :

<html>
   .
   .
   .
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
   <script> var require = { urlArgs: "v=0.4.1.32" }; </script>
   <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
   <script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
   </body>
</html>

जेएस :

$(function () {
    define(function (require) {
        // do something
    });
});

किसी को भी ठीक से पता है कि इस त्रुटि का क्या अर्थ है और ऐसा क्यों हो रहा है?

स्रोत फ़ाइल , github मुद्दों पृष्ठ में इसके बारे में एक छोटी चर्चा

जवाबों:


142

जैसा AlienWebguy कहा, डॉक्स प्रति, require.js उड़ा सकते हैं यदि

  • आपके पास अपने ही स्क्रिप्ट टैग में एक गुमनाम परिभाषित (" मॉड्यूल जो कॉल डिफाइन (बिना स्ट्रिंग आईडी के साथ )") है (मुझे लगता है कि वे वास्तव में वैश्विक दायरे में कहीं भी हैं)
  • आपके पास ऐसे मॉड्यूल हैं जिनमें परस्पर विरोधी नाम हैं
  • आप लोडर प्लगइन्स या अनाम मॉड्यूल का उपयोग करते हैं, लेकिन उन्हें बंडल करने के लिए अपेक्षित .js के अनुकूलक का उपयोग नहीं करते हैं

मुझे यह समस्या थी, जबकि आवश्यकता के साथ ब्राउजिफाई के साथ निर्मित बंडलों में शामिल थे। जेएस मॉड्यूल। समाधान या तो था:

ए। लोड होने से पहले स्क्रिप्ट टैग्स में गैर-आवश्यकता.जेएस स्टैंडअलोन बंडलों को लोड करें, या

B. उन्हें आवश्यकता का उपयोग करके लोड करें ।js (स्क्रिप्ट टैग के बजाय)


2
परस्पर विरोधी नाम एक आम है
जूलियो मरीन

1
एक अन्य संभावित समाधान, अनाम मॉड्यूल के साथ कुछ विशेष मामलों में आवश्यकता के अनुसार डिफॉल्ट त्रुटि अपवाद को रोकने के लिए आवश्यकताjs.Error फ़ंक्शन को अधिलेखित करना है जो कि sujesive मॉड्यूल या कोड को निष्पादित करने से रोकता है।
xtrm

1
इस सटीक मामले को शांत करने के लिए बस एक पुल अनुरोध ( github.com/requirejs/requirejs/pull/1763 ) जोड़ा । मुझे लगता है कि यह इन दिनों एक बहुत ही आम समस्या है।
बॉब एस

1
मुझे उन्हें पहले लोड करने के लिए कहने के लिए धन्यवाद! मुझे नहीं पता कि यह टिप क्यों जरूरी नहीं है स्वयं के दस्तावेज ... यही वह जगह है जहाँ स्टैक काम में आता है
टोबीस फील

14

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

त्रुटि से छुटकारा पाने के लिए, अपने सभी अन्य js फ़ाइलों को जरुरतमंदों का उपयोग करके शामिल करें।


बाहर किए गए बहुत सारे पुस्तकालय ऐसा कार्य करते हैं, या ऐसे फ़ंक्शन का कम से कम उपयोग / निर्यात करते हैं। मैं सभी को सलाह दूंगा - अगर वे आवश्यकता का उपयोग करते हैं - आवश्यकता के साथ सब कुछ आयात करें :)
एंड्री पोपोव

12

Reajjs के साथ शुरू करने में मैं इस मुद्दे पर भाग गया और एक शुरुआत के रूप में डॉक्स के रूप में अच्छी तरह से ग्रीक में लिखा जा सकता है।

जब मैं भाग गया था तो मुद्दा यह था कि अधिकांश शुरुआती उदाहरण "अनाम परिभाषित" का उपयोग करते हैं जब आपको "स्ट्रिंग आईडी" का उपयोग करना चाहिए।

अनाम परिभाषित करता है

define(function() {
        return { helloWorld: function() { console.log('hello world!') } };
 })


define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })

स्ट्रिंग आईडी के साथ परिभाषित करें

define('moduleOne',function() {
    return { helloWorld: function() { console.log('hello world!') } };
})

 define('moduleTwo', function() {
      return { helloWorld2: function() { console.log('hello world again!') } };
})

जब आप एक स्ट्रिंग आईडी के साथ परिभाषित का उपयोग करते हैं तब आप इस त्रुटि से बचेंगे जब आप मॉड्यूल का उपयोग करने की कोशिश करेंगे जैसे:

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});

(पोस्टीरिटी के लिए सिर्फ एक नोट) डॉक्स में वर्णित इस दृष्टिकोण के कुछ डाउनसाइड हैं : "परिभाषित () कॉल जिसमें मॉड्यूल के लिए एक नाम शामिल है ... सामान्य रूप से अनुकूलन उपकरण द्वारा उत्पन्न होता है ... नाम [आईएनजी] मॉड्यूल खुद बनाता है ... मॉड्यूल कम पोर्टेबल ... यह मॉड्यूल के लिए एक नाम में कोडिंग से बचने के लिए सामान्य रूप से सबसे अच्छा है और बस अनुकूलन उपकरण को मॉड्यूल नामों में जलने दें। " ... इस GitHub धागे में भी । ऐसा लगता है यही कारण है कि नाम को सूचीबद्ध करने के लिए शुरुआती उदाहरणों में बाहर रखा गया है।
मार्क जी।

10

प्रति डॉक्स :

यदि आप मैन्युअल रूप से HTML में स्क्रिप्ट टैग को अनाम परिभाषित () कॉल के साथ लोड करने के लिए कोड करते हैं, तो यह त्रुटि हो सकती है।

यह भी देखा जाता है कि क्या आप स्क्रिप्ट को मैन्युअल रूप से लोड करने के लिए HTML में एक स्क्रिप्ट टैग को कोड करते हैं जिसमें कुछ नामित मॉड्यूल हैं, लेकिन फिर एक अनाम मॉड्यूल को लोड करने का प्रयास करें जो मैन्युअल रूप से लोड की गई स्क्रिप्ट में नामित मॉड्यूल में से एक के समान नाम होने पर समाप्त होता है कोडेड स्क्रिप्ट टैग।

अंत में, यदि आप लोडर प्लगइन्स या अनाम मॉड्यूल (मॉड्यूल जो बिना किसी स्ट्रिंग आईडी के साथ परिभाषित () कॉल का उपयोग करते हैं, लेकिन फ़ाइलों को एक साथ संयोजित करने के लिए आवश्यकताएँ अनुकूलक का उपयोग नहीं करते हैं, तो यह त्रुटि हो सकती है। ऑप्टिमाइज़र को पता है कि अनाम मॉड्यूल को सही तरीके से कैसे नाम दिया जाए ताकि उन्हें एक अनुकूलित फ़ाइल में अन्य मॉड्यूल के साथ जोड़ा जा सके।

त्रुटि से बचने के लिए:

  • आवश्यकताएँ स्क्रिप्ट के माध्यम से परिभाषित () को कॉल करने वाली सभी लिपियों को लोड करना सुनिश्चित करें। HTML में उन स्क्रिप्ट्स को लोड करने के लिए स्क्रिप्ट कोड्स को मैन्युअल रूप से कोड न करें जो उनमें परिभाषित हैं () कॉल।

  • यदि आप मैन्युअल रूप से एक HTML स्क्रिप्ट टैग को कोड करते हैं, तो सुनिश्चित करें कि इसमें केवल नामांकित मॉड्यूल शामिल हैं, और यह कि एक गुमनाम मॉड्यूल जिसमें एक ही नाम होगा उस फ़ाइल में मॉड्यूल में से एक लोड नहीं है।

  • यदि समस्या लोडर प्लगइन्स या अनाम मॉड्यूल के उपयोग की है, लेकिन फ़ाइल बंडलिंग के लिए आवश्यकताएँ अनुकूलक का उपयोग नहीं किया जाता है, तो आवश्यकताएँJJS अनुकूलक का उपयोग करें।


3
क्या यह गुमनाम रूप से परिभाषित मॉड्यूल है? github.com/requirejs/example-multipage/blob/master/www/js/app/…
स्ट्रीटलाइट

5

ध्यान रखें कि कुछ ब्राउज़र एक्सटेंशन पृष्ठों में कोड जोड़ सकते हैं। मेरे मामले में मेरे पास एक "सभी टेक्स्टआर्सेस में एम्मेट" प्लगइन था जो मेरी आवश्यकता के साथ गड़बड़ी करता था। सुनिश्चित करें कि ब्राउज़र में निरीक्षण करके आपके दस्तावेज़ में कोई अतिरिक्त कोड नहीं जोड़ा गया है।


5

मौजूदा उत्तर समस्या को अच्छी तरह से समझाते हैं, लेकिन यदि आपकी स्क्रिप्ट फ़ाइलों का उपयोग करना या आवश्यकता से पहले जेएसजे को विरासत कोड के कारण एक आसान विकल्प नहीं है, तो थोड़ा स्क्रिप्टी वर्कअराउंड अपने स्क्रिप्ट टैग से पहले खिड़की के दायरे से आवश्यकता को हटाने के लिए है और फिर इसे बाद में पुनः स्थापित करें। हमारी परियोजना में यह एक सर्वर-साइड फ़ंक्शन कॉल के पीछे लिपटा हुआ है, लेकिन प्रभावी रूप से ब्राउज़र निम्न देखता है:

    <script>
        window.__define = window.define;
        window.__require = window.require;
        window.define = undefined;
        window.require = undefined;
    </script>
    <script src="your-script-file.js"></script>        
    <script>
        window.define = window.__define;
        window.require = window.__require;
        window.__define = undefined;
        window.__require = undefined;
    </script>

सबसे साफ नहीं है, लेकिन काम करने के लिए लगता है और बहुत कुछ बचाना है।


5
वास्तव में ऐसा कभी मत करो। यह IE में ठीक से काम नहीं करता है।
jcbdrn 10:20

2
IE में अंतराष्ट्रिय आवश्यकता के साथ शामिल स्क्रिप्ट्स को उनके विंडो स्कोप से गायब होने पर भी परिभाषित किया गया होगा, जब उन चर को बहाल करने के बाद आवश्यकता कमांड आती है। हम कभी यह पता लगाने में कामयाब नहीं हुए कि ऐसा क्यों हुआ इसलिए हमने इस घिनौने उपाय को छोड़ दिया।
jcbdrn

2
@jcbdrn यह सिर्फ IE पर नहीं है। मैंने देखा है यह अन्य प्लेटफ़ॉर्म पर होता है। कारण यह है कि HTML युक्ति तुल्यकालिक स्क्रिप्ट के निष्पादन के आदेश के बारे में गारंटी प्रदान करता है, लेकिन केवल अन्य सिंक्रोनस स्क्रिप्ट के सापेक्ष । यह तुल्यकालिक एक (या इसके विपरीत) के सापेक्ष अतुल्यकालिक स्क्रिप्ट के निष्पादन की गारंटी नहीं देता है । तो यहां उत्तर में दिखाए गए कोड में, किसी भी दो scriptतत्वों के बीच एक अतुल्यकालिक स्क्रिप्ट निष्पादित करना संभव है ।
लुइस

यदि आप बंडल js को संपादित करने की क्षमता रखते हैं, तो आप पूरी चीज को इस तरह से लपेट सकते हैं:(function(){ var define = undefined; // the UMD registration code won't find the global 'define' anymore! // generated content goes here })()
पीट थॉर्न

2

या आप इस दृष्टिकोण का उपयोग कर सकते हैं।

  • अपने कोड बेस में आवश्यकता जोड़ें
  • फिर उस कोड के माध्यम से अपनी स्क्रिप्ट लोड करें

<script data-main="js/app.js" src="js/require.js"></script>

यह आवश्यकता को पूरा करने के बाद आपकी स्क्रिप्ट को लोड करेगाjs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.