2010-11-28 12 views
6

क्लोजर कंपाइलर फ़ंक्शन को रेखांकित कर रहा है, लेकिन कोड का आकार छोटा है यदि उस फ़ंक्शन को रेखांकित नहीं किया गया है (मुझे केवल कोड आकार की परवाह है - यह JS1k के लिए है)। क्या मैं संकलक को बता सकता हूं कि मैं उस फ़ंक्शन को रेखांकित नहीं करना चाहता हूं?क्या Google क्लोजर कंपाइलर * नहीं * इनलाइन कुछ फ़ंक्शंस बनाना संभव है?

संपादित करें:

function lineTo(x,y) { 
    a.lineTo(x,y); 
} 

जहां कैनवास संदर्भ में a: बस थोड़ा बेहतर व्याख्या करने के लिए, यहाँ मेरी सुविधा नहीं होती। चूंकि कोड में इतने सारे a.lineTo एस हैं, इसलिए इस फ़ंक्शन का उपयोग करने के लायक है। इस तरह, मेरा कोड 101 9 बाइट्स है (और सभी lineTo एस a.lineTo द्वारा प्रतिस्थापित किए गए हैं)। अगर मैं करने के लिए समारोह को बदलने:

function lineTo(x,y) { 
    a.lineTo(x,y); 
    console.log(); 
} 

नई लाइन किसी भी तरह संकलक बलों इस समारोह है, जो मुझे 993 बाइट्स देता अनुरूप नहीं है। तो अगर मैं console.log(); से छुटकारा पा सकता हूं तो मैं एक और 14 बाइट्स बचाऊंगा।

+1

http://code.google.com/intl/hi/closure/compiler/docs/compilatio n_levels.html "कंपाइलर केवल कार्यों को रेखांकित करता है जब यह निर्धारित करता है कि इनलाइनिंग सुरक्षित है और अंतरिक्ष बचाती है।" ... हो सकता है कि दस्तावेज़ गलत है या शिकायतकर्ता में बग है। – timdream

+0

@timdream मेरा संपादन देखें - ऐसा लगता है कि यह स्वचालित रूप से एक-लाइन फ़ंक्शन को रेखांकित कर देगा, भले ही इनलाइन करने से तुलना में आकार बढ़ाना। – Skilldrick

+0

समझ गया! धन्यवाद। – timdream

उत्तर

4
the tutorial से

:

हैं ... आप पाते हैं कि बंद संकलक कार्यों आप रखना चाहते हैं, वहाँ इसे रोकने के लिए दो तरीके हैं को हटा रहा है:
* ले जाएँ अपने कार्य द्वारा संसाधित कोड में कॉल क्लोजर कंपाइलर।
* उन प्रतीकों को निर्यात करें जिन्हें आप रखना चाहते हैं।

आप शायद चाहते हैं दूसरा, जो discussed here है, लेकिन मूल रूप से नीचे स्पष्ट रूप से एक window संपत्ति के रूप में सेट करने के लिए आता है:

function foo() { 
} 
window['foo'] = foo; 

अपने JS1k प्रस्तुत करने के लिए, तुम सिर्फ अंतिम पंक्ति को बंद रखना होगा चाहते हैं क्योंकि यह अनियंत्रित है। ध्यान दें कि क्लोजर अभी भी फ़ंक्शन का नाम बदल देगा, लेकिन जैसे ही यह a नाम के साथ आपके प्रतीकों का नाम बदलना शुरू कर देता है और वहां से जारी रहता है, तो आपके नाम अधिक समग्र रूप से बनाने की संभावना नहीं है।

आप online compiler service के साथ इसे आजमा सकते हैं। आप में पेस्ट करेंगे, तो:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 
function hello(name) { 
    alert('Hello, ' + name); 
} 
hello('New user'); 

... संकलित परिणाम

alert("Hello, New user"); 

है लेकिन अगर आप को समाप्त करने के

window['hello'] = hello; 

... जोड़ने के लिए, संकलित परिणाम है:

function a(b){alert("Hello, "+b)}a("New user");window.hello=a; 
+0

"इनलाइनिंग" जैसी ही चीज़ को "हटा रहा है"? –

+0

@ रॉबर्ट: नहीं, उनका मतलब मृत कोड हटाने का भी अर्थ है। लेकिन यह इनलाइनिंग को भी रोकता है। –

+1

इस तरह के काम करता है।मुझे 995 बाइट्स मिलते हैं, क्योंकि यह आउटपुट में 'window.lineTo = n;' उत्पन्न करता है, जो अनावश्यक है। – Skilldrick

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