প্রয়োজনীয় স্ক্রিপ্টগুলি ক্যাচিং থেকে প্রয়োজনীয় জেএস প্রতিরোধ করুন


302

আবশ্যকজেএস অভ্যন্তরীণভাবে এমন কিছু করছে যা জাভাস্ক্রিপ্ট ফাইলগুলি আবশ্যক করে। আমি যদি প্রয়োজনীয় ফাইলগুলির মধ্যে একটিতে পরিবর্তন করে থাকি তবে পরিবর্তনগুলি প্রয়োগ করার জন্য আমাকে ফাইলটির নাম পরিবর্তন করতে হবে।

ফাইলনামের শেষে ক্যোরিস্ট্রিং পরম হিসাবে সংস্করণ নম্বর যুক্ত করার সাধারণ কৌশল প্রয়োজনীয়js দিয়ে কাজ করে না <script src="jsfile.js?v2"></script>

আমি যেটি সন্ধান করছি তা হ'ল প্রয়োজনীয় স্ক্রিপ্টগুলির প্রয়োজনীয় স্ক্রিপ্টগুলির অভ্যন্তরীণ ক্যাচিং প্রতিরোধ করার একটি উপায় যা আমার স্ক্রিপ্ট ফাইলগুলি আপডেট হওয়ার সাথে সাথেই পুনরায় নামকরণ না করে।

ক্রস প্ল্যাটফর্ম সমাধান:

আমি এখন urlArgs: "bust=" + (new Date()).getTime()বিকাশের সময় এবং urlArgs: "bust=v2"উত্পাদনের জন্য স্বয়ংক্রিয় ক্যাশে-বুস্টিংয়ের জন্য ব্যবহার করছি যেখানে আমি একটি আপডেট প্রয়োজনীয় স্ক্রিপ্ট ঘুরিয়ে দেওয়ার পরে হার্ড-কোডেড সংস্করণ সংখ্যাটি বৃদ্ধি করি।

বিঃদ্রঃ:

@ ডাস্টিন গেটেজ সাম্প্রতিক উত্তরে উল্লেখ করেছেন যে জাভাস্ক্রিপ্ট ফাইলগুলি এই জাতীয় ধারাবাহিকভাবে রিফ্রেশ করার সময় ক্রোম বিকাশকারী সরঞ্জামগুলি ডিবাগিংয়ের সময় ব্রেকপয়েন্টগুলি বাদ দেবে। debugger;বেশিরভাগ জাভাস্ক্রিপ্ট ডিবাগারগুলিতে ব্রেক ব্রেকপয়েন্টটি ট্রিগার করার জন্য কোডে লিখিতভাবে কাজ করা একটি কাজ ound

সার্ভার-নির্দিষ্ট সমাধান:

আপনার সার্ভার পরিবেশ যেমন নোড বা অ্যাপাচি এর জন্য আরও ভাল কাজ করতে পারে এমন নির্দিষ্ট সমাধানের জন্য নীচের উত্তরগুলির কয়েকটি দেখুন।


আপনি কি নিশ্চিত যে এই সার্ভার বা ক্লায়েন্ট ক্যাশে করছেন না? (এখন কয়েক মাস ধরে প্রয়োজনীয় জেএস ব্যবহার করা হচ্ছে এবং এর মতো কোনও কিছুই লক্ষ্য করা যায়নি) এমআইভিসি ক্রিয়াকলাপের ফলাফলগুলি ক্যাচ করে ধরা পড়েছিল, ক্রোম আমাদের এইচটিএমএল টেমপ্লেটগুলি ক্যাশে করছে তবে ব্রাউজারগুলির ক্যাশে পুনরায় সেট করা হওয়ার পরে জেএস ফাইলগুলি রিফ্রেশ বলে মনে হয়। আমি মনে করি আপনি যদি ক্যাচিং ব্যবহার করতে চাইছেন তবে আপনি যথারীতি করতে পারবেন না কারণ প্রয়োজনীয় জেএস থেকে অনুরোধগুলি কোয়েরি স্ট্রিংটি সরিয়ে দিচ্ছিল যা সমস্যার কারণ হতে পারে?
পিজেউকে

