मैं जावास्क्रिप्ट फ़ाइलों को ताज़ा करने के लिए ग्राहकों को कैसे मजबूर कर सकता हूं?


595

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

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

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


जवाबों:


529

जहाँ तक मुझे पता है कि एक सामान्य समाधान ?<version>स्क्रिप्ट के src लिंक में एक जोड़ना है ।

उदाहरण के लिए:

<script type="text/javascript" src="myfile.js?1500"></script>

मैं इस बिंदु पर मानता हूं कि स्क्रिप्ट के सभी टैग में इन "संस्करण संख्याओं" को बढ़ाने के लिए खोज-प्रतिस्थापन से बेहतर कोई तरीका नहीं है?

आपके पास आपके लिए एक संस्करण नियंत्रण प्रणाली हो सकती है? अधिकांश संस्करण नियंत्रण प्रणालियों में उदाहरण के लिए चेक-इन पर संशोधन संख्या को स्वचालित रूप से इंजेक्ट करने का एक तरीका है।

यह कुछ इस तरह दिखेगा:

<script type="text/javascript" src="myfile.js?$$REVISION$$"></script>

बेशक, इस तरह से हमेशा बेहतर समाधान होते हैं ।


5
किसी को पता है अगर IE7 इस पर ध्यान नहीं देता है? जब मैं IE8 तुलनीयता दृश्य में परीक्षण करता हूं तो यह संलग्न डेटा की अनदेखी करता है और कैश्ड फ़ाइल का उपयोग करता है।
शेन रीस्टेल

4
मुझे हमेशा पता था कि क्वेरी स्ट्रिंग? वर् = 123 के रूप में की-वैल्यू पेयर हैं। धन्यवाद! :)
अंकुर-एम

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

2
हमने हाल ही में एक ही मुद्दे का सामना किया, और सबसे अच्छा मैं साथ आ सकता था एक साधारण फ़ंक्शन जो संलग्न था "? Mod = 123456" जहां 123456 फाइल पर संशोधित तिथि का यूनिक्स टाइमस्टैम्प था। ऐसा लगता है कि जहां अभी भी उपयुक्त है, कैशिंग की अनुमति देते हुए मुद्दों को ठीक करना। हालाँकि, मैंने अभी भी ब्राउज़रों को इस निर्देश को अनदेखा करते हुए देखा है और पुराने JS को वैसे भी इस्तेमाल कर रहा हूँ, लेकिन मुझे नहीं पता कि इसमें कोई "फुल फिक्स" है।
वीपीएल

31
जागरूकता के लिए: यह एक हैक माना जाता है। यह विधि ब्राउज़र को यह सोचकर चकरा देती है कि एक नई फ़ाइल निर्दिष्ट की जा रही है, क्योंकि यह केवल पूर्ण फ़ाइल नाम को देखे बिना उसकी व्याख्या करता है। foo.js?1जैसा कि नाम नहीं है foo.js?2, इसलिए ब्राउज़र सोचेंगे कि वे दो अलग-अलग फाइलें हैं। एक नकारात्मक पक्ष यह है कि दोनों फाइलें एक साथ उपयोगकर्ताओं के कैश में मौजूद होंगी, अनावश्यक स्थान ले लेंगी।
ली व्हाइट

88

वर्तमान समय को URL पर लागू करना वास्तव में एक सामान्य समाधान है। हालाँकि, यदि आप चाहें, तो आप इसे वेब सर्वर स्तर पर भी प्रबंधित कर सकते हैं। जावास्क्रिप्ट फ़ाइलों के लिए अलग-अलग HTTP हेडर भेजने के लिए सर्वर को कॉन्फ़िगर किया जा सकता है।

उदाहरण के लिए, फ़ाइल को 1 दिन से अधिक समय तक कैश न करने के लिए मजबूर करने के लिए, आप भेजेंगे:

Cache-Control: max-age=86400, must-revalidate

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

