29

आप मॉड्यूल पद्धति का उपयोग कर और कुछ इस तरह है तोः"सख्त उपयोग" रखने के लिए Google क्लोजर कंपाइलर को कैसे बल दें; संकलित जेएस कोड में?

(function() { 
    "use strict"; 
    // this function is strict... 
}()); 

और गूगल बंद संकलक का उपयोग कर कोड संकलन, "use strict"; निर्देश यह संकलित फ़ाइल में नहीं होगा।

तो आप क्लोजर कंपाइलर को ES5/सख्त निर्देश को हटाने से कैसे रोकते हैं?

(ध्यान दें कि मैं ES5/सख्त मोड को लागू करने के अन्य मोड का उपयोग नहीं करना चाहता, जो संकलित फ़ाइल की पहली पंक्ति में "सख्त उपयोग" को जोड़ना है। मैं मॉड्यूल का उपयोग करना चाहता हूं here वर्णित पैटर्न।)

उत्तर

9

यह सबसे बड़ा जवाब नहीं है, लेकिन जहां तक ​​मैं यह कह सकता हूं कि यह क्लोजर कंपाइलर का ज्ञात मुद्दा या "फीचर" (आपके परिप्रेक्ष्य के आधार पर) है। इसमें शामिल कुछ समस्याओं में से partial explanation है। एक जोड़े का उल्लेख यह है कि फ़ाइल फ़ाइलों के सख्त मोड घोषणाओं को संरक्षित करने का कोई तरीका नहीं है जब एकाधिक फाइलें संयुक्त होती हैं, और कंपाइलर की फ़ंक्शन इनलाइनिंग सुविधा फ़ंक्शन-स्तरीय सख्त मोड घोषणाओं के दायरे को तोड़ देती है। चूंकि "सख्त उपयोग" घोषणाओं का व्यवहार संकलित कोड में अप्रत्याशित/गलत होगा (संभावित रूप से प्रोग्राम तोड़ना जब सख्त मोड को गैर-सख्त कोड में गलत तरीके से गलत किया जाता है), संकलक उन्हें किसी अन्य मृत कोड की तरह स्ट्रिप करता है।

ऐसा लगता है कि संकलक में ईसीएमएस्क्रिप्ट 5 सख्त मोड चेक को पूरी तरह कार्यान्वित करने का विचार किया गया है (जिस स्थिति में संकलित कोड से इसे हटाने के लिए कोई नकारात्मक पक्ष नहीं होगा), लेकिन यह अभी तक नहीं है।

SIMPLE_OPTIMIZATIONS में संकलन ADVANCED_OPTIMIZATIONS के बजाय मृत कोड हटाने को अक्षम कर देगा, लेकिन मुझे संदेह है कि आप पहले से ही यह जानते हैं।

+3

अद्यतन: नीचे बेन Challenor के जवाब नई 'सही' जवाब हो रहा है। खतरनाक कामकाज के लिए –

-1

सख्त मोड डिबगिंग के लिए उपयोगी है, और जब तक यह हर प्रमुख ब्राउज़र में गोद लेने को नहीं देखता है तब तक और कुछ नहीं। जब तक क्लोजर कंपाइलर टैग को हटा देता है तब तक उपयोगी होने का युग वैसे भी होता है। मुझे यकीन है कि वे उस सुविधा को वास्तव में उपयोगी होने से पहले लंबे समय तक टैग को संरक्षित करने के लिए संकलक को अपडेट करेंगे।

0

मॉड्यूल रैपर बनाने के लिए आप कंपाइलर के आउटपुट रैपर का उपयोग करते हैं और वहां "सख्त उपयोग" निर्देश शामिल करते हैं।

7

खतरनाक। उन्नत मोड में क्लोजर कंपाइलर सख्त-मोड संगत नहीं है, जिसका अर्थ है कि संकलक ECMAScript 262 rev 3 नियमों के आधार पर कोड को फिर से लिख देगा। सख्त मोड के लिए कुछ नियम बदल दिए गए हैं (उदा। "यह" अज्ञात कार्यों, स्कोप रिज़ॉल्यूशन इत्यादि में बाध्यकारी) जो क्लोजर कंपाइलर गलत भाषा धारणाओं के कारण गलत तरीके से कोड को फिर से लिखता है तो कोड टूटने का कारण बन जाएगा।

संक्षिप्त उत्तर (और क्लोजर कंपाइलर का आधिकारिक उत्तर) है: ऐसा मत करो।

आप वास्तव में सिर्फ फावड़ा चाहते हैं एक वहाँ "का उपयोग सख्त" स्ट्रिंग, कोशिश:

eval('"use strict";'); 
+3

+1। –

50

अद्यतन: सख्त मोड अब संकलक में समर्थित है।

बस --language_in=ECMASCRIPT5_STRICT का उपयोग करें।

संदर्भ:

http://code.google.com/p/closure-compiler/issues/detail?id=69

http://code.google.com/p/closure-compiler/source/detail?r=873

http://code.google.com/p/closure-compiler/source/detail?r=1114

+0

क्या इसके लिए कोई टिप्पणी है? – ryanve

+0

प्रारंभिक जांच से, ऐसा प्रतीत होता है कि बंद करने वाला कंपाइलर अनावश्यक "सख्त उपयोग" नहीं करेगा; इस मोड में समेकित फ़ाइलों से बयान ... –

+0

के बारे में जागरूक होने का मूल्य यह भी प्रतीत होता है कि यह 'सख्त उपयोग' जोड़ देगा; शीर्ष पर यदि यह पहले से नहीं है। साफ! –

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