আমি নিশ্চিত নই যে প্রয়োজনীয় জেজেএস এর মতো সংযুক্ত সংস্করণ নম্বরগুলি সরিয়ে দেয়। এটা আমার সার্ভার হতে পারে। কীভাবে আবশ্যকজেএস-এর ক্যাশে-বাস্টার সেটিংস রয়েছে তা আকর্ষণীয়, সুতরাং আপনার প্রয়োজনীয় সংস্থাগুলিতে আমার সংযুক্ত সংস্করণ সংখ্যাটি অপসারণ করার বিষয়ে আপনি সঠিক হতে পারেন।
BumbleB2na

আমি আমার উত্তরটি একটি সম্ভাব্য ক্যাশিং সমাধানের সাথে আপডেট করেছি
ডাস্টিন গেটজ

আমি আজ সকালে আমার ব্লগ পোস্টে প্রকাশিত লিটানির সাথে আমি নিম্নলিখিতগুলি যুক্ত করতে পারি: কোডারস্পেস.com / ডিজেন / And এবং এটি হ'ল আমাকে কেবল ক্যাশে বস্টিংই যোগ করতে হবে তা নয়, তবে প্রয়োজন.জেগুলি কঠোর রিফ্রেশ উপেক্ষা করে।
অক্সিজেন

আমি এর জন্য ব্যবহারের ক্ষেত্রে বিভ্রান্ত হয়ে পড়েছি .... এটি কি সামনের দিকে প্রান্তের এএমডি মডিউলগুলি হট-লোড করার জন্য বা কী?
আলেকজান্ডার মিলস

উত্তর:


457

ক্যাশে বুস্টিংয়ের জন্য প্রতিটি স্ক্রিপ্টের url এ একটি মান যুক্ত করতে প্রয়োজনীয় জেএস কনফিগার করা যেতে পারে।

প্রয়োজনীয় জেএস ডকুমেন্টেশন ( http://requirejs.org/docs/api.html#config ) থেকে:

urlArgs : ইউআরএলগুলিতে অতিরিক্ত ক্যোয়ারী স্ট্রিং আর্গুমেন্ট যুক্ত হয়েছে যা প্রয়োজনীয় জেএস সংস্থানগুলি আনতে ব্যবহার করে। ব্রাউজার বা সার্ভারটি সঠিকভাবে কনফিগার না করা অবস্থায় আবদ্ধ ক্যাশে সবচেয়ে দরকারী।

উদাহরণস্বরূপ, সমস্ত স্ক্রিপ্টগুলিতে "v2" যুক্ত করা:

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

বিকাশের উদ্দেশ্যে, আপনি টাইমস্ট্যাম্প সংযোজন করে প্রয়োজনীয় জেএসকে ক্যাশে বাইপাস করতে বাধ্য করতে পারেন:

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

46
খুব সহায়ক, আপনাকে ধন্যবাদ। আমি urlArgs: "bust=" + (new Date()).getTime()বিকাশের সময় এবং urlArgs: "bust=v2"উত্পাদনের জন্য স্বয়ংক্রিয় ক্যাশে-বুস্টিংয়ের জন্য ব্যবহার করছি যেখানে আমি আপডেটের প্রয়োজনীয় স্ক্রিপ্টটি ঘুরিয়ে দেওয়ার পরে হার্ড-কোডেড সংস্করণ সংখ্যাটি বৃদ্ধি করি।
BumbleB2na

9
... এছাড়াও পারফরম্যান্স অপটিমাইজার হিসাবে আপনি (নতুন তারিখ ()) এর পরিবর্তে ম্যাথ.র্যান্ডম () ব্যবহার করতে পারেন get গেটটাইম ()। এটি আরও সৌন্দর্য, অবজেক্ট তৈরি না করে এবং কিছুটা দ্রুত jsperf.com / স্পিড সংযোগ তুলনা করে
ভ্লাদ টেপলেভ

2
আপনি এটি খানিকটা ছোট পেতে পারেন:urlArgs: "bust=" + (+new Date)
মিরাজমির

11
আমি মনে করি প্রতিবার একবার ক্যাশে আবদ্ধ করা একটি ভয়ানক ধারণা। দুর্ভাগ্যক্রমে RequireJS অন্য কোনও বিকল্প প্রস্তাব দেয় না। আমরা urlArgs ব্যবহার করি তবে এর জন্য কোনও এলোমেলো বা টাইমস্ট্যাম্প ব্যবহার করি না। পরিবর্তে আমরা আমাদের বর্তমান গিট এসএএএ ব্যবহার করি, কেবল তখনই নতুন কোড প্রয়োগ করা হয় that
ইভান টরেস

5
"V2" স্ট্রিং সরবরাহকারী ফাইলটি যদি ক্যাশে হয় তবে কীভাবে এই "ভি 2" রূপটি উত্পাদনে কাজ করতে পারে? আমি যদি প্রোডাকশনে কোনও নতুন অ্যাপ্লিকেশন প্রকাশ করি তবে "v3" যুক্ত করা কিছুই করবে না, কারণ অ্যাপ্লিকেশনটি খুশিভাবে v2 সহ পুরানো কনফিগারেশন সহ ক্যাশেড ভি 2 ফাইলগুলির সাথে কাজ করে চলেছে urlArgs
বেনি বোত্তেমা

54

এর জন্য ইউআরএলর্গ ব্যবহার করবেন না!

স্ক্রিপ্ট লোডগুলি এইচটিসি ক্যাচিং শিরোনামের সম্মানের প্রয়োজন। (স্ক্রিপ্টগুলি গতিশীল inোকানো সহ লোড করা হয় <script>, যার অর্থ অনুরোধটি কোনও পুরানো সম্পদ লোড হওয়ার মতো দেখায়))

