2013-07-10 15 views
10

तो HAML 4 includes a coffeescript filter है, जो हमें की अनुमति देता है कॉफी प्यार रेल लोग इस तरह स्वच्छ काम करने के लिए:उपयोग करने के प्रदर्शन के प्रभाव: HAML टेम्पलेट्स के अंदर कॉफ़ेस्क्रिप्ट फ़िल्टर?

- word = "Awesome." 

:coffeescript 
    $ -> 
    alert "No semicolons! #{word}" 

मेरा प्रश्न: अंत उपयोगकर्ता के लिए, बराबर :javascript फिल्टर का उपयोग कर की तुलना में इस धीमी है? कॉफ़ीस्क्रिप्ट फ़िल्टर का उपयोग करने का मतलब है कि कॉफ़ीस्क्रिप्ट को प्रत्येक पृष्ठ लोड पर जावास्क्रिप्ट में संकलित किया जाएगा (जो स्पष्ट रूप से एक प्रदर्शन आपदा होगी), या क्या यह केवल एक बार होता है जब एप्लिकेशन शुरू होता है?

उत्तर

15

यह निर्भर करता है।

जब हैम्ल फ़िल्टर को संकलित करता है तो यह देखने के लिए जांचता है कि फ़िल्टर टेक्स्ट contains any interpolation (#{...}) है। यदि कोई नहीं है तो यह प्रत्येक अनुरोध को बदलने के लिए एक ही पाठ होगा, इसलिए रूपांतरण संकलन समय पर एक बार किया जाता है और परिणाम टेम्पलेट में शामिल होता है।

यदि वहां फ़िल्टर पाठ में इंटरपोलेशन है, तो प्रत्येक पाठ पर बदलने के लिए वास्तविक पाठ अलग-अलग होगा, इसलिए कॉफ़ीस्क्रिप्ट को प्रत्येक बार संकलित करने की आवश्यकता होगी।

यहां एक उदाहरण है। कोई प्रक्षेप के साथ पहली:

:coffeescript 
    $ -> 
    alert "No semicolons! Awesome" 

इस कोड उत्पन्न करता है (उत्पन्न रूबी कोड को देखने के लिए haml -d का उपयोग करें):

_hamlout.buffer << "<script>\n (function() {\n $(function() {\n  return alert(\"No semicolons! Awesome\");\n });\n \n }).call(this);\n</script>\n"; 

इस कोड को बस बफर के लिए एक स्ट्रिंग कहते हैं, इसलिए कोई Coffeescript कंपाइल किया जा रहा है ।

प्रक्षेप के साथ

अब:

- word = "Awesome." 

:coffeescript 
    $ -> 
    alert "No semicolons! #{word}" 

यह उत्पन्न करता है:

word = "Awesome." 
_hamlout.buffer << "#{ 
find_and_preserve(Haml::Filters::Coffee.render_with_options(
"$ -> 
    alert \"No semicolons! #{word}\"\n", _hamlout.options)) 
}\n"; 

यहाँ, के बाद से Haml देखने के लिए प्रक्षेप का मूल्य, Coffeescript हर बार कंपाइल किया जाता है प्रतीक्षा करने के लिए की जरूरत है।

आप अपने :coffeescript फ़िल्टर के अंदर कोई इंटरपोलेशन न होने पर प्रत्येक अनुरोध पर कॉफ़ीस्क्रिप्ट को संकलित करने से बच सकते हैं।

:javascript फिल्टर इसी तरह व्यवहार करती है, अगर कोई प्रक्षेप है देखने के लिए जाँच, लेकिन जब से :javascript फिल्टर केवल बफर के लिए कुछ पाठ आउटपुट जब इसे चलाता द्वारा इसका उपयोग एक प्रदर्शन हिट की बहुत कम है। आप संभवतः :javascript और :coffeescript फिल्टर जोड़ सकता, :javascript में अंतर्वेशित डेटा डालने और अपने :coffeescript स्थिर रखते हुए:

- word = "Awesome" 

:javascript 
    var message = "No semicolons! #{word}"; 

:coffeescript 
    alert message 
+0

शानदार प्रतिक्रिया। धन्यवाद! –

4

मैट का जवाब क्या चल रहा है पर स्पष्ट है। मैंने एक हैश से :coffeescript फ़िल्टर में स्थानीय लोगों को जोड़ने के लिए एक सहायक बनाया। इस तरह आपको वैश्विक जावास्क्रिप्ट चर का उपयोग करने की आवश्यकता नहीं है। एक साइड नोट के रूप में: लिनक्स पर, मंदी वास्तव में नगण्य है। हालांकि विंडोज़ पर, प्रदर्शन पर असर काफी महत्वपूर्ण है (प्रति ब्लॉक 100 एमएमएस से अधिक आसानी से संकलित करने के लिए)।, कोड वास्तव में सामान्य रूप में संकलित किया गया है

= coffee_with_locals "test" => "hello ", :something => ["monde", "mundo", "world"], :signs => {:interogation => "?", :exclamation => "!"} do 
    :coffeescript 
    alert(test + something[2] + signs['exclamation']) 

चूंकि कोई interpollation है:

module HamlHelper 
    def coffee_with_locals locals={}, &block 
    block_content = capture_haml do 
     block.call 
    end 

    return block_content if locals.blank? 

    javascript_locals = "\nvar " 
    javascript_locals << locals.map{ |key, value| j(key.to_s) + ' = ' + value.to_json.gsub('</', '<\/') }.join(",\n ") 
    javascript_locals << ";\n" 

    content_node = Nokogiri::HTML::DocumentFragment.parse(block_content) 
    content_node.search('script').each do |script_tag| 
     # This will match the '(function() {' at the start of coffeescript's compiled code 
     split_coffee = script_tag.content.partition(/\(\s*function\s*\(\s*\)\s*\{/) 
     script_tag.content = split_coffee[0] + split_coffee[1] + javascript_locals + split_coffee[2] 
    end 

    content_node.to_s.html_safe 
    end 
end 

यह आपको निम्न कार्य करने की अनुमति देता है।

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