आवश्यकताएँ आवश्यक कैशिंग से लिपियों को रोकें


302

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

फ़ाइल नाम के अंत में एक querystring परम के रूप में एक संस्करण संख्या को जोड़ने की आम चाल आवश्यकता के साथ काम नहीं करती है <script src="jsfile.js?v2"></script>

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

क्रॉस-प्लेटफ़ॉर्म समाधान:

मैं अब urlArgs: "bust=" + (new Date()).getTime()विकास के दौरान और urlArgs: "bust=v2"उत्पादन के लिए स्वचालित कैश-बस्टिंग के लिए उपयोग कर रहा हूं जहां मैं एक अद्यतन आवश्यक स्क्रिप्ट को रोल करने के बाद हार्ड-कोडित संस्करण संख्या बढ़ाता हूं।

ध्यान दें:

@ डस्टिन गेट्ज़ ने हाल के एक जवाब में उल्लेख किया कि क्रोम डेवलपर टूल डिबगिंग के दौरान ब्रेकपॉइंट को छोड़ देंगे जब जावास्क्रिप्ट फाइलें इस तरह से लगातार ताज़ा होती हैं। debugger;अधिकांश जावास्क्रिप्ट डिबगर्स में एक ब्रेकपॉइंट को ट्रिगर करने के लिए कोड में एक वर्कअराउंड लिखना है।

सर्वर-विशिष्ट समाधान:

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


आपको यकीन है कि यह सर्वर या क्लाइंट कैशिंग नहीं कर रहा है? (अब कुछ महीनों के लिए आवश्यक js का उपयोग किया गया है और कुछ इसी तरह का ध्यान नहीं दिया गया है) IE को MVC एक्शन परिणामों को कैच करने के लिए पकड़ा गया था, क्रोम हमारे html टेम्प्लेट को कैशिंग कर रहा था, लेकिन जेएस फाइलें सभी को ताज़ा करने लगती हैं जब ब्राउज़र कैश रीसेट हो गया है। मुझे लगता है कि यदि आप कैशिंग का उपयोग करना चाह रहे थे, लेकिन आप सामान्य कर सकते हैं क्योंकि आवश्यक js से अनुरोध क्वेरी स्ट्रिंग को हटा रहे थे जो समस्या का कारण हो सकता है?
पीजेयूके

मुझे यकीन नहीं है कि अगर आवश्यकता हो तो इस तरह के वर्जन के वर्जन को हटा दिया जाए। यह मेरा सर्वर हो सकता है। दिलचस्प है कि कैसे आवश्यकता हैJJS हालांकि एक कैश बस्टर सेटिंग है, तो आप इसके बारे में सही हो सकता है आवश्यक फ़ाइलों पर मेरे app संस्करण संस्करण को हटाने।
BumbleB2na

मैंने एक संभावित कैशिंग समाधान के साथ अपना उत्तर अपडेट किया
डस्टिन गेट्ज़ 5

अब मैं आज सुबह अपने ब्लॉग पोस्ट में दिए गए लिटनी में निम्नलिखित जोड़ सकता हूं: कोडरस्पेस.com / dexygen/… और यही नहीं, मुझे न केवल कैश बस्ट जोड़ना होगा, बल्कि आवश्यकता होती है। एक हार्ड रिफ्रेश की उपेक्षा करता है।
डेक्सिजन

मैं इसके लिए उपयोग के मामले में उलझन में हूं .... क्या यह फ्रंट-एंड या एएमडी में हॉट-रीलोडिंग एएमडी मॉड्यूल के लिए है?
अलेक्जेंडर मिल्स

जवाबों:


457

कैश बस्ट करने के लिए स्क्रिप्ट स्क्रिप्ट में से प्रत्येक के लिए मान जोड़ने के लिए आवश्यकताएँ को कॉन्फ़िगर किया जा सकता है।

