2013-02-01 17 views
5

मेरे पास एक साधारण मेवेन वेबपैप है जो एक एकल जेएसपी और आवश्यकताजेस का उपयोग करता है ताकि एकल पृष्ठ जावास्क्रिप्ट-हेवी ऐप की सेवा हो सके। मैं उस चीज़ के लिए चारों ओर देख रहा हूं जिसे मैं बिल्ड प्रक्रिया (.js, .css, आदि) के दौरान फिंगरप्रिंट संपत्तियों में उपयोग कर सकता हूं लेकिन इस समस्या को हल करने वाले कुछ भी नहीं ढूंढ रहे हैं।एक मेवेन/जेएसपी/RequJS Webapp में फिंगरप्रिंटिंग संपत्तियां?

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

कोई सुझाव?

उत्तर

2

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

  1. pom.xml में:

    <properties> 
        (...) 
        <build.version>${maven.build.timestamp}</build.version> 
    </properties> 
    
  2. मुख्य JSP फ़ाइल में

    :

    <script type="text/javascript"> 
        var require = { 
         (...) 
         urlArgs: 'v=${build.version}', 
        }; 
    </script> 
    
    <link rel="stylesheet" type="text/css" href="style.css?v=${build.version}"></link>  
    <script data-main="app" src="libs/require.js?v=${build.version}"></script> 
    

    यह महत्वपूर्ण है require वस्तु से पहले परिभाषित करने के लिए urlArgs काम करने के लिए require.js आयात

  3. pom.xml, फिर:

    <resources> 
        (...) 
        <resource> 
        <targetPath>${project.build.directory}/filteredWebapp</targetPath> 
        <directory>src/main/webapp</directory> 
        <filtering>true</filtering> 
        </resource> 
    </resources> 
    
  4. r.js के buildconfig (Btw। मैं requirejs-maven-plugin उपयोग कर रहा हूँ Maven और r.js को पाटने के लिए):।

    ({ 
        appDir: '${project.build.directory}/filteredWebapp', 
        dir: '${project.build.directory}/${project.build.finalName}', 
        (...) 
    }) 
    

    मुझे यकीन है कि r.js 'इनपुट बनाने के लिए एक नया फ़ोल्डर (यानी filteredWebapp) में छानने src/मुख्य/webapp का परिणाम स्टोर करने के लिए किया था पहले से ही टाइमस्टैम्प का निर्माण होगा, न कि प्लेसहोल्डर्स। R.js buildconfig का मेरा प्रारंभिक संस्करण स्रोत फ़ाइलों को सीधे src/main/webapp से पढ़ रहा था; यह ठीक काम किया लेकिन Maven छानने को दरकिनार किया गया था

नोट (यानी r.js द्वारा संकलित उत्पादन अभी भी ${build.timestamp} प्लेसहोल्डर निहित।): यदि संभव हो तो सब पर यह शायद इस तंत्र का उपयोग करने के विकास संस्करण कॉन्फ़िगर करने के लिए मुश्किल है (, मैंने कोशिश नहीं की है)। मेरे लिए "v = $ {build.timestamp}" पैरामीटर की उपस्थिति और कैश बस्टिंग की कमी अभ्यास में कोई समस्या नहीं थी, हालांकि।

रास्ते में कई अन्य बाधाएं और नुकसान थे लेकिन मुझे लगता है कि आप उनको हल करने में कामयाब रहे हैं क्योंकि आप केवल विशेष रूप से फिंगरप्रिंटिंग के लिए पूछ रहे हैं। उम्मीद है की वो मदद करदे!

+0

धन्यवाद। मैं उम्मीद कर रहा था की तुलना में यह थोड़ा और अधिक कट्टरपंथी है, लेकिन मैं इसे आज़मा दूंगा। – erturne

1

मैं वास्तव में क्वेरी पैरामीटर का उपयोग "कैश हत्यारा" के रूप में दृढ़ता से हतोत्साहित करता हूं क्योंकि इसके परिणामस्वरूप कैश विषाक्तता कहा जाता है। उदाहरण के लिए: मान लें कि आपके पास सीडीएन या फ्रंट एंड कैशिंग सर्वर और एकाधिक ऐप सर्वर हैं। आप फ़ाइल का एक नया संस्करण अपलोड करते हैं और क्वेरी param को बदलते हैं। हालांकि नई फाइल अभी भी नहीं थी। सभी ऐप सर्वरों को वितरित किया गया। कैश सर्वर तब सर्वरों में से एक पर जाता है (क्योंकि यह देखता है कि क्वेरी पैराम बदल गया है) जिसमें अभी भी एक पुराना संस्करण है, इसे प्राप्त करता है और इसे कैश करता है।तो अब कैश सर्वर और ओल्ड फ़ाइल है जिसमें एक नया कैश हत्यारा अद्यतित सोच रहा है और अब इसे सर्वर से प्राप्त करने का प्रयास नहीं करता है।

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