
سرعة موقع الويب ليست ترفًا، بل هي مقياس عمل بالغ الأهمية. البيانات مقنعة:
سرعة موقع الويب ليست ترفًا، بل هي مقياس عمل بالغ الأهمية. البيانات مقنعة:
كل مللي ثانية لها أهميتها. تتناول هذه المقالة استراتيجيات شاملة لجعل مواقع الويب الخاصة بك تشتعل بسرعة.
قم بإزالة المسافات البيضاء والتعليقات والأحرف غير الضرورية من HTML وCSS وJavaScript. تتعامل أدوات البناء الحديثة مع هذا تلقائيًا:
# Using Terser for JavaScript
npx terser input.js -o output.min.js --compress --mangle
# Using cssnano via PostCSS
npx postcss input.css -o output.min.css --use cssnano
# Using html-minifier
npx html-minifier input.html -o output.min.html --collapse-whitespace
التأثير — يؤدي التصغير عادة إلى تقليل أحجام الملفات بنسبة 30-60%.
تمثل الصور أكثر من 50% من وزن الصفحة في معظم مواقع الويب.
الصيغ الحديثة:
الصور المستجيبة:
<img
src="photo-800.jpg"
srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, 50vw"
alt="Description"
loading="lazy"
/>
أدوات:
التأثير — يمكن أن يؤدي التحسين المناسب للصورة إلى تقليل وزن الصفحة بنسبة 60-80%.
تقسيم التعليمات البرمجية إلى تقسيم JavaScript إلى أجزاء يتم تحميلها عند الطلب:
// React lazy loading
const Dashboard = React.lazy(() => import('./Dashboard'));
// Webpack dynamic import
import(/* webpackChunkName: "chart" */ './Chart').then(module => {
module.renderChart();
});
اهتزاز الشجرة يزيل الكود الميت. تقوم Webpack وRollup وesbuild بإزالة الصادرات غير المستخدمة أثناء التجميع. تأكد من استخدام وحدات ES ('import/export`) لكي تعمل اهتزاز الأشجار بفعالية.
يخدم التخزين المؤقت الموارد التي تم جلبها مسبقًا من وحدة التخزين المحلية، مما يتجنب طلبات الشبكة تمامًا.
# Apache .htaccess
<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif|js|css|svg|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
# Nginx
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
بالنسبة لملفات HTML، استخدم أوقات ذاكرة تخزين مؤقت أقصر (max-age=0، must-revalidate) أو علامات ETag للتحقق من صحة الحداثة.
يعمل عمال الخدمة كوكيل شبكة قابل للبرمجة في المتصفح:
// service-worker.js
const CACHE_NAME = 'v1';
const urlsToCache = ['/', '/styles.css', '/app.js'];
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME).then(cache => cache.addAll(urlsToCache))
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
// Cache-first strategy for static assets
return response || fetch(event.request);
})
);
});
استراتيجيات التخزين المؤقت لعامل الخدمة:
| استراتيجية | حالة الاستخدام |
|---|---|
| ذاكرة التخزين المؤقت أولا | الأصول الثابتة (الصور، CSS، JS) |
| الشبكة أولا | مكالمات API، المحتوى الديناميكي |
| لا معنى لها أثناء إعادة التحقق | خلاصات الأخبار، ومنشورات المدونة |
| الشبكة فقط | النماذج وواجهات برمجة التطبيقات للدفع |
تقوم شبكة CDN (شبكة توصيل المحتوى) بتخزين المحتوى مؤقتًا على خوادم الحافة الموزعة جغرافيًا. مقدمي الخدمات المشهورين:
التأثير — يؤدي التخزين المؤقت لـ CDN إلى تقليل تحميل الخادم بنسبة 80%+ وتقليل زمن الوصول بنسبة 50-80% للمستخدمين العالميين.
يتوقف تحليل HTML مؤقتًا عندما يواجه المتصفح علامات <script> أو <link rel="stylesheet">. هذا يمنع التقديم.
<!-- Async: download in parallel, execute as soon as downloaded -->
<script async src="analytics.js"></script>
<!-- Defer: download in parallel, execute in order after HTML parsing -->
<script defer src="app.js"></script>
القاعدة الأساسية:
يلزم استخراج CSS وتضمينه للمحتوى الموجود في الجزء العلوي:
<head>
<style>
/* Inlined critical CSS */
header { background: #333; color: white; }
.hero { min-height: 80vh; display: flex; align-items: center; }
/* ... only what's visible on initial load */
</style>
<!-- Deferred non-critical CSS -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
</head>
الأدوات: تعمل العناصر الحرجة (Node.js) وPenthouse وwebpack-critical على إنشاء CSS مضمّن تلقائيًا.
<!-- Preload critical resources early -->
<link rel="preload" href="hero-image.webp" as="image">
<!-- Preconnect to third-party origins -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://api.example.com">
<!-- Prefetch resources needed on the next page -->
<link rel="prefetch" href="next-page.html">
مسار العرض الحرج هو سلسلة الخطوات التي يتخذها المتصفح لعرض الصفحة. يؤدي تحسينه إلى تقليل وقت التفاعل.
| بروتوكول | الميزات الرئيسية |
|---|---|
| HTTP/1.1 | طلب واحد لكل اتصال (محدود) |
| HTTP/2 | تعدد الإرسال، دفع الخادم، ضغط الرأس، البروتوكول الثنائي |
| HTTP/3 | يتعامل الاتصال بدون RTT المستند إلى QUIC مع فقدان الحزم بشكل أفضل |
يجعل HTTP/2 عملية التجميع أقل أهمية - حيث يمكنك خدمة العديد من الملفات الصغيرة دون الحاجة إلى حمل اتصال HTTP/1.1.
# Enable Brotli (preferred, ~20% better than Gzip)
brotli on;
brotli_types text/plain text/css application/json application/javascript;
# Fallback Gzip
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;
gzip_vary on;
تعد مؤشرات أداء الويب الأساسية من Google هي المقاييس الثلاثة الأكثر تأثيرًا في تجربة المستخدم:
يقيس أداء التحميل. يجب أن يتم عرض أكبر عنصر مرئي (الصورة الرئيسية، العنوان) بسرعة.
تحسين:
fetchpriority="high" على عنصر LCP:
<img src="hero.webp" fetchpriority="high" alt="Hero">
يقيس التفاعل. تم استبداله بـ INP (التفاعل مع الطلاء التالي) في عام 2024.
تحسين:
يقيس الاستقرار البصري. لا ينبغي أن تتغير العناصر بشكل غير متوقع.
تحسين:
img, video {
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
}
/* Reserve space for dynamic content */
.ad-container {
min-height: 250px;
}
يتم دعم التحميل البطيء الأصلي في جميع المتصفحات الحديثة:
<img src="photo.webp" loading="lazy" alt="Lazy loaded image">
<iframe src="map.html" loading="lazy"></iframe>
بالنسبة للمتصفحات الأقدم، استخدم مراقب التقاطع كبديل:
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
document.querySelectorAll('img[data-src]').forEach(img => observer.observe(img));
<!-- DNS prefetch resolves domain names early -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<!-- Preconnect establishes full connection (DNS + TCP + TLS) -->
<link rel="preconnect" href="https://fonts.googleapis.com">
/* Font-display controls how fonts render while loading */
@font-face {
font-family: 'CustomFont';
src: url('custom-font.woff2') format('woff2');
font-display: swap; /* Show fallback text immediately */
}
/* Subset fonts to include only needed characters */
/* Use variable fonts for multiple weights in one file */
| أداة | يكتب | أفضل ل |
|---|---|---|
| منارة | مختبر | التدقيق والتوصيات |
| رؤى سرعة الصفحة | مختبر + حقل | المقاييس الخاصة بجوجل |
| اختبار صفحة الويب | مختبر | تحليل الشلال التفصيلي |
| أدوات تطوير Chrome | مختبر | الشبكة والأداء والتغطية |
| ** أداء الحراسة ** | رم | مراقبة المستخدم الحقيقي |
| ** Datadog رم ** | رم | تتبع الأداء من النهاية إلى النهاية |
| عيار | مستمر | ميزانيات الأداء وCI |
| المنارة CI | سي.آي | منع التراجعات |
تحديد ميزانية الأداء لمنع التراجعات:
{
"budgets": [
{
"resourceType": "total",
"budget": 500000
},
{
"resourceType": "script",
"budget": 150000
},
{
"resourceType": "image",
"budget": 200000
},
{
"timing": {
"metric": "interactive"
},
"budget": 5000
}
]
}
أداء الويب هو الانضباط المستمر. ابدأ بالعناصر ذات التأثير الأعلى:
إن تحسين الأداء لا يتم "إنجازه" أبدًا - فهو يتطلب اهتمامًا مستمرًا، ولكن عائد الاستثمار في رضا المستخدم والتحويلات وتحسين محركات البحث يكون كبيرًا.
لا توجد تعليقات معتمدة بعد. قد تنتظر الردود الجديدة المراجعة.