2013-01-18 38 views
30

के साथ छोटा नहीं किया जा सकता है हम बंडलों और न्यूनीकरण के साथ एएसपी.नेट वेब अनुकूलन फ्रेमवर्क का उपयोग कर रहे हैं। एक बंडल में सिर्फ jquery और modernizr शामिल है। यह सब jquery 1.8.3 के साथ ठीक काम करता था, लेकिन चूंकि हमने 1.9.0 तक अपडेट किया है, संयोजन jquery/modernizer बंडल अब और काम नहीं कर रहा है।jquery 1.9.0 और आधुनिकइज़र को एएसपी.नेट वेब ऑप्टिमाइज़ेशन फ्रेमवर्क

bundles.Add(new ScriptBundle("~/st-scripts-load-first.js") 
     .Include("~/Resources/JavaScript/jquery-1.9.0.js", 
       "~/Resources/JavaScript/modernizr.form-placeholder.js")); 

हम निर्देशिका में दोनों jQuery-1.9.0.js और jQuery-1.9.0.min.js है। यदि कोई .min फ़ाइल नहीं है तो ऑप्टिमाइज़ेशन फ्रेमवर्क स्वचालित रूप से एक उत्पन्न करेगा। यह काम नहीं करता है अगर .min फ़ाइल है या नहीं।
यह काम करता है अगर संकलन डीबग = "सत्य" और कोई कमी या बंडल नहीं है।

/* Minification failed. Returning unminified contents. 
(5,2-3): run-time warning JS1195: Expected expression: * 
(11,60-61): run-time warning JS1004: Expected ';': { 
(395,2-3): run-time warning JS1195: Expected expression:) 
(397,21-22): run-time warning JS1004: Expected ';': { 
(397,4590-4591): run-time warning JS1195: Expected expression:) 
(398,28-29): run-time warning JS1195: Expected expression:) 
(398,84-85): run-time warning JS1002: Syntax error: } 
(402,44-45): run-time warning JS1195: Expected expression:) 
(408,1-2): run-time warning JS1002: Syntax error: } 
(393,5-22): run-time warning JS1018: 'return' statement outside of function: return Modernizr; 
(404,5,406,16): run-time warning JS1018: 'return' statement outside of function: return !!('placeholder' in (Modernizr.input || document.createElement('input')) && 
       'placeholder' in (Modernizr.textarea || document.createElement('textarea')) 
      ); 
*/ 
+0

क्या आप '1.8.3' के बजाय' 1.9.min' का उपयोग कर रहे हैं? – Mooseman

+2

क्या वास्तव में _is काम नहीं कर रहा है? – jrummell

+0

हमारे पास निर्देशिका में 1.9 और 1.9.min दोनों हैं। डीबग = झूठी अगर बंडलिंग फ्रेमवर्क स्वचालित रूप से .min का उपयोग करेगा। मैंने कुछ और विवरण और त्रुटि कोड जो मिनीफिकेशन फ्रेमवर्क उत्पन्न किया है, के साथ प्रश्न अपडेट किया है। – Remy

उत्तर

72

मुझे यकीन है कि आपकी समस्या का कारण jQuery-1.9.0.min.js की अंतिम पंक्ति है हूँ। मैं एक मिनट में क्यों समझाऊंगा।

मैं अपने आप को देखा है कि jQuery-1.9.0.min.js अन्य फ़ाइल के साथ आता है जब - और यह कि अन्य फ़ाइल इस प्रकार jQuery-1.9.0.min.js - उसके बाद निम्न जे एस फ़ाइल है, बोलने के तरीके में, दूषित।

कारण यह है कि निम्न फ़ाइल की शुरुआत "// @" jQuery की रेखा में संलग्न है, जिसका अर्थ है कि यह तब एक लंबी, विस्तारित टिप्पणी बन जाती है। आपके मामले में इस का मतलब है कि Modernizr के शुरू में