Cache-Control: no-cache, must-revalidate

3
क्या आप कृपया अधिक विशिष्ट हो सकते हैं?
क्रेकर

6
वह प्रत्येक फ़ाइल के लिए वेब सर्वर द्वारा भेजे गए हेडर के बारे में बात कर रहा है। उदाहरण के लिए अपाचे में विन्यास योग्य होना चाहिए। मुझे लगता है कि यह सबसे अच्छा
दृष्टिकोण होगा

1
आप इसे कहाँ कॉन्फ़िगर करते हैं?
डिएगो

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

Chrome ठीक से कैश करने के लिए इन सेटिंग्स को पुनर्प्राप्त करता है। उनके बिना, Chrome एक फ़ाइल को हमेशा के लिए कैश कर देगा। मोज़िला अधिक उचित डिफ़ॉल्ट का उपयोग करता है। अधिक देखें: agiletribe.wordpress.com/2018/01/29/caching-for-chrome
AgilePro

42

Google पृष्ठ-गति: स्थैतिक संसाधनों के लिए URL में एक क्वेरी स्ट्रिंग शामिल न करें। अधिकांश परदे के पीछे, संस्करण 3.0 के माध्यम से विशेष रूप से स्क्वीड, "" के साथ संसाधनों को कैश न करें? उनके URL में भले ही Cache-control: पब्लिक हैडर प्रतिक्रिया में मौजूद हो। इन संसाधनों के लिए प्रॉक्सी कैशिंग को सक्षम करने के लिए, स्थैतिक संसाधनों के संदर्भ से क्वेरी स्ट्रिंग्स को हटा दें, और इसके बजाय मापदंडों को फ़ाइल नामों में संलग्न करें।

इस स्थिति में, आप संस्करण को URL पूर्व में शामिल कर सकते हैं: http://abc.com/ v1.2 /script.js और http://abc.com/script.js लिंक को पुनर्निर्देशित करने के लिए अपाचे mod_rewrite का उपयोग करें । जब आप संस्करण बदलते हैं, तो क्लाइंट ब्राउज़र नई फ़ाइल को अपडेट करेगा।


मैंने कोशिश की? समाधान और IE8 में और मुझे एक जावास्क्रिप्ट त्रुटि मिलती है। मॉड रीराइट एक विकल्प है लेकिन ज्यादातर मामलों में हम अभ्यस्त हैं कि सर्वर पर इतना नियंत्रण है। मैं स्वयं js फ़ाइल में संस्करण जोड़ना या प्रत्येक संस्करण के लिए एक फ़ोल्डर रखना पसंद करूंगा
कार्तिक शंकर

@ H scriptc Huyền मिन्ह: लेकिन जब स्क्रिप्ट फिर से लोड की जाएगी, तो इसे प्रॉक्सी-कैश से पुनः लोड नहीं किया जाना चाहिए ...
स्टीफन स्टीगर

34

इस उपयोग को हटा दिया गया है: https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache

यह उत्तर केवल 6 साल देर से है, लेकिन मुझे यह उत्तर कई स्थानों पर नहीं दिखता है ... HTML5 ने एप्लिकेशन कैश पेश किया है जिसका उपयोग इस समस्या को हल करने के लिए किया जाता है। मुझे लग रहा था कि जो नया सर्वर कोड मैं लिख रहा था वह लोगों के ब्राउज़र में संग्रहीत पुरानी जावास्क्रिप्ट को क्रैश कर रहा था, इसलिए मैं उनकी जावास्क्रिप्ट को समाप्त करने का एक तरीका खोजना चाहता था। इस तरह दिखने वाली एक मैनिफ़ेस्ट फ़ाइल का उपयोग करें:

CACHE MANIFEST
# Aug 14, 2014
/mycode.js

NETWORK:
*

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


यह समाधान वास्तव में अच्छा है, जब तक कि आप मैनिफ़ेस्ट फ़ाइल को अपडेट करना याद रखें :)
मैटिस