উন্নয়নের সময় ক্যাচিং অক্ষম করতে যথাযথ HTTP শিরোনামগুলির সাথে আপনার জাভাস্ক্রিপ্ট সম্পদগুলি পরিবেশন করুন।

প্রয়োজনের ইউআরএলর্গ ব্যবহার করার অর্থ আপনার সেট করা কোনও ব্রেকপয়েন্টগুলি রিফ্রেশ জুড়ে সংরক্ষণ করা হবে না; আপনি লাগাতে হবে শেষdebugger সর্বত্র বিবৃতি দেওয়া । খারাপ। urlArgsগিট শের সাথে উত্পাদনের সময় আমি ক্যাশে-বুস্টিং সম্পদের জন্য ব্যবহার করি ; তারপরে আমি আমার সম্পত্তিগুলিকে চিরকালের জন্য ক্যাশে রাখার জন্য সেট করতে পারি এবং কখনই বাসি সম্পদ না রাখার গ্যারান্টি দেওয়া যায়।

বিকাশে, আমি একটি জটিল মকজ্যাক্স কনফিগারেশন সহ সমস্ত এজাক্স অনুরোধগুলি মক করে দিই , তবে আমি জাভাস্ক্রিপ্ট-কেবল মোডে আমার অ্যাপ্লিকেশনটি 10 লাইন পাইথন HTTP সার্ভার দিয়ে সমস্ত ক্যাশে বন্ধ করে পরিবেশন করতে পারি । এটি আমার জন্য কয়েকশো বিশ্রামপ্রাপ্ত ওয়েবসার্চ এন্ডপয়েন্টস সহ বেশ বড় একটি "এন্টারপ্রাইজ" অ্যাপ্লিকেশনটিতে মাপসই করা হয়েছে। আমাদের কাছে এমন একটি চুক্তিবদ্ধ ডিজাইনারও রয়েছে যিনি তাকে আমাদের ব্যাকএন্ড কোডটিতে অ্যাক্সেস না দিয়ে আমাদের আসল প্রযোজনা কোডবেস নিয়ে কাজ করতে পারেন।


8
@ জেমস পি। রাইট, কারণ (কমপক্ষে ক্রোমে) যখন আপনি পৃষ্ঠা লোডে ঘটে যাওয়া কোনও কিছুর জন্য ব্রেকপয়েন্ট নির্ধারণ করেন, তারপরে রিফ্রেশ ক্লিক করুন, ব্রেকপয়েন্টটি হিট হয়নি কারণ ইউআরএল পরিবর্তিত হয়েছে এবং ক্রোমের ব্রেকপয়েন্টটি বাদ পড়েছে। আমি এটির জন্য কেবলমাত্র ক্লায়েন্টকে জানতে আগ্রহী।
ড্রয় নোকস