window.Modernizr=function(n,t,i){function... 

स्क्रिप्ट एक टिप्पणी तो की तरह के रूप में बंडलिंग प्रक्रिया से outputed गया था:

//@ sourceMappingURL=jquery.min.map window.Modernizr=function(n,t,i){function... 

इस संबंध में एक discussion on jQuery's Bug Tracker है।

/* 
//@ sourceMappingURL=jquery.min.map 
*/ 

इसके अलावा, आप देख सकते हैं कि Modernizr भी अपने minified संस्करण के अंत में एक स्रोत मानचित्र में शामिल हैं:

दिखाई देने वाले विकल्प है कि या तो अंतिम पंक्ति को हटाने के लिए या बहु लाइन टिप्पणी प्रतीकों में लपेट कर रहे हैं । और अच्छे कारण के साथ।

इसके पीछे तर्क एक समस्या को डीबग करने में आपकी सहायता करना है जब कोड के minified संस्करण का उपयोग किया गया है। यह पंक्ति ब्राउज़र को बताती है कि यह छोटा फ़ाइल फ़ाइल किसी अन्य फ़ाइल में है जो डिबगिंग में सहायता कर सकती है। इसका लाभ उठाने के लिए आपको सर्वर पर उस संदर्भित फ़ाइल (jquery.min.map) की आवश्यकता है या क्लाइंट को डाउनलोड किया जाना चाहिए। इसके अलावा, मेरा मानना ​​है कि क्रोम वर्तमान में इसका समर्थन करने वाला एकमात्र ब्राउज़र है; यह अभी भी फ़ायरफ़ॉक्स पर विकास में है।

This page में स्रोत मानचित्र का एक उत्कृष्ट स्पष्टीकरण है।

तो संक्षेप में, इसे हटाने से आपको वास्तव में कोई समस्या नहीं आनी चाहिए जब तक कि आप ब्राउज़र में डिबगिंग करते समय स्रोत के मूल संस्करण पर वापस मैप करना नहीं चाहते हैं। आपके मामले में, एएसपी.NET के ऑप्टिमाइज़ेशन फ्रेमवर्क के तरीके के कारण, डीबग = "ट्रू" यह किसी भी तरह से अपूर्ण संस्करणों की सेवा करेगा, इसलिए आपको शायद स्रोत MappingURL का उपयोग करने की आवश्यकता नहीं है।

+0

ग्रेट उत्तर। धन्यवाद! –

+0

Thx। इसे 1.9.1 में तय किया जाएगा: http://bugs.jquery.com/ticket/13274 –

+6

jquery में तय है लेकिन jquery.migrate में नहीं :( – TheVillageIdiot

0

कुछ modernizr.form-placeholder.js की अपनी प्रतिलिपि के साथ गलत हो सकता है।

मैं jquery.peity.js लोड करने की कोशिश कर रहा एक ही त्रुटि में भाग गया।

जब मैंने लाइब्रेरी को हटा दिया, पृष्ठ ठीक से लोड हो गया। तो मैं बस गया और अपनी साइट से कच्चे जेएस पकड़ लिया और फ़ाइल को दोबारा हटा दिया और यह कोई समस्या नहीं है।

//@ sourceMappingURL=jquery.min.map 

jQuery 1.9 के unminified संस्करण इस शामिल नहीं है:

+0

यदि आपने फ़ाइल को स्वयं छोटा कर दिया है तो हाँ, न्यूनतम संस्करण में शायद स्रोत मानचित्र संदर्भ शामिल नहीं होगा। SourceMappingURL केवल कुछ minification इंजनों द्वारा और इसके ध्वनियों द्वारा शामिल किया गया है, न कि आपके द्वारा उपयोग किए जाने वाले द्वारा। – awj

6

मैं ऊपर, awj के उत्तर का जवाब देने में असमर्थ था, इसलिए मैंने इसे अभी वोट दिया। जासूस काम का शानदार टुकड़ा। मैं एक टिप्पणी में जोड़ना चाहता था, जबकि समस्या वास्तव में jquery 1.9.1 में तय की गई थी, यह अब jquery-migrate-1.1.0

में दिखाई देता है मैंने मानचित्र फ़ाइल संदर्भ केवल एक पंक्ति के रूप में देखा "jquery-migrate-1.1.0.min.js" फ़ाइल के अंत में टिप्पणी करें। तो awj के सुझाव के बाद मैंने इसे एक बहु-पंक्ति टिप्पणी की।

तो लाइन 3:

//@ sourceMappingURL=dist/jquery-migrate.min.map 

अब लाइनों 3, 4 हो जाता है, और 5 इस प्रकार है:

/* 
//@ sourceMappingURL=dist/jquery-migrate.min.map 
*/ 

एक बार मैं अपनी आईएसपी पर अपलोड मैं पूरी ajax कार्यक्षमता फिर से की है।

फिर से धन्यवाद, एडब्ल्यूजे, इससे काफी मदद मिली है!

3

उत्तर पढ़ना, यहां तक ​​कि स्वीकृत उत्तर, इस समस्या का सलाह दिया गया समाधान आपकी स्क्रिप्ट को संशोधित करना है ताकि बंडलर को इसमें कोई परेशानी न हो। यह मेरे लिए कोई मतलब नहीं है, यह स्पष्ट रूप से बंडलर की एक बग अलग स्क्रिप्ट ठीक श्रृंखलाबद्ध नहीं, विशेष रूप से बंडलर एक परेशानी होती है जब n स्क्रिप्ट की अंतिम पंक्ति एक सामान्य लाइन टिप्पणी

// this is the last line of the n script 

और फिर अपने है बनाता है अगली बार स्क्रिप्ट एकरेखीय टिपण्णी के साथ

function(){ var ... 

बंडलर शुरू नहीं करता है, डिफ़ॉल्ट एक के रूप में एक ; के साथ विन्यस्त कर रहा है ConcatenationToken तो बंडल कोड कुछ इस तरह किया जा रहा समाप्त होता है:

// this is the last line of the n script;function(){ var ... 

निश्चित रूप से स्क्रिप्ट लोडिंग कहीं सिंटैक्स त्रुटि के साथ विफल हो जाती है।

यह एक इनलाइन टिप्पणी नहीं होने के लिए स्क्रिप्ट की नवीनतम पंक्ति को संशोधित करने का प्रस्ताव दिया गया है, इसे एक बहुआयामी टिप्पणी दें, इसलिए जब कोड */ के साथ समाप्त होता है तो पार्सर फ़ंक्शन घोषणा या कुछ और ठीक बाद ठीक होगा यह।

मैं अपने स्क्रिप्ट को संशोधित पसंद नहीं है, कई किसी और (jQuery, आदि) द्वारा लेखक हैं और मैं करते हैं, उन्हें संशोधित नहीं करना चाहता क्या अगर मैं उन्हें उन्नत करने के लिए है और फिर से मैं के बाद इस बग मिलेगा एक वेबसाइट अपग्रेड करें और यह कॉन्फ़िगरेशन में debug="true" के साथ नहीं चलती है।

मैं मेरे

bundles.Add(new ScriptBundle("~/bundles/mobile") { 
       ConcatenationToken = ";\r\n" } 
     .Include("~/Scripts/jquery-1.11.3*", 
       "~/Scripts/jquery-timeago*", 
       "~/Scripts/jquery.mobile-1.4.5*", 

इस तरह हम बंडलर मजबूर हमेशा एक नई लाइन चरित्र के साथ स्क्रिप्ट को अलग करने के लिए इस समाधान बेहतर काम के साथ आते हैं। इसे डिफ़ॉल्ट रूप से ऐसा करना चाहिए जब पिछली लिपि की अंतिम पंक्ति एक पंक्ति टिप्पणी है।

+0

अच्छा विचार! साझा करने के लिए धन्यवाद। – Remy

+0

शायद यह छोटी सी बात ConcatenationToken = ";" + Environment.NewLine लेकिन इस संपूर्ण समाधान के अलावा! –