24
कृपया दस्तावेज़ पढ़ें क्योंकि यह सुविधा वेब मानकों से हटा दी गई है। developer.mozilla.org/en-US/docs/Web/HTML/…
फ़्लेविया ओबर्जा

1
एफडब्ल्यूआईडब्ल्यू, मैंने इस समाधान का उपयोग नहीं किया। ?<version> दृष्टिकोण का उपयोग करना / बनाए रखना बहुत आसान था ।
आमोद

28

कैसे एक लोड पैरामीटर के रूप में filesize जोड़ने के बारे में?

<script type='text/javascript' src='path/to/file/mylibrary.js?filever=<?=filesize('path/to/file/mylibrary.js')?>'></script>

तो हर बार जब आप फ़ाइल को "फाइल्वर" पैरामीटर अपडेट करते हैं तो परिवर्तन होता है।

जब आप फ़ाइल को अपडेट करते हैं और उसी फ़ाइल आकार में आपका अपडेट कैसे होता है? हालात क्या हैं?


4
यह PHP टैग का उपयोग करता है और यदि कोई PHP का उपयोग करता है, तो यह वास्तव में एक अच्छा विचार है।
जेरथ

1
मुझे लगता है कि बदलाव को जोड़ना filesize से बेहतर होगा :)
Mazz

2
मेरा प्रारंभिक विचार संस्करण के बजाय फ़ाइल का एक हैश जोड़ना है।
माइक चेपल

मुझे लगता है कि यह भी काम करता है अगर एक समय टिकट जोड़ने यूनिक्स, सही? जैसे '... file.js? filever = <? = time (?)?
garanda

3
फिल्मटाइम ($ फ़ाइल) का उपयोग करें, यह फ़ाइल के टाइमस्टैम्प का उत्पादन करता है, समय () के साथ आप कैश का उपयोग नहीं कर सकते क्योंकि यह हर सेकंड बदलता है।
neoteknic

19

सभी ब्राउज़र्स कैश फ़ाइलों के साथ '?' इस में। मैंने यह सुनिश्चित करने के लिए कि यह जितना संभव हो उतना कैश किया गया था, मैंने फ़ाइलनाम में संस्करण को शामिल किया।

इसलिए इसके बजाय stuff.js?123, मैंने कियाstuff_123.js

मैं प्रयोग किया जाता है mod_redirect(मुझे लगता है कि) अपाचे में करने के लिए करने के लिए have stuff_*.jsजाने के लिएstuff.js


क्या आप इस बात पर विस्तार से बता सकते हैं कि आपने mod_redirect के साथ क्या किया है।
वेंकट डी।

3
इस विधि का विस्तृत विवरण particletree.com/notebook/…
Karl Bartel

3
यह बहुत अच्छा होगा यदि आप अपने .htaccessकोड को भविष्य में संदर्भ के लिए अपने उत्तर में शामिल कर सकते हैं ।
फिजिक्स

1
कौन से ब्राउज़र "?" वाली फ़ाइलों को कैश नहीं करते हैं? इस में?
rosell.dk

13

ASP.NET पृष्ठों के लिए मैं निम्नलिखित का उपयोग कर रहा हूँ

इससे पहले

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

(बल पुनः लोड)

<script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

DateTime.Now.Ticks जोड़ना बहुत अच्छी तरह से काम करता है।


31
यह एक ग्राहक पक्ष पर सभी कैशिंग तंत्र के खिलाफ जाता है। डमी पैरामीटर को "{प्रमुख संस्करण} _ {मामूली_विसंक्रमण} _ {build_number} _ {पुनरीक्षण} जैसे कुछ के साथ प्रतिस्थापित किया जाना चाहिए, जो प्रत्येक रिलीज़ के लिए अद्वितीय होगा।
Tohid