1
ধন্যবাদ, ডাস্টিন আপনি যদি এর আশেপাশে কোনও উপায় খুঁজে পান তবে পোস্ট করুন। এর মধ্যে আপনি debugger;যেখানেই ব্রেক ব্রেকপয়েন্ট অবিরত রাখতে চান সেখানে আপনার কোডটি ব্যবহার করতে পারেন ।
BumbleB2na

2
যে কোনও ব্যক্তির জন্য নোডে HTTP- সার্ভার ব্যবহার করা হয় (এনএমপি ইনস্টল HTTP- সার্ভার)। আপনি -c-1 (যেমন HTTP-সার্ভার -c-1) দিয়ে ক্যাচিং অক্ষম করতে পারেন।
আপনারপালাল

5
উন্নয়নের সময় ডিবাগিং সমস্যাটি পেতে আপনি ক্রোমে ক্যাচিং অক্ষম করতে পারেন: স্ট্যাকওভারফ্লো
দীপক জয়

5
উত্পাদনে ইউআরএলর্গ ব্যবহার করবেন না !!! । আপনার ওয়েবসাইটটিতে 1000 জেএস ফাইল রয়েছে (হ্যাঁ, সম্ভব!) এমন কেসটি কল্পনা করুন এবং তাদের লোড প্রয়োজনীয় জেএস দ্বারা নিয়ন্ত্রিত হয়েছে। এখন আপনি ভি 2 বা আপনার সাইটটি মুক্তি দিন যেখানে কেবল কয়েকটি জেএস ফাইলই পরিবর্তিত হয়েছে! তবে urlArgs = v2 যোগ করে আপনি সমস্ত 1000 জেএস ফাইল পুনরায় লোড করতে বাধ্য করেন! আপনি অনেক ট্র্যাফিক দিতে হবে! কেবলমাত্র পরিবর্তিত ফাইলগুলি পুনরায় লোড করা উচিত, অন্য সবগুলিকে 304 স্ট্যাটাসের সাথে প্রতিক্রিয়া জানানো উচিত (পরিবর্তিত নয়)
ওয়ালভ

24

UrlArgs সমাধানে সমস্যা রয়েছে। দুর্ভাগ্যক্রমে আপনি সমস্ত প্রক্সি সার্ভারগুলি নিয়ন্ত্রণ করতে পারবেন না যা আপনার এবং আপনার ব্যবহারকারীর ওয়েব ব্রাউজারের মধ্যে থাকতে পারে। এই প্রক্সি সার্ভারগুলির কয়েকটি দুর্ভাগ্যক্রমে ফাইল ক্যাশে করার সময় URL পরামিতিগুলি উপেক্ষা করার জন্য কনফিগার করা যেতে পারে। যদি এটি হয়, আপনার জেএস ফাইলের ভুল সংস্করণটি আপনার ব্যবহারকারীর কাছে সরবরাহ করা হবে।

অবশেষে আমি আমার নিজস্ব ফিক্সটি সরাসরি প্রয়োজনীয়.js এর মধ্যে ছেড়ে দিয়েছি এবং বাস্তবায়ন করেছি । আপনি যদি প্রয়োজনীয় সংস্থাগুলির আপনার সংস্করণটি সংশোধন করতে ইচ্ছুক হন তবে এই সমাধানটি আপনার পক্ষে কার্যকর হতে পারে।

আপনি প্যাচটি এখানে দেখতে পারেন:

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

আমাদের সার্ভার পরিবেশে, আমরা বিল্ডবার্বারটি সরিয়ে ফেলার জন্য url পুনর্লিখনের নিয়মগুলি ব্যবহার করি এবং সঠিক জেএস ফাইলটি পরিবেশন করি। এইভাবে আমাদের আমাদের সমস্ত জেএস ফাইলের নাম পরিবর্তনের বিষয়ে আসলে চিন্তা করতে হবে না।

প্যাচ কোনও প্রোটোকল নির্দিষ্ট করে এমন কোনও স্ক্রিপ্টকে অগ্রাহ্য করবে এবং এটি কোনও জেএস-ফাইল ছাড়াই প্রভাব ফেলবে না।

