يعرض لك هذا الدرس التطبيقي كيفية تغيير عناوين تخزين HTTP مؤقتًا التي يتم عرضها من خلال خادم ويب مستند إلى Node.js ويشغِّل العرض سريع إطار العمل. وستوضح أيضًا كيفية التأكد من أن سلوك التخزين المؤقت الذي تتوقعه قيد التطبيق باستخدام لوحة "الشبكة" في "أدوات مطوري البرامج" في Chrome.
التعرف على نموذج المشروع
هذه هي الملفات الرئيسية التي ستعمل عليها في نموذج المشروع:
- يحتوي
server.js
على رمز Node.js الذي يعرض رمز تطبيق الويب المحتوى. يستخدم سريع للتعامل مع طلبات HTTP والردود. وعلى وجه الخصوص، يتم استخدامexpress.static()
لخدمة جميع الملفات المحلية في الدليل العام، وبالتالي فإنserve-static
المستندات ستكون مفيدة. public/index.html
هو رمز HTML لتطبيق الويب. مثل معظم ملفات HTML، لا يكون سيحتوي على أي معلومات حول الإصدارات كجزء من عنوان URL الخاص به.public/app.15261a07.js
وpublic/style.391484cf.css
هما JavaScript لتطبيق الويب ومواد عرض CSS. يحتوي كل من هذه الملفات على تجزئة في عناوين URL الخاصة بها، مع محتوياتها. ويكونindex.html
مسؤولًا عن الحفاظ على تتبع عنوان URL المحدد ذي الإصدار المطلوب تحميله.
ضبط رؤوس التخزين المؤقت لملفات HTML
عند الاستجابة لطلبات عناوين URL التي لا تحتوي على معلومات حول الإصدارات،
تأكَّد من إضافة Cache-Control: no-cache
إلى رسائل الرد. جنبًا إلى جنب مع
يوصى بإعداد أحد رأسي الاستجابة الإضافيين: إما
Last-Modified
أو ETag
تشير رسالة الأشكال البيانية
يندرج "index.html
" ضمن هذه الفئة. يمكنك تقسيم ذلك إلى خطوتين.
أولاً، يتم التحكّم في العنوانَين Last-Modified
وETag
من خلال
etag
أو
lastModified
خيارات التهيئة. يتم ضبط كلا الخيارَين تلقائيًا على true
للجميع
استجابات HTTP، لذا في هذا الإعداد الحالي، ليس عليك الموافقة للحصول على هذه استجابات
السلوك. ولكن يمكنك أن تكون صريحًا في التهيئة على أي حال.
ثانيًا، يجب أن تكون قادرًا على إضافة عنوان Cache-Control: no-cache
، ولكن
فقط لمستندات HTML (index.html
، في هذه الحالة). تتمثل أسهل طريقة
تعيين هذا العنوان بشكل مشروط
في كتابة عنوان مخصص
setHeaders function
،
ومن ثم تحقق مما إذا كان الطلب الوارد يتعلق بمستند HTML.
- انقر على إنشاء ريمكس لتعديل لجعل المشروع قابلاً للتعديل.
تبدأ إعدادات العرض الثابتة في server.js
على النحو التالي:
app.use(express.static('public'));
- قم بإجراء التغييرات الموضحة أعلاه، وينبغي أن ينتهي بك الأمر إلى شيء يشبه:
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
}
},
}));
ضبط رؤوس التخزين المؤقت لعناوين URL ذات النُسخ المختلفة
عند الاستجابة لطلبات عناوين URL التي تحتوي على
"بصمة الإصبع" أو
حول نسخ المعلومات، والتي لا تهدف محتوياتها مطلقًا إلى تغيير
Cache-Control: max-age=31536000
على ردودك. يعمل app.15261a07.js
يندرج style.391484cf.css
ضمن هذه الفئة.
يعتمد إنشاء
setHeaders function
مستخدمة في الخطوة الأخيرة، يمكنك إضافة منطق إضافي للتحقق مما إذا كان
يتعلق بعنوان URL ذي نسخة، وإذا كان الأمر كذلك، أضِف العنوان Cache-Control:
max-age=31536000
.
أقوى طريقة للقيام بذلك هي استخدام
تعبير عادي
لمعرفة ما إذا كانت مادة العرض المطلوبة تتطابق مع نمط معيّن
تعرف على التجزئة. وفي حالة نموذج المشروع هذا، تكون دائمًا ثمانية
الأحرف من مجموعة الأرقام من 0 إلى 9 والأحرف الصغيرة a-f (أي
ست عشرية). التجزئة
دائمًا ما يتم فصلها بحرف .
على كلا الجانبين.
تعبير عادي
تتطابق مع تلك القواعد العامة
ويمكن التعبير عنها بالصيغة new RegExp('\\.[0-9a-f]{8}\\.')
.
- عدِّل الدالة
setHeaders
لتبدو كما يلي:
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
const hashRegExp = new RegExp('\\.[0-9a-f]{8}\\.');
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
} else if (hashRegExp.test(path)) {
// If the RegExp matched, then we have a versioned URL.
res.setHeader('Cache-Control', 'max-age=31536000');
}
},
}));
تأكيد السلوك الجديد باستخدام "أدوات مطوري البرامج"
ومع وجود التعديلات على خادم الملفات الثابت، يمكنك التحقق لإجراء تأكَّد من ضبط العناوين الصحيحة من خلال معاينة التطبيق المباشر مع فتح لوحة "شبكة مطوري البرامج" (DevTools Network).
لمعاينة الموقع الإلكتروني، اضغط على عرض التطبيق. ثم اضغط ملء الشاشة
تخصيص الأعمدة المعروضة في لوحة "الشبكة" لتضمين المعلومات الأكثر صلة، عن طريق النقر بزر الماوس الأيمن عنوان العمود:
في ما يلي الأعمدة التي يجب الانتباه إليها هي Name
وStatus
وCache-Control
ETag
، وLast-Modified
.
- بعد فتح أدوات مطوّري البرامج على لوحة "الشبكة"، أعِد تحميل الصفحة.
بعد تحميل الصفحة، من المفترض أن ترى إدخالات في لوحة "الشبكة" التي تظهر مثل ما يلي:
الصف الأول مخصص لمستند HTML الذي انتقلت إليه. هذا صحيح
مع Cache-Control: no-cache
. حالة استجابة HTTP لهذا الطلب
هو 304
. هذا النمط
يعني أنّ المتصفّح لم يستخدم على الفور رمز HTML المخزن مؤقتًا، ولكن بدلاً من ذلك
قدَّم طلب HTTP إلى خادم الويب، باستخدام Last-Modified
وETag
لمعرفة ما إذا كان هناك أي تحديث تم إدخاله بالفعل على HTML
ذاكرة التخزين المؤقت الخاصة به. تشير استجابة HTTP 304 إلى عدم توفُّر محتوى HTML محدَّث.
الصفّان التاليان مخصّصان لمواد عرض JavaScript وCSS التي تتضمّن نُسخًا مختلفة. عليك
رؤيتها معروضة من خلال Cache-Control: max-age=31536000
، وحالة HTTP
لكل منها 200
.
بسبب الإعدادات المستخدمة، لا يتم إجراء طلب فعلي إلى
خادم Node.js، وسيؤدي النقر على الإدخال إلى عرض تفاصيل إضافية،
بما في ذلك أن الاستجابة جاءت "(من ذاكرة التخزين المؤقت على القرص)".
ولا تحظى القيم الفعلية لعمود ETag وLast-Modified بأهمية كبيرة. تشير رسالة الأشكال البيانية المهم هو التأكد من ضبطها.
تلخيص الأمور
وبعد الاطّلاع على الخطوات الواردة في هذا الدرس التطبيقي حول الترميز، أصبحت الآن على دراية بكيفية يمكنك إعداد عناوين استجابة HTTP في خادم ويب مستند إلى Node.js باستخدام Express، لتحقيق الاستخدام الأمثل لذاكرة التخزين المؤقت HTTP. لديك أيضًا الخطوات التي تحتاج إلى تأكيدها استخدام سلوك التخزين المؤقت المتوقع، عبر لوحة "الشبكة" في أدوات مطوري البرامج في Chrome