14
हालांकि यह संभवतः विकास के माहौल में एक ईश्वर समाधान है, यह उत्पादन के लिए फिट नहीं है। यह फ़ाइल के लिए पेज लोड होने पर हर बार कैश को पूरी तरह से अक्षम कर देगा । एक 50Kb फ़ाइल के साथ प्रति दिन 10k पृष्ठ लोड की कल्पना करें, यह दैनिक आधार पर 500Mb जावास्क्रिप्ट फ़ाइल का प्रतिनिधित्व करता है।
फिल्डुलक

@PhilDulac आप इसे टिक्स से बदल सकते हैं उदाहरण के लिए, या महीने, या महीने के सप्ताह के दिन का स्ट्रिंग मान वापस करने के लिए। अंततः यह आपको दिखा रहा है कि कैसे उपयोग किया जा सकता है? वी दृष्टिकोण
एलेक्स

3
@alex वास्तव में। मैं सिर्फ यह चेतावनी देना चाहता था कि यदि उत्तर में प्रदर्शित उपयोग उत्पादन का मार्ग बनाता है, तो इसके प्रभाव हो सकते हैं जो विकास में नहीं दिखते हैं।
फिल्डुलक

2
यह सुनिश्चित करने का एक संभावित तरीका है कि हर दिन एक बार नई प्रतियां लोड की जाएं, '<script src = "/ Scripts / Pages / common.js? Ver <% = DateTime.Now.ToString (" yyyyModdd ")%>" प्रकार का उपयोग करने के लिए हो सकता है = "text / javascript"> </ script> '। तो यह दिन की शुरुआत में एक बार लोड होता है, फिर कैश किया जाता है।
रॉब सैडलर

7

ASP.NET के लिए मुझे लगता है कि उन्नत विकल्प (डिबग / रिलीज़ मोड, संस्करण) के साथ अगला समाधान:

इस तरह से शामिल जेएस या सीएसएस फाइलें:

<script type="text/javascript" src="Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel="stylesheet" type="text/css" href="Css/exampleCss<%=Global.CssPostfix%>" />

Global.JsPostfix और Global.CssPostfix की गणना Global.asax में निम्नलिखित तरीके से की जाती है:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
    bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
    int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
    JsPostfix = "";
#if !DEBUG
    JsPostfix += ".min";
#endif      
    JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
    if (updateEveryAppStart)
    {
        Random rand = new Random();
        JsPosfix += "_" + rand.Next();
    }
    ...
}