এটি আমার পরিবেশের জন্য ভাল কাজ করে, তবে আমি বুঝতে পারি যে কিছু ব্যবহারকারী প্রত্যয়ের চেয়ে উপসর্গ পছন্দ করবে, আপনার প্রয়োজন অনুসারে আমার প্রতিশ্রুতি পরিবর্তন করা সহজ হওয়া উচিত।

হালনাগাদ:

টান অনুরোধ আলোচনায়, প্রয়োজনীয় লেখকরা পরামর্শ দিচ্ছেন যে এটি সংশোধন নম্বরটির উপসর্গের সমাধান হিসাবে কাজ করতে পারে:

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

আমি এটি চেষ্টা করে দেখিনি, তবে বোঝা যাচ্ছে যে এটি নিম্নলিখিত URL এর জন্য অনুরোধ করবে:

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

যা উপসর্গ ব্যবহার করতে পারে এমন অনেক ব্যক্তির পক্ষে খুব ভাল কাজ করতে পারে।

এখানে কয়েকটি সম্ভাব্য সদৃশ প্রশ্ন রয়েছে:

প্রয়োজনীয় জেএস এবং প্রক্সি ক্যাচিং

প্রয়োজনীয়.js - আমি কীভাবে ইউআরএল এর অংশ হিসাবে প্রয়োজনীয় মডিউলগুলিতে একটি সংস্করণ সেট করতে পারি?


1
আমি আপনার আপডেটটি অফিসিয়াল প্রয়োজনীয় জেজেস তৈরির পথে যেতে দেখতে চাই। প্রয়োজনীয় সংস্থাগুলির মূল লেখক আগ্রহীও হতে পারে (উপরে @ লুইয়ের উত্তর দেখুন)।
BumbleB2na

@ বাম্বলবি 2 - পুলারউকেস্ট ( github.com/jrburke/requirejs/pull/1017 ) এ নির্দ্বিধায় মন্তব্য করুন , জারবুর্ক আগ্রহী বলে মনে হয় নি। তিনি কোনও ফাইলের নাম উপসর্গ ব্যবহার করে সমাধানের পরামর্শ দেন, আমি এটি অন্তর্ভুক্ত করার জন্য আমার উত্তর আপডেট করব।
জেবিসিপি

1
সুন্দর আপডেট। আমি লেখক দ্বারা এই প্রস্তাবনাটি পছন্দ করি, কিন্তু যে শুধুমাত্র কারণ আমি এই নামাঙ্কন পদ্ধতির ইদানীং ব্যবহার করছি: /scripts/myLib/v1.1/। আমি আমার ফাইলের নামগুলিতে পোস্টফিক্স (বা উপসর্গ) যুক্ত করার চেষ্টা করেছি, সম্ভবত এটি কারণ জ্যাকুয়েরি, তবে এর কিছু পরে আমি [অলস হয়ে পড়ে] পিতামাতার ফোল্ডারে একটি সংস্করণ নম্বর বাড়িয়ে তুলতে শুরু করি। আমি মনে করি এটি একটি বড় ওয়েবসাইটে আমার জন্য রক্ষণাবেক্ষণকে আরও সহজ করে তুলেছে তবে, এখন আপনি আমাকে ইউআরএল পুনর্লিখনের দুঃস্বপ্নগুলি নিয়ে উদ্বিগ্ন।
বাম্বলবি 2na

1
আধুনিক ফ্রন্ট এন্ড সিস্টেমগুলি কেবল জেএস ফাইলগুলি পুনর্লিখন করে এবং ফাইলনেমে একটি এমডি 5 যোগ করে এবং তারপরে বিল্ডিংয়ের সময় নতুন ফাইলের নাম ব্যবহার করার জন্য এইচটিএমএল ফাইলগুলি পুনরায় লেখায়, তবে এটি লিগ্যাসি সিস্টেমগুলির সাথে জটিল হয়ে ওঠে যেখানে সার্ভারের পাশের সামনের কোডটি পরিবেশন করা হয়।
জেবিসিপি

আমার যখন জেএসপিএক্স ফাইলের ভিতরে কিছু জেএস প্রয়োজন হয় তখন কি এটি কাজ করে? যেমন<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>
মাস্টার

19