आवश्यकताएँ दस्तावेज़ से ( http://requirejs.org/docs/api.html#config ):

urlArgs : अतिरिक्त क्वेरी स्ट्रिंग तर्क URL में जोड़े जाते हैं, जो आवश्यकता है संसाधनों का उपयोग करने के लिए। जब ब्राउज़र या सर्वर ठीक से कॉन्फ़िगर नहीं किया जाता है तो कैश बस्ट के लिए सबसे उपयोगी है।

उदाहरण, सभी लिपियों में "v2" जोड़ना:

require.config({
    urlArgs: "bust=v2"
});

विकास के उद्देश्यों के लिए, आप टाइमस्टैम्प को जोड़कर कैश को बायपास करने के लिए रिक्जेस्ट को मजबूर कर सकते हैं:

require.config({
    urlArgs: "bust=" + (new Date()).getTime()
});

46
बहुत मददगार, धन्यवाद। मैं urlArgs: "bust=" + (new Date()).getTime()विकास के दौरान और urlArgs: "bust=v2"उत्पादन के लिए स्वचालित कैश-बस्टिंग के लिए उपयोग कर रहा हूं जहां मैं एक अद्यतन आवश्यक स्क्रिप्ट को रोल करने के बाद हार्ड-कोडित संस्करण संख्या बढ़ाता हूं।
BumbleB2na

9
... प्रदर्शन अनुकूलक के रूप में भी आप (नई तिथि ()) के बजाय Math.random () का उपयोग कर सकते हैं। getTime () यह अधिक सौंदर्य, वस्तु नहीं और थोड़ा तेज jsperf.com/speedcomparison बनाता है
व्लाद त्सेलेवले

2
आप इसे थोड़ा छोटा कर सकते हैं:urlArgs: "bust=" + (+new Date)
mrzmyr

11
मुझे लगता है कि हर बार कैश को नष्ट करना एक भयानक विचार है। दुर्भाग्य से आवश्यकता है एक और विकल्प प्रदान नहीं करता है। हम urlArgs का उपयोग करते हैं लेकिन इसके लिए यादृच्छिक या टाइमस्टैम्प का उपयोग नहीं करते हैं। इसके बजाय हम अपने वर्तमान गिट SHA का उपयोग करते हैं, इस तरह से केवल तभी परिवर्तन होता है जब हम नया कोड तैनात करते हैं।
इवान टोरेस

5
उत्पादन में यह "v2" संस्करण कैसे काम कर सकता है, यदि "v2" स्ट्रिंग प्रदान करने वाली फ़ाइल स्वयं कैश की गई है? यदि मैं उत्पादन में एक नया अनुप्रयोग जारी करता हूं, तो "v3" को जोड़ने से कुछ नहीं होने वाला है, क्योंकि एप्लिकेशन खुशी से कैशेड v2 फ़ाइलों के साथ काम कर रहा है, जिसमें v2 के साथ पुराने कॉन्फ़िगरेशन भी शामिल हैं urlArgs
बेनी बोटेमा

54

इसके लिए urlArgs का उपयोग न करें!

स्क्रिप्ट लोडिंग की आवश्यकता है http कैशिंग हेडर। (लिपियों को एक गतिशील रूप से डाला गया है <script>, जिसका अर्थ है कि अनुरोध किसी भी पुरानी संपत्ति को लोड करने जैसा लगता है।)

विकास के दौरान कैशिंग को अक्षम करने के लिए उचित HTTP हेडर के साथ अपनी जावास्क्रिप्ट संपत्तियों की सेवा करें।

आवश्यकता के urlArgs का उपयोग करने का मतलब है कि आपके द्वारा सेट किए गए किसी भी ब्रेकप्वाइंट को ताज़ा भर में संरक्षित नहीं किया जाएगा; आपको debuggerअपने कोड में हर जगह स्टेटमेंट डालने की आवश्यकता है । खराब। मैं urlArgsgit sha के साथ उत्पादन उन्नयन के दौरान कैश-बस्ट करने वाली संपत्तियों का उपयोग करता हूं ; तब मैं अपनी संपत्ति हमेशा के लिए कैश होने के लिए सेट कर सकता हूं और कभी भी बासी संपत्ति की गारंटी नहीं दे सकता।

विकास में, मैं एक जटिल मॉकजैक्स कॉन्फ़िगरेशन के साथ सभी अजाक्स अनुरोधों का मजाक उड़ाता हूं, फिर मैं अपने ऐप को जावास्क्रिप्ट में केवल एक मोड में 10 पंक्ति पायथन http सर्वर के साथ सभी कैशिंग बंद कर सकता हूं । यह मेरे लिए एक बहुत बड़े "एंटरप्रेसी" अनुप्रयोग के साथ सैकड़ों विश्राम योग्य वेबस्पॉइंट समापन बिंदुओं तक बढ़ा है। हमारे पास एक अनुबंधित डिज़ाइनर भी है जो हमारे वास्तविक उत्पादन कोडबेस के साथ काम कर सकता है और उसे हमारे बैकएंड कोड तक पहुँच प्रदान किए बिना।


8
@ JamesP.Wright, क्योंकि (कम से कम क्रोम में) जब आप किसी ऐसी चीज़ के लिए एक ब्रेकपॉइंट सेट करते हैं जो पेज लोड पर होता है, तो ताज़ा करें पर क्लिक करें, ब्रेकपॉइंट हिट नहीं होता क्योंकि URL बदल गया है और क्रोम ने ब्रेकपॉइंट को गिरा दिया है। मैं एक ग्राहक को केवल इस पर वर्कअराउंड जानना पसंद करूंगा।
ड्रू नॉक

1
धन्यवाद, डस्टिन। यदि आप इस पोस्ट के चारों ओर एक रास्ता मिल जाए। इस बीच आप debugger;अपने कोड में उपयोग कर सकते हैं जहाँ भी आप चाहते हैं कि एक ब्रेकप्वाइंट बना रहे।
BumbleB2na

2
नोड पर HTTP-सर्वर का उपयोग करने वाले किसी के लिए (npm स्थापित http-server)। आप c -c-1 (यानी http-server -c-1) के साथ कैशिंग को भी अक्षम कर सकते हैं।
आपकापाल

5
आप विकास के दौरान डिबगिंग की समस्या से निपटने के लिए Chrome में कैशिंग को अक्षम कर सकते हैं: stackoverflow.com/questions/5690269/…
दीपक जॉय

5
+1 से !!! उत्पादन में उपयोग का आग्रह नहीं !!! । इस मामले की कल्पना करें कि आपकी वेब साइट पर 1000 जेएस फाइलें हैं (हां, संभव है!) और उनका लोड आवश्यक जेएसएस द्वारा नियंत्रित किया जाता है। अब आप v2 या अपनी साइट जारी करते हैं जहाँ केवल कुछ JS फाइलें बदली जाती हैं! लेकिन urlArgs = v2 को जोड़कर, आप सभी 1000 JS फ़ाइलों को फिर से लोड करने के लिए मजबूर करते हैं! आप यातायात का एक बहुत भुगतान करेंगे! केवल संशोधित फ़ाइलों को फिर से लोड किया जाना चाहिए, अन्य सभी को स्थिति 304 (संशोधित नहीं) के साथ जवाब दिया जाना चाहिए।
walv

24

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

मैंने आखिरकार हार मान ली और सीधे अपने ही रिक्वायरमेंट को लागू कर दिया । यदि आप आवश्यक पुस्तकालय के अपने संस्करण को संशोधित करने के लिए तैयार हैं, तो यह समाधान आपके लिए काम कर सकता है।

आप यहाँ पैच देख सकते हैं:

https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67

एक बार जोड़ने के बाद, आप अपनी आवश्यकता के अनुसार कुछ ऐसा कर सकते हैं:

var require = {
    baseUrl: "/scripts/",
    cacheSuffix: ".buildNumber"
}

buildNumberएक संशोधन आईडी / सॉफ्टवेयर संस्करण / पसंदीदा रंग के साथ बदलने के लिए अपने बिल्ड सिस्टम या सर्वर वातावरण का उपयोग करें ।

इस तरह की आवश्यकता का उपयोग करना:

require(["myModule"], function() {
    // no-op;
});

इस फ़ाइल के लिए अनुरोध करने की आवश्यकता होगी:

http://yourserver.com/scripts/myModule.buildNumber.js

हमारे सर्वर वातावरण पर, हम buildNumber को अलग करने और सही JS फ़ाइल परोसने के लिए url rewrite नियमों का उपयोग करते हैं। इस तरह हमें वास्तव में अपनी सभी जेएस फाइलों का नाम बदलने की चिंता नहीं करनी है।

पैच किसी भी स्क्रिप्ट को अनदेखा करेगा जो एक प्रोटोकॉल को निर्दिष्ट करता है, और यह किसी भी गैर-जेएस फ़ाइलों को प्रभावित नहीं करेगा।

यह मेरे पर्यावरण के लिए अच्छी तरह से काम करता है, लेकिन मुझे लगता है कि कुछ उपयोगकर्ता प्रत्यय के बजाय एक उपसर्ग पसंद करेंगे, अपनी आवश्यकताओं के अनुरूप मेरी प्रतिबद्ध को संशोधित करना आसान होना चाहिए।

अपडेट करें:

पुल अनुरोध चर्चा में, आवश्यक लेखक का सुझाव है कि यह संशोधन संख्या को उपसर्ग करने के लिए एक समाधान के रूप में काम कर सकता है:

var require = {
    baseUrl: "/scripts/buildNumber."
};

मैंने यह कोशिश नहीं की है, लेकिन निहितार्थ यह है कि यह निम्नलिखित URL का अनुरोध करेगा:

http://yourserver.com/scripts/buildNumber.myModule.js

जो कई लोगों के लिए बहुत अच्छा काम कर सकता है, जो उपसर्ग का उपयोग कर सकते हैं।

यहां कुछ संभावित डुप्लिकेट प्रश्न दिए गए हैं:

आवश्यकताएँ और प्रॉक्सी कैशिंग

requirement.js - मैं URL के हिस्से के रूप में आवश्यक मॉड्यूल पर एक संस्करण कैसे सेट कर सकता हूं?


1
मैं वास्तव में आपके अपडेट को आधिकारिक आवश्यकताओं के निर्माण के लिए अपना रास्ता बनाना चाहूंगा। आवश्यकता के प्रमुख लेखक भी दिलचस्पी ले सकते हैं, (ऊपर @ लुई का उत्तर देखें)।
BumbleB2na

@ BumbleB2na - PullRequest ( github.com/jrburke/requirejs/pull/1017 ) पर टिप्पणी करने के लिए स्वतंत्र महसूस करें , jrburke में कोई दिलचस्पी नहीं दिख रही थी। वह एक फ़ाइल नाम उपसर्ग का उपयोग कर एक समाधान सुझाता है, मैं इसमें शामिल करने के लिए अपने उत्तर को अपडेट करूंगा।
JBCP

1
अच्छा अद्यतन। मुझे लगता है कि मैं इस सुझाव को लेखक द्वारा पसंद करता हूं, लेकिन यह केवल इसलिए है क्योंकि मैं इस नामकरण सम्मेलन का हाल ही में उपयोग कर रहा हूं /scripts/myLib/v1.1/:। मैंने अपने फ़ाइल नाम में पोस्टफ़िक्स (या उपसर्ग) जोड़ने की कोशिश की, शायद इसीलिए कि jquery क्या करता है, लेकिन उसके कुछ समय बाद मैं [आलसी हो गया] और मूल फ़ोल्डर पर एक संस्करण संख्या बढ़ाना शुरू कर दिया। मुझे लगता है कि एक बड़ी वेबसाइट पर मेरे लिए इसका रखरखाव आसान हो गया है, लेकिन अब आप मुझे URL को फिर से लिखने के बारे में चिंता करना।
BumbleB2na

1
आधुनिक फ्रंट एंड सिस्टम जेएस फाइलों को फिर से लिखता है और फाइलनाम में एमडी 5 राशि के साथ फिर निर्माण करते समय नए फाइलनामों का उपयोग करने के लिए HTML फाइलों को फिर से लिखता है, लेकिन यह विरासत प्रणालियों के साथ मुश्किल हो जाता है जहां फ्रंट एंड कोड सर्वर साइड द्वारा परोसा जाता है।
JBCP

जब मैं jspx फ़ाइल के अंदर कुछ js की आवश्यकता होती है तो यह काम करता है ?, इस तरह<script data-main="${pageContext.request.contextPath}/resources/scripts/main" src="${pageContext.request.contextPath}/resources/scripts/require.js"> <jsp:text/> </script> <script> require([ 'dev/module' ]); </script>
masT

19

अपेक्षित कैश पर समाप्त हो रहा है। डेटा-मुख्य से प्रेरित होकर हमने निम्नलिखित कार्य के साथ अपनी तैनाती स्क्रिप्ट को अद्यतन किया:

<target name="deployWebsite">
    <untar src="${temp.dir}/website.tar.gz" dest="${website.dir}" compression="gzip" />       
    <!-- fetch latest buildNumber from build agent -->
    <replace file="${website.dir}/js/main.js" token="@Revision@" value="${buildNumber}" />
</target>

जहां main.js की शुरुआत की तरह दिखता है:

require.config({
    baseUrl: '/js',
    urlArgs: 'bust=@Revision@',
    ...
});

11

उत्पादन में

urlArgs समस्याओं का कारण बन सकता है!

आवश्यकता के प्रमुख लेखक का उपयोग नहीं करना पसंद करते हैंurlArgs :

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

[स्टाइलिंग मेरा।]

मैं इस सलाह का पालन करता हूं।

विकास में

मैं एक ऐसे सर्वर का उपयोग करना पसंद करता हूं जो समझदारी से उन फ़ाइलों को कैश करता है जो अक्सर बदल सकते हैं: एक सर्वर जो उत्सर्जन करता है Last-Modifiedऔर If-Modified-Sinceजब उचित हो तब 304 के साथ प्रतिक्रिया करता है। यहां तक ​​कि स्थिर फ़ाइलों की सेवा के लिए नोड के एक्सप्रेस सेट पर आधारित एक सर्वर बॉक्स को सही करता है। यह मेरे ब्राउज़र के लिए कुछ भी करने की आवश्यकता नहीं है, और ब्रेकप्वाइंट को गड़बड़ नहीं करता है।


अच्छे अंक लेकिन, आपका जवाब आपके सर्वर वातावरण के लिए विशिष्ट है। हो सकता है कि किसी और के लिए एक अच्छा विकल्प यह है कि यह एक झगड़े के पैरामीटर के बजाय फ़ाइलनाम में एक संस्करण संख्या जोड़ने के लिए हाल की सिफारिश है। उस विषय पर अधिक जानकारी यहां दी गई है: stevesouders.com/blog/2008/08/23/…
BumbleB2na

हम उत्पादन प्रणाली में इस विशिष्ट समस्या के लिए चल रहे हैं। मैं एक पैरामीटर का उपयोग करने के बजाय आपके फ़ाइल नाम को पुन: उपयोग करने की सलाह देता हूं।
JBCP

7

मैंने AskApache से यह स्निपेट लिया और इसे अपने स्थानीय अपाचे वेबसर्वर (मेरे मामले /etc/apache2/others/preventcaching.conf में) की एक अलग .conf फ़ाइल में डाल दिया:

<FilesMatch "\.(html|htm|js|css)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
</FilesMatch>

विकास के लिए यह कोड को बदलने की आवश्यकता के बिना ठीक काम करता है। उत्पादन के लिए, मैं @ dvtoever के दृष्टिकोण का उपयोग कर सकता हूं।


6

विकास के लिए त्वरित सुधार

विकास के लिए, आप क्रोम देव टूल्स में कैश को निष्क्रिय कर सकते हैं ( वेबसाइट विकास के लिए क्रोम कैश को अक्षम करना )। कैश डिसेबल तब ही होता है जब देव टूल्स डायलॉग ओपन होता है, इसलिए आपको हर बार रेगुलर ब्राउजिंग करते समय इस विकल्प को टॉगल करने की चिंता नहीं करनी चाहिए।

नोट: ' urlArgs ' का उपयोग उत्पादन में उचित समाधान है ताकि उपयोगकर्ताओं को नवीनतम कोड प्राप्त हो। लेकिन यह डिबगिंग को कठिन बनाता है क्योंकि क्रोम हर ताज़ा के साथ ब्रेकप्वाइंट को अमान्य करता है (क्योंकि इसकी 'नई' फ़ाइल हर बार सेवा की जाती है)।


3

मैं आवश्यकता के साथ कैश फटने के लिए ' urlArgs ' का उपयोग करने की अनुशंसा नहीं करता। चूंकि यह समस्या को पूरी तरह हल नहीं करता है। एक संस्करण संख्या को अपडेट करने से सभी संसाधनों को डाउनलोड करने में परिणाम होगा, भले ही आपके पास एक एकल संसाधन में परिवर्तन हो।

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

यदि आवश्यक हो तो मैं इस कार्य के लिए कोड स्निपेट साझा कर सकता हूं।


मैं जावास्क्रिप्ट फाइल को फिर से लिखने के लिए ग्रन्ट-फिलेरेव और ग्रंट-कैश-बस्टर के संयोजन का उपयोग करता हूं।
इयान जैमिसन

2

यह है कि मैं इसे Django / फ्लास्क में कैसे कर सकता हूं (आसानी से अन्य भाषाओं / VCS सिस्टम के लिए अनुकूलित किया जा सकता है):

आपके config.py(मैं इसका उपयोग python3 में करता हूं, इसलिए आपको python2 में एन्कोडिंग को ट्विक करने की आवश्यकता हो सकती है)

import subprocess
GIT_HASH = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip().decode('utf-8')

फिर अपने टेम्पलेट में:

{% if config.DEBUG %}
     require.config({urlArgs: "bust=" + (new Date().getTime())});
{% else %}
    require.config({urlArgs: "bust=" + {{ config.GIT_HASH|tojson }}});
{% endif %}
  • मैन्युअल निर्माण प्रक्रिया की आवश्यकता नहीं है
  • git rev-parse HEADऐप के शुरू होने पर केवल एक बार चलता है , और इसे configऑब्जेक्ट में संग्रहीत करता है

0

गतिशील समाधान (urlArgs के बिना)

इस समस्या का एक सरल समाधान है, जिससे आप प्रत्येक मॉड्यूल के लिए एक अद्वितीय संशोधन संख्या लोड कर सकते हैं।

आप मूल रिक्जेस्ट लोड फ़ंक्शन को सहेज सकते हैं, इसे अपने स्वयं के फ़ंक्शन के साथ अधिलेखित कर सकते हैं और अपने संशोधित यूआरएल को फिर से मूल रिक्जेस्ट लोड करने के लिए पार्स कर सकते हैं:

var load = requirejs.load;
requirejs.load = function (context, moduleId, url) {
    url += "?v=" + oRevision[moduleId];
    load(context, moduleId, url);
};

हमारे निर्माण की प्रक्रिया में मैंने सभी मॉड्यूलों के सभी संशोधन के साथ एक मैनिफ़ेस्ट फ़ाइल बनाने के लिए "गल्प-रेव" का उपयोग किया, जिसका उपयोग किया जाता है। मेरे gulp कार्य का सरलीकृत संस्करण:

gulp.task('gulp-revision', function() {
    var sManifestFileName = 'revision.js';

    return gulp.src(aGulpPaths)
        .pipe(rev())
        .pipe(rev.manifest(sManifestFileName, {
        transformer: {
            stringify: function(a) {
                var oAssetHashes = {};

                for(var k in a) {
                    var key = (k.substr(0, k.length - 3));

                    var sHash = a[k].substr(a[k].indexOf(".") - 10, 10);
                    oAssetHashes[key] = sHash;
                }

                return "define([], function() { return " + JSON.stringify(oAssetHashes) + "; });"
            }
        }
    }))
    .pipe(gulp.dest('./'));
});

यह मॉड्यूल नामों में संशोधन संख्या के साथ एक एएमडी-मॉड्यूल उत्पन्न करेगा, जो कि मुख्य.जेएस में 'ओरिविजन' के रूप में शामिल है, जहां आप पहले दिखाए गए अनुसार आवश्यकता से अधिक कार्य को अधिलेखित कर देते हैं।


-1

यह @phil mccull के स्वीकृत उत्तर के अतिरिक्त है।

मैं उसकी विधि का उपयोग करता हूं लेकिन मैं प्री-बिल्ड चलाने के लिए एक T4 टेम्पलेट बनाकर प्रक्रिया को स्वचालित करता हूं।

पूर्व-निर्मित कमांड:

set textTemplatingPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
if %textTemplatingPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe" set textTemplatingPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
%textTemplatingPath% "$(ProjectDir)CacheBuster.tt"

यहां छवि विवरण दर्ज करें

T4 टेम्पलेट:

यहां छवि विवरण दर्ज करें

उत्पन्न फ़ाइल: यहां छवि विवरण दर्ज करें

आवश्यकता से पहले चर में स्टोर करें ।config.js लोड किया गया है: यहां छवि विवरण दर्ज करें

आवश्यकता में संदर्भ ।config.js:

यहां छवि विवरण दर्ज करें


2
संभवतः इसलिए क्योंकि जावास्क्रिप्ट समस्या का समाधान C # कोड का एक गुच्छा है। यह अतिरिक्त कार्य और कुछ करने के लिए कोड का एक गुच्छा भी है जो अंततः स्वीकृत उत्तर के समान सटीक तरीके से किया जाता है।
mAAdhaTTah

@mAAdhaTTah आप किसी भी सर्वर साइड भाषा के साथ ऐसा कर सकते हैं ... सी # होना जरूरी नहीं है। साथ ही यह प्रक्रिया को स्वचालित करता है, जब आप प्रोजेक्ट का नया संस्करण बनाते हैं तो कैश बस्ट को अपडेट करते हुए यह सुनिश्चित करते हैं कि ग्राहक हमेशा स्क्रिप्ट के नवीनतम संस्करण को कैशिंग करता है। मुझे नहीं लगता है कि एक नकारात्मक मार्कडाउन के हकदार हैं। यह केवल समाधान के लिए एक स्वचालित दृष्टिकोण की पेशकश करके उत्तर का विस्तार कर रहा है।
Zach पेंटर

मैंने मूल रूप से इसे बनाया है क्योंकि जब एक एप्लिकेशन को बनाए रखने की आवश्यकता होती है ।js, मुझे यह मैन्युअल रूप से टिप्पणी करने के लिए "(नई तिथि ())। GetTime ()) और हर बार जब मैंने एप्लिकेशन को अपडेट किया, स्थैतिक कैशबस्टर को अनइंस्टॉल करना काफी कष्टप्रद पाया। भूलना आसान है। अचानक ग्राहक बदलावों को सत्यापित कर रहा है और कैश्ड स्क्रिप्ट को देख रहा है, इसलिए उन्हें लगता है कि कुछ भी नहीं बदला है। सभी क्योंकि आप केवल कैशबस्टर को बदलना भूल गए हैं। यह थोड़ा अतिरिक्त कोड होने की संभावना को मिटा देता है।
Zach पेंटर

2
मैंने इसे चिह्नित नहीं किया, मुझे नहीं पता कि वास्तव में क्या हुआ था। मैं सिर्फ उस कोड का सुझाव दे रहा हूं जो न केवल js है, बल्कि एक C # टेम्प्लेटिंग लैंग्वेज है, जो जेएस देवों को उनकी समस्या का जवाब देने की कोशिश करने में मददगार नहीं होगी।
mAAdhaTTah 21

-2

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

LoadFile(filePath){
    const file = require(filePath);
    const result = angular.copy(file);
    return result;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.