9

आज मैंने अपने अपग्रेड किए गए रेल 2.3.x -> 3.1 (आरसी 4) ऐप को हमारे परीक्षण पर्यावरण में तैनात करने के बाद, हमारी सभी स्टाइलशीट्स और जावास्क्रिप्ट फाइलें 404 त्रुटियां लौट रही थीं। हमने रेक संपत्तियों को जोड़ा था: हमारी पोस्ट-तैनाती स्क्रिप्ट के लिए प्रीकंपाइल कार्य और यह निर्धारित करने में कुछ समय लगा कि संपत्ति फ़ोल्डर में पूर्व-संकलित फाइलें क्यों नहीं थीं।रेल 3.1 संपत्ति पाइपलाइन - सार्वजनिक/परिसंपत्तियों से लापता फाइलें - यह डिफ़ॉल्ट क्यों नहीं है?

अंत में, फ़ाइलों को संकलित नहीं किया जा रहा था क्योंकि स्पष्ट रूप से केवल application.css और application.js (+ गैर JS/CSS फ़ाइलें) डिफ़ॉल्ट रूप से संसाधित होते हैं।

config.assets.precompile += %w(*.js *.css) 

प्रश्न:: क्यों यह डिफ़ॉल्ट नहीं है

हम इस प्रकार निम्नलिखित विन्यास मान बदलने के लिए की जरूरत है?

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

क्या कोई कारण है कि यह प्रीकंपाइल कॉन्फ़िगरेशन के लिए एक अच्छा मूल्य क्यों नहीं होगा?

धन्यवाद!

उत्तर

9

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

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

यह रेल के लिए शामिल करने का एक विवादास्पद निर्णय था, लेकिन डिफ़ॉल्ट रूप से कॉफीस्क्रिप्ट भी शामिल है। रेल हमेशा इस तरह एक रायबद्ध ढांचा रहा है।

+0

धन्यवाद, क्रिस, उत्तर के लिए पोस्ट अपडेट किया गया। मुझे लगता है कि यह दक्षता के लिए HTTP अनुरोधों को कम करने के लिए समझ में आता है, लेकिन मुझे लगता है कि अधिकांश अनुप्रयोगों में उनके सीएसएस को कम से कम आंतरिक/बाहरी स्टाइलशीट और मॉड्यूलर जावास्क्रिप्ट फाइलों में विभाजित किया जाता है। यह रेलवे ढांचे के बाकी हिस्सों से संबंधित तरीके से वास्तविक बदलाव की तरह लगता है, लेकिन डिफ़ॉल्ट पर आधारित, यह निश्चित रूप से प्रकट होता है कि यह सोच रहा होगा। – shedd

+0

ठीक है, कोई निश्चित रूप से मॉड्यूलर में अपनी फ़ाइलों को काटना चाहता है। विचार यह है कि application.js और application.css में "शामिल हैं" जो उन निर्देशिकाओं में सभी विशिष्ट जावास्क्रिप्ट और सीएसएस में खींचते हैं (यदि आप उन फ़ाइलों को देखते हैं, तो आपको एक 'requ_tree' निर्देश मिलेगा, जो खींचता है उस निर्देशिका में सबकुछ और उसके सभी बच्चे)। –

+0

अधिकांश रेल ऐप्स में वास्तव में सीएसएस को विभिन्न स्टाइलशीट में विभाजित नहीं किया जाता है - कम से कम ग्राहक को वितरित किया जाता है। पृथक स्रोत सीएसएस (और जेएस) को संपत्ति पाइपलाइन द्वारा एक समग्र application.css (या .js) में संकलित किया जाता है। फिर भी, मैं आपके साथ सहमत हूं कि रेल डिफॉल्ट क्या होना चाहिए - अगर (* .js * .css) डिफ़ॉल्ट थे, तो यह अभी भी ठीक काम करेगा या इसे करने का 'सुझाया गया' तरीका होगा, लेकिन यह भी काम करेगा आप क्या करने की कोशिश कर रहे थे। मुझे लगता है कि रेल के पहले संस्करण वास्तव में काम करते थे जैसा आपने सुझाव दिया था, लेकिन उन्होंने इसे हाल ही में बदल दिया, शायद अच्छे कारणों से हम सोच नहीं रहे हैं। – jrochkind

0

नई स्पॉकेट-आधारित पाइपलाइन संकलित/asssets/स्टाइलशीट्स और/परिसंपत्तियों/जावास्क्रिप्ट में सभी फ़ाइलों को संकलित करता है, क्रमशः, डिफ़ॉल्ट रूप से application.css और application.js में संकलित हो जाता है।

अपने विचारों में, आपको केवल एप्लिकेशन फ़ाइलों को लिंक करने की आवश्यकता है, sprockets बाकी को संभालती है।

अद्यतन: ठीक है, आपको इसे केवल एक फ़ाइल में नहीं बनाना है ... आप एक साझा.जेएस, सुरक्षित.जेएस और public.js प्राप्त कर सकते हैं और उनमें से प्रत्येक को उनके इच्छित हिस्सों को शामिल करना होगा। ..

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

'प्रीकंपाइल' कार्य बस उन प्रकट फ़ाइलों को चलाता है और एकाधिक फ़ाइलों को एक में संकलित करता है, जबकि प्री-प्रोसेसिंग और सास या कॉफी स्क्रिप्ट यह पूरे हो जाता है।

+0

धन्यवाद, कॉलिन। हां, मैंने इसे समझ लिया, लेकिन सवाल उससे परे थोड़ा सा जांच कर रहा था। – shedd

+0

अच्छी तरह से, उत्तर के लिए थोड़ी अधिक अंतर्दृष्टि – colinross

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