প্রয়োজনীয়.js ডেটা-মেইনে মেয়াদোত্তীকরণ ক্যাশে দ্বারা অনুপ্রাণিত হয়ে আমরা নীচের পিঁপড়া টাস্ক সহ আমাদের স্থাপনা স্ক্রিপ্টটি আপডেট করেছি:

<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>

যেখানে মেইন.জেএস এর শুরুটি দেখতে মনে হচ্ছে:

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

11

উৎপাদন

urlArgs সমস্যা হতে পারে!

প্রয়োজনীয় সংস্থাগুলির প্রধান লেখক ব্যবহার না করা পছন্দ করেনurlArgs :

স্থাপন করা সম্পদের জন্য, আমি বিল্ড ডিরেক্টরি হিসাবে পুরো বিল্ডের জন্য সংস্করণ বা হ্যাশ রাখতে পছন্দ করি, তবে কেবলমাত্র baseUrlসেই সংস্করণযুক্ত ডিরেক্টরিটি হিসাবে ব্যবহার করতে প্রকল্পের জন্য ব্যবহৃত কনফিগারটি পরিবর্তন করুন baseUrl। তারপরে অন্য কোনও ফাইল পরিবর্তন হয় না এবং এটি এমন কিছু প্রক্সি সমস্যা এড়াতে সহায়তা করে যেখানে তারা কোনও ক্যোরি স্ট্রিং সহ কোনও URL কে ক্যাশে নাও করতে পারে।

[স্টাইলিং আমার।]

আমি এই পরামর্শ অনুসরণ।

উন্নতির পথে

আমি এমন একটি সার্ভার ব্যবহার করতে পছন্দ করি যা বুদ্ধিমানের সাথে ফাইলগুলি ঘন ঘন পরিবর্তিত হতে পারে: যথাযথ যখন 304 সহ প্রবাহিত হয় Last-Modifiedএবং প্রতিক্রিয়া জানায় If-Modified-Since। এমনকি স্ট্যাটিক ফাইলগুলি পরিবেশন করতে নোডের এক্সপ্রেস সেট উপর ভিত্তি করে একটি সার্ভারও ঠিক এই বাক্সটির বাইরে চলে। এটির জন্য আমার ব্রাউজারে কিছু করার প্রয়োজন হয় না এবং ব্রেকপয়েন্টগুলিকে গণ্ডগোল করে না।


ভাল পয়েন্ট তবে, আপনার উত্তরটি আপনার সার্ভারের পরিবেশের জন্য নির্দিষ্ট। অন্য কারওের পক্ষে হোঁচট খাওয়ার পক্ষে একটি ভাল বিকল্প হতে পারে ক্যোরিস্ট্রিং প্যারামিটারের পরিবর্তে ফাইলনেমে একটি সংস্করণ নম্বর যুক্ত করার সাম্প্রতিক পরামর্শ। এখানে এই বিষয়ে আরও তথ্য: স্টিভসৌডারস
ব্লগ

আমরা একটি প্রোডাকশন সিস্টেমে এই নির্দিষ্ট সমস্যাটিতে চলেছি। আমি আপনার ফাইলের নামগুলি প্যারামিটার ব্যবহার না করে পরিবর্তিত করার পরামর্শ দিচ্ছি।
জেবিসিপি

7

