چند روز پیش یاد یک خاطرهای افتادم که برمیگرده به سال دومی که #برنامه_نویسی میکردم و هنوز #جونیور بودم. قرار بود یک قابلیتی رو به سایت شرکت اضافه کنم و بچههای دیجیتال مارکتینگمون این #Feature رو تبلیغ کنن تا 10 هزار کاربری که داشتیم بتونن ازش استفاده کنن. ۳-۴ روز زمان گذاشتیم برای اینکه اون قابلیت رو به وبسایت اضافه کنیم و بچههای #مارکتینگ بتونن حسابی روش مانور بدن. فردای روز انتشار و بعد از اجرا شدن کمپین…
مدیر #دیجیتال_مارکتینگمون اومد تو اتاق تیم فنی و به من گفت که چرا بعضی کاربرها میگن از این قابلیت نمیتونن استفاده کنن؟! گفتم حاجی بخدا دیشب منتشرش کردم و اصلا بیا خودت ببینش روی لپتاپ من! اومدم بهش روی لپتاپ خودم نشون بدم که دیدم برای من هم نمایش داده نمیشه! یادم اومد برای اینکه نمایش پیدا کنه CTRL+F5 نیاز داره. بعد از اینکه درست شد، بهش گفتم: واسه اینکه کاربرها هم بتونن ببیننش باید CTRL+F5 رو بزنن! یهو سرم حسابی داد کشید و گفت: یعنی به ۱۰ هزار تا کاربر دوباره پیامک بدیم و بگیم برای استفاده از این قابلیت باید CTRL+F5 بزنین؟! معلوم هست چی میگی؟!
کمپین ما که خیلی خوب پیش نرفت. ولی این داستان درس عبرتی برای من شد که موضوع CTRL+F5 رو خیلی جدی بگیرم. چون میتونه مشکلات پرهزینهای رو برای سازمان ایجاد کنه.
متن کامل رو از لینک بخونید. نظرات فنی خوبی هم داره. با سطوح مختلف کش هم یکم آشنا میشید.
از لینکدین Amirhosein Golshani
کامنت دوستان در مورد همین داستان ctrl + F5 توی جنگوAmir:میشه از روش های cache busting استفاده کرد، که یه روش مرسومش اینه که میاد یه بخشی از هش فایل رو به اسم فایل اضافه میکنه و با این کار مرورگر کاربر رو فورس میکنه که فایلهای استاتیک جدید رو دانلود کنه.توی جنگو هم هست.————————————————–Ali:{% now “U” %}اینو به آدرس فایل استاتیک اضافه میکنی همونه؟————————————————–Amir:میشه از این هم استفاده کرد، اما چند تا مشکل داره، اول این که هر جا داری آدرس استاتیک فایل میدی باید تهش یه همچین تگی اضافه کنی?timestamp={% now ‘U’ %}که خب یه کار حوصله سر بریه و ممکنه بعضی جاها دولوپر یادش بره و… مشکل دوم که مهم تر هم هست اینه که وقتی از now استفاده میکنی در واقع داری هر ثانیه تگی که به استاتیک فایلت میزنی رو عوض میکنی و اینجوری عملا مرورگر دیگه نمیتونه کش کنه و هر ثانیه باید دوباره استاتیک فایل ها رو دانلود کنه چون فکر میکنه که ندارتشون! خب همین باعث میشه تعداد ریکوئست هایی که میاد سمت سرور خیلی زیاد بشه (البته اگر فایل های استاتیک رو خودت serve کنی اگر نه تعداد ریکوئست ها به CDN ای که داری استفاده میکنی بیشتر میشه) و این که با توجه به سرعت نت کاربر ممکنه لود سایت براش کند بشه!راه بهترش اینه که فقط موقعی مرورگر رو فورس کنی فایل جدید رو بگیره که واقعا محتوای فایل استاتیک عوض شده باشه! برای همین از هش فایل استفاده میکنن. برای این کار یه روشش اینه که STATICFILES_STORAGE رو داخل فایل settings عوض کنی، بعد با هر بار اجرای collectstatic اسم فایل ها به همراه هش اش ذخیره میشه و البته یه فایل staticfiles.json هم ذخیره میشه که map بین اسم اصلی فایل و اسم فایل+هش فایل هست، خوبیش اینه که دیگه نمیخواد دستی هر جا داری به استاتیک فایل رفرنس میدی تگ اضافه کنی، کلا کار اضافه ای نیاز نیست بکنی، خودش کار هارو هندل میکنه (حتی اگر مثلا فایل های استاتیکت رو میریزی توی یه object storage مثل minIO، اون رو هم ساپورت میکنه). اینطوریه:STATICFILES_STORAGE = ‘django.contrib.staticfiles.storage.ManifestStaticFilesStorage’راه های دیگه هم هست مثل استفاده از webpack یا پکیج whitenoise که اینا یه سری کارهای دیگه هم انجام میدن، مثل compress کردن و minify کردن و optimize کردن فایل های استاتیک و…