मैं प्रयोग कर रहा हूँ। इस पृष्ठ पर मेरे जवाब देखें (
रवि

5

आजकल सामान्य प्रथा है कि ब्राउज़र नाम को विशेष रूप से IE को जावास्क्रिप्ट फाइल या सीएसएस फ़ाइलों को पुनः लोड करने के लिए मजबूर करने के लिए फ़ाइल नाम के भाग के रूप में एक सामग्री हैश कोड उत्पन्न करना है।

उदाहरण के लिए,

विक्रेता। a7561fb0e9a071baadb9 .js
मुख्य b746e3eb72875af2caa9 .js

यह आमतौर पर बिल्ड टूल जैसे वेबपैक के लिए काम है। यदि आप वेबपैक का उपयोग कर रहे हैं, तो कोई भी अधिक जानकारी प्राप्त करना चाहता है।


4

यदि आप उस पृष्ठ को उत्पन्न कर रहे हैं जो जेएस फाइलों से लिंक करता है तो एक सरल समाधान उत्पन्न लिंक के लिए फाइल के अंतिम संशोधन टाइमस्टैम्प को जोड़ रहा है।

यह हूपी के उत्तर के समान है, लेकिन कीवर्ड प्रतिस्थापन के बिना संस्करण नियंत्रण प्रणालियों में काम करता है। यह वर्तमान समय को बढ़ाने से भी बेहतर है, क्योंकि जब भी फाइल बिल्कुल नहीं बदली तो भी कैशिंग को रोका जा सकेगा।


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

3

JQuery फ़ंक्शन गेटस्क्रिप्ट का उपयोग यह सुनिश्चित करने के लिए भी किया जा सकता है कि पेज लोड होने के बाद हर बार एक js फ़ाइल लोड हो।

मैंने इस तरह से इसे किया:

$(document).ready(function(){
    $.getScript("../data/playlist.js", function(data, textStatus, jqxhr){
         startProgram();
    });
});

Http://api.jquery.com/jQuery.getScript/ पर फ़ंक्शन की जांच करें

डिफ़ॉल्ट रूप से, $ .getScript () कैश सेटिंग को झूठा सेट करता है। यह अनुरोध URL पर टाइमस्टैम्प किए गए क्वेरी पैरामीटर को यह सुनिश्चित करने के लिए जोड़ता है कि ब्राउज़र हर बार स्क्रिप्ट को डाउनलोड करने का अनुरोध करता है।


8
अगर कोई बदलाव नहीं हुआ तो हमें फाइलों को कैश करना होगा।
लियो ली

3

में पीएचपी :

function latest_version($file_name){
    echo $file_name."?".filemtime($_SERVER['DOCUMENT_ROOT'] .$file_name);
}

में एचटीएमएल :

<script type="text/javascript" src="<?php latest_version('/a-o/javascript/almanacka.js'); ?>">< /script>

यह काम किस प्रकार करता है:

HTML में, filepathजैसा कि आप जानते हैं, वैसा ही नाम और नाम लिखें , लेकिन केवल फ़ंक्शन में। PHP filetimeफ़ाइल का हिस्सा हो जाता है और filepath+name+"?"+timeनवीनतम परिवर्तन का रिटर्न देता है


3

हम उपयोगकर्ताओं के लिए एक SaaS बना रहे हैं और उन्हें अपने वेबसाइट पेज में संलग्न करने के लिए एक स्क्रिप्ट प्रदान कर रहे हैं, और स्क्रिप्ट के साथ एक संस्करण संलग्न करना संभव नहीं था क्योंकि उपयोगकर्ता अपनी वेबसाइट पर स्क्रिप्ट को कार्यात्मकताओं के लिए संलग्न करेंगे और मैं उन्हें बाध्य नहीं कर सकता। हर बार जब हम स्क्रिप्ट को अपडेट करते हैं तो संस्करण को बदल सकते हैं

इसलिए, हमें प्रत्येक बार उपयोगकर्ता द्वारा मूल स्क्रिप्ट को कॉल करने पर स्क्रिप्ट के नए संस्करण को लोड करने का एक तरीका मिला

उपयोगकर्ता को प्रदान की गई स्क्रिप्ट लिंक

<script src="https://thesaasdomain.com/somejsfile.js" data-ut="user_token"></script>

स्क्रिप्ट फ़ाइल

if($('script[src^="https://thesaasdomain.com/somejsfile.js?"]').length !== 0) {
   init();
} else {
   loadScript("https://thesaasdomain.com/somejsfile.js?" + guid());
}

var loadscript = function(scriptURL) {
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = scriptURL;
   head.appendChild(script);
}

var guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

var init = function() {
    // our main code
}

स्पष्टीकरण:

उपयोगकर्ता ने अपनी वेबसाइट में उन्हें प्रदान की गई स्क्रिप्ट संलग्न की है और हमने jQuery चयनकर्ता का उपयोग करते हुए या नहीं स्क्रिप्ट के साथ संलग्न अद्वितीय टोकन के लिए जाँच की है और यदि नहीं तो इसे नए टोकन (या संस्करण) के साथ गतिशील रूप से लोड करें

यह एक ही स्क्रिप्ट को दो बार कॉल करता है जो एक प्रदर्शन समस्या हो सकती है, लेकिन यह वास्तव में उपयोगकर्ता या क्लाइंट को दिए गए वास्तविक स्क्रिप्ट लिंक में संस्करण को डाले बिना स्क्रिप्ट को कैश से लोड न करने के लिए मजबूर करने की समस्या को हल करता है।

अस्वीकरण: यदि आपके मामले में प्रदर्शन एक बड़ा मुद्दा है तो उपयोग न करें।


2

Asp.net mvc में आप js फ़ाइल संस्करण संख्या के लिए @ DateTime.UtcNow.ToString () का उपयोग कर सकते हैं । दिनांक के साथ संस्करण संख्या ऑटो परिवर्तन और आप क्लाइंट ब्राउज़र को स्वचालित रूप से js फ़ाइल को ताज़ा करने के लिए मजबूर करते हैं। मैं इस पद्धति का उपयोग कर रहा हूं और यह अच्छी तरह से काम कर रहा है।

<script src="~/JsFilePath/JsFile.js?v=@DateTime.UtcNow.ToString()"></script>

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

आप अपने कारण के लिए नीचे दिए गए कोड का उपयोग कर सकते, संस्करण संख्या के साथ कैश फ़ाइल <script src = "~/JsFilePath/JsFile.js?v=@GetAppVersionNumber ()"> </ script>
dragonal

2

location.reload (सही);

देख https://www.w3schools.com/jsref/met_loc_reload.asp

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


onload="location.reload();"अपने फॉर्म में जोड़ने से मुझे अपने पेज को रीलेन्च करने के बजाय रिफ्रेश के बाद नया जेएस प्राप्त करने की अनुमति मिलती है। यह कहीं अधिक सुरुचिपूर्ण समाधान है। धन्यवाद!
ZX9

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

ऑनलोड = "location.reload (सही)," : इसके बाद के संस्करण मुझे (कुप्पी और क्रोम के वर्तमान संस्करण का उपयोग करके) के लिए भी काम नहीं किया w3schools.com/jsref/met_loc_reload.asp
aspiringGuru

1

एक समाधान यह है कि संसाधन लाते समय URL में टाइमस्टैम्प के साथ एक क्वेरी स्ट्रिंग संलग्न करें। यह इस तथ्य का लाभ उठाता है कि एक ब्राउज़र URL से प्राप्त संसाधनों को कैश नहीं करेगा, जिसमें क्वेरी स्ट्रिंग्स होती हैं।

आप शायद नहीं चाहते कि ब्राउज़र इन संसाधनों को बिल्कुल भी कैश न करें; यह अधिक संभावना है कि आप उन्हें कैश करवाना चाहते हैं, लेकिन आप चाहते हैं कि जब यह उपलब्ध हो जाए तो ब्राउज़र फ़ाइल का एक नया संस्करण लाए।

सबसे आम समाधान फ़ाइल नाम में टाइमस्टैम्प या संशोधन संख्या को एम्बेड करना प्रतीत होता है। यह थोड़ा और काम है, क्योंकि सही फ़ाइलों का अनुरोध करने के लिए आपके कोड को संशोधित करने की आवश्यकता है, लेकिन इसका मतलब यह है कि, उदाहरण के लिए आपके snazzy_javascript_file.js(यानी snazzy_javascript_file_7.js) के संस्करण 7 को ब्राउज़र पर कैश किया जाता है, जब तक आप संस्करण 8 जारी नहीं करते हैं, और फिर आपका कोड बदल जाता है snazzy_javascript_file_8.jsइसके बजाय प्राप्त करें ।


1

file.js?V=1ओवर का उपयोग करने का लाभ यह fileV1.jsहै कि आपको सर्वर पर जावास्क्रिप्ट फ़ाइलों के कई संस्करणों को संग्रहीत करने की आवश्यकता नहीं है।

मैं जिस मुसीबत को देखता हूं file.js?V=1 है कि आपके पास एक और जावास्क्रिप्ट फ़ाइल में निर्भर कोड हो सकता है जो लाइब्रेरी उपयोगिताओं के नए संस्करण का उपयोग करते समय टूट जाता है।

पश्चगामी अनुकूलता के लिए, मुझे लगता है कि jQuery.1.3.jsअपने नए पृष्ठों के लिए उपयोग करना बेहतर है और मौजूदा पृष्ठों का उपयोग करने दें jQuery.1.1.js, जब तक कि आप पुराने पृष्ठों को अपग्रेड करने के लिए तैयार न हों, यदि आवश्यक हो।


1

GETब्राउज़र कैशिंग को रोकने के लिए एक संस्करण चर का उपयोग करें ।

?v=AUTO_INCREMENT_VERSIONअपने url के अंत में आवेदन करना ब्राउज़र कैशिंग को रोकता है - किसी भी और सभी कैश्ड स्क्रिप्ट से बचना।


1

मेरे सहयोगी सिर्फ इतना है कि विधि सही होने के बाद मैं पोस्ट (सीएसएस के संदर्भ में) पर के लिए एक संदर्भ पाया http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/ । यह देखकर अच्छा लगता है कि दूसरे इसका उपयोग कर रहे हैं और यह काम करने लगता है। मैं इस बिंदु वहाँ एक बेहतर तरीका की तुलना में स्क्रिप्ट टैग के सभी में इन "संस्करण संख्या" को बढ़ा देते हैं उसे खोजने के की जगह नहीं है कि कम से मान?



1

एक टैग हेल्पर के माध्यम से ASP.NET Core में Cache Busting आपके लिए इसे संभाल लेगा और फ़ाइल को बदलने तक आपके ब्राउज़र को कैश्ड स्क्रिप्ट / css रखने की अनुमति देगा। बस अपनी स्क्रिप्ट (js) या लिंक (css) टैग में टैग हेल्पर asp-append-version = "true" जोड़ें:

<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true"/>

डेव पैक्वेट के पास कैश बस्टिंग (पेज के नीचे) कैश बस्टिंग का एक अच्छा उदाहरण और स्पष्टीकरण है


क्या यह नियमित रूप से ASP.NET में काम नहीं करता है? मैंने अपने स्क्रिप्ट टैग में एस्प-एपेंड-संस्करण को जोड़ने की कोशिश की और सभी ब्राउज़र देखता है स्क्रिप्ट टैग बिल्कुल उसी तरह है जैसे यह स्रोत में दिखाई देता है, जिसमें एस्प-एपेंड-संस्करण विशेषता भी शामिल है।
tolsen64

यह टैग हेल्पर्स से जुड़ा एक .NET कोर विशेषता है। यह स्क्रिप्ट के नाम को एक संस्करण के साथ जोड़ देता है ताकि सर्वर / ब्राउज़र हमेशा नवीनतम संस्करण और डाउनलोड
देखे

0

सबसे सरल उपाय? ब्राउज़र कैश को बिल्कुल न दें। क्वेरी के रूप में वर्तमान समय (ms में) जोड़ें।

(आप अभी भी बीटा में हैं, इसलिए आप प्रदर्शन के लिए अनुकूलन नहीं करने के लिए एक उचित मामला बना सकते हैं। लेकिन यहां YMMV)


13
IMHO यह एक खराब समाधान है। क्या होगा यदि आप बीटा में नहीं हैं और आप एक महत्वपूर्ण अपडेट को धक्का देते हैं?
d -_- b

0

एक सरल तरीका है। Htaccess संपादित करें

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|css|js|mp3|ogg)$ [NC]
RewriteCond %{QUERY_STRING} !^(.+?&v33|)v=33[^&]*(?:&(.*)|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?v=33 [R=301,L]

यह एक रीडायरेक्ट का कारण बनता है जो प्रदर्शन-वार एक उप-अपनाने वाला, लेकिन काम करने वाला समाधान है।
दो बार

0

नीचे मेरे लिए काम किया:

<head>
<meta charset="UTF-8">
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
</head>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.