আমি এসকিপাচি থেকে এই স্নিপেটটি নিয়েছি এবং এটি আমার স্থানীয় অ্যাপাচি ওয়েবসার্ভারের একটি পৃথক .কনফ ফাইলে রেখেছি (আমার ক্ষেত্রে /etc/apache2/others/preventcaching.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>

উন্নয়নের জন্য কোডটি পরিবর্তন করার কোনও প্রয়োজন ছাড়াই এটি কাজ করে। উত্পাদন হিসাবে, আমি @ ডিভিটিওভারের পদ্ধতির ব্যবহার করতে পারি।


6

উন্নয়নের জন্য দ্রুত ফিক্স

বিকাশের জন্য, আপনি কেবল ক্রোম দেব সরঞ্জামগুলিতে ক্যাশে অক্ষম করতে পারেন ( ওয়েবসাইট বিকাশের জন্য ক্রোম ক্যাশে অক্ষম করা )। ক্যাশ অক্ষমকরণ কেবল তখনই ঘটে যখন ডিভাইস ডায়ালগটি খোলা থাকে, তাই প্রতিবার নিয়মিত ব্রাউজিংয়ের সময় এই বিকল্পটি টগল করার বিষয়ে আপনার চিন্তা করার দরকার নেই।

দ্রষ্টব্য: ' urlArgs ' ব্যবহার করা উত্পাদনের যথাযথ সমাধান যাতে ব্যবহারকারীরা সর্বশেষতম কোড পান। তবে এটি ডিবাগিংকে কঠিন করে তোলে কারণ ক্রোম প্রতিটি রিফ্রেশের সাথে ব্রেকপয়েন্টগুলিকে অকার্যকর করে তোলে (কারণ এটি একটি 'নতুন' ফাইল প্রতিবার পরিবেশন করা হচ্ছে)।


3

আমি প্রয়োজনীয় জেএস -এর সাথে ক্যাশে ফেটে যাওয়ার জন্য ' urlArgs ' ব্যবহার করার পরামর্শ দিচ্ছি না । যেহেতু এটি সমস্যার পুরোপুরি সমাধান করে না। কোনও সংস্করণ আপডেট করার ফলে আপনার কেবলমাত্র একটি একক সংস্থান পরিবর্তন করা সত্ত্বেও সমস্ত সংস্থান ডাউনলোড করার ফলস্বরূপ।

এই সমস্যাটি হ্যান্ডেল করার জন্য আমি নোট সংশোধন তৈরির জন্য 'ফাইলরেভ' এর মতো গ্রান্ট মডিউলগুলি ব্যবহার করার পরামর্শ দিচ্ছি। এর উপরে আমি গ্রান্টফাইলে একটি কাস্টম টাস্ক লিখেছি যেখানে যেখানেই প্রয়োজন সংশোধনটি আপডেট করার জন্য।

প্রয়োজনে আমি এই কাজের জন্য কোড স্নিপেট ভাগ করতে পারি।


আমি জাভাস্ক্রিপ্ট ফাইলগুলি পুনরায় লেখার জন্য গ্রান্ট-ফাইলরেভ এবং গ্রান্ট-ক্যাশে-বাস্টার সংমিশ্রণ ব্যবহার করি।
ইয়ান জ্যামিসন

2

এটি আমি জ্যাঙ্গো / ফ্লাস্কে এটি করি (সহজেই অন্যান্য ভাষা / ভিসিএস সিস্টেমের সাথে মানিয়ে নেওয়া যায়):

আপনার config.py(আমি পাইথন 3 এ এটি ব্যবহার করি, তাই আপনাকে পাইথন 2 এ এনকোডিংটি টুইঙ্ক করতে হবে)

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 ছাড়াই)

এই সমস্যার জন্য একটি সহজ সমাধান রয়েছে, যাতে আপনি প্রতিটি মডিউলটির জন্য একটি অনন্য সংশোধন নম্বর লোড করতে পারেন।

আপনি আসল প্রয়োজনীয় জেএস লোড ফাংশনটি সংরক্ষণ করতে পারেন, এটি আপনার নিজের ফাংশন দিয়ে ওভাররাইট করতে পারেন এবং আপনার পরিবর্তিত ইউআরএলটিকে মূল প্রয়োজনীয় জেএসে পার্স করতে পারেন load আবার লোড করুন:

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

আমাদের বিল্ডিং প্রক্রিয়ায় আমি মৌলিক ব্যবহার করা সমস্ত মডিউলগুলির সমস্ত সংশোধন সহ একটি ম্যানিফেস্ট ফাইল তৈরি করতে "গুল্প-রেভ" ব্যবহার করেছি। আমার গুল্প টাস্কের সরলীকৃত সংস্করণ:

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

এটি @ ফিল্ম এমসি কুলের গৃহীত উত্তর ছাড়াও।

আমি তার পদ্ধতিটি ব্যবহার করি তবে প্রাক-বিল্ড চালানোর জন্য টি 4 টেমপ্লেট তৈরি করে প্রক্রিয়াটি স্বয়ংক্রিয়ও করি।

প্রাক-বিল্ড কমান্ডগুলি:

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"

এখানে চিত্র বর্ণনা লিখুন

টি 4 টেমপ্লেট:

এখানে চিত্র বর্ণনা লিখুন

উত্পন্ন ফাইল: এখানে চিত্র বর্ণনা লিখুন

প্রয়োজনীয়.config.js লোড হওয়ার আগে ভেরিয়েবলে সঞ্চয় করুন: এখানে চিত্র বর্ণনা লিখুন

প্রয়োজনীয়.config.js এ রেফারেন্স:

এখানে চিত্র বর্ণনা লিখুন


2
সম্ভবত একটি জাভাস্ক্রিপ্ট সমস্যার সমাধান আপনার # সি কোডের একগুচ্ছ কারণ। এটি এমন কিছু কাজ করার জন্য অতিরিক্ত কাজ এবং কোডের একগুচ্ছ যা শেষ পর্যন্ত গ্রহণযোগ্য উত্তরের মতো ঠিক একইভাবে সম্পন্ন হয়।
এমএএডিটিটাহ

@mAAdhaTTah আপনি কোনও সার্ভার সাইড ল্যাঙ্গুয়েজ দিয়ে এটি করতে পারেন ... সি # হতে হবে না। এছাড়াও এটি প্রক্রিয়াটি স্বয়ংক্রিয় করে তোলে, যখন আপনি প্রকল্পের নতুন সংস্করণ তৈরি করেন তা নিশ্চিত করে গ্রাহক সর্বদা স্ক্রিপ্টগুলির সর্বশেষতম সংস্করণটি ক্যাশে করছেন। আমি মনে করি না যে এটি একটি নেতিবাচক মার্কডাউন প্রাপ্য। এটি সলিউশনে একটি স্বয়ংক্রিয় পদ্ধতির প্রস্তাব দিয়ে উত্তরটি প্রসারিত করছে।
জ্যাচ পেইন্টার

আমি মূলত এটি তৈরি করেছি কারণ প্রয়োজনীয় অ্যাপ্লিকেশন বজায় রাখার সময় যা প্রয়োজন.জেএসএস ব্যবহার করে, আমি নিজেই "(নতুন তারিখ ())। গেটটাইম ()) লিখে ম্যানুয়ালি মন্তব্য করেছিলাম এবং অ্যাপ্লিকেশনটি আপডেট করার সাথে সাথে স্থির ক্যাশেবাস্টারটিকে অসন্তুষ্ট করেছিলাম found । সহজ ভুলতে সকল হঠাৎ গ্রাহক পরিবর্তন যাচাই এবং ক্যাশে স্ক্রিপ্ট এইজন্য তাই তারা মনে করে কিছুই পরিবর্তিত হয়েছে .. সকল কারণ আপনি কেবল cachebuster পরিবর্তন করতে ভুলে গেছি অতিরিক্ত কোডের এই সামান্য বিট যে ঘটছে সম্ভাবনা মুছে যাবে।।।
জ্যাচ পেইন্টার

2
আমি এটি চিহ্নিত করি না, আসলে কী ঘটেছিল তা আমি জানি না। আমি কেবল কোডটিই পরামর্শ দিচ্ছি যা কেবল জেএস নয়, একটি সি # টেম্প্লেটিং ভাষা, যা জেএস দেবগণ তাদের সমস্যার উত্তর পাওয়ার চেষ্টা করছেন এমন সহায়ক হতে পারে না।
এমএএডিটিটাহ

-2

আমার ক্ষেত্রে আমি প্রতিবার ক্লিক করার সময় একই ফর্মটি লোড করতে চেয়েছিলাম, আমি ফাইলটিতে থাকা পরিবর্তনগুলি স্থির রাখতে চাইনি। এটি ঠিক এই পোস্টের সাথে প্রাসঙ্গিক নাও হতে পারে তবে এটি প্রয়োজনীয়তার জন্য কনফিগার না করে ক্লায়েন্টের পক্ষে সম্ভাব্য সমাধান হতে পারে। সরাসরি সামগ্রীগুলি প্রেরণের পরিবর্তে আপনি প্রয়োজনীয় ফাইলটির একটি অনুলিপি তৈরি করতে পারেন এবং প্রকৃত ফাইলটি অক্ষত রাখতে পারেন।

LoadFile(filePath){
    const file = require(filePath);
    const result = angular.copy(file);
    return result;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.