Software Development8 min read1758 words

How to Actually Make Your Website Fast

Alara Türkü

PlusClouds Author

Cloud & SaaS

ملخص سريع

What Actually Made Our Site Fast: A Retrospective on Moving from Laravel to Next.js by the PlusClouds Engineering Team.

How to Actually Make Your Website Fast

الجميع يريد موقع ويب سريع، لكن المواقع المختلفة لها رحلات مختلفة. هذه هي تجربتنا، أسبابنا، رحلتنا ونتائجنا. إليك ما فعلناه لجعل موقعنا أسرع في عام 2026.

انضم إلى مجتمعنا إذا كنت ترغب في الحصول على نصائح أكثر تخصيصًا لموقعك على الويب بشكل خاص.

Community

Further questions? Ask our team

هناك نسخة من هذا المنشور حيث نخبرك بأن لدينا خطة كبيرة، نفذناها بشكل مثالي، وأطلقنا موقعًا محسنًا بشكل مثالي. هذا ليس ما حدث.

ما حدث بالفعل هو أننا ورثنا قاعدة كود متنامية، أجرينا أول تدقيق لنا باستخدام Lighthouse منذ فترة، ورأينا درجة 34 على الجوال، وأجرينا محادثة طويلة وغير مريحة حول كيفية وصولنا إلى هناك.

لماذا انتقلنا من Laravel إلى Next.js

لم يكن الانتقال من Laravel إلى Next.js هو أول غريزة لدينا، لكنه أصبح الخيار الواضح. بدأ موقعنا التسويقي كتطبيق Laravel. قوالب Blade، HTML المعروض من الخادم، ورشة من jQuery. كان ذلك معقولًا تمامًا للمقياس الذي كنا عليه. ولكن مع نمو المنتج بلغات متعددة، وصفحات التسعير التي تسحب البيانات الحية، ومدونة ذات حركة مرور حقيقية، وتدفقات مصادقة معقدة؛ ما كان يومًا "معقولًا تمامًا" أصبح "مكلفًا بهدوء للصيانة."

المشكلة الحقيقية لم تكن الأداء. كانت السرعة. كل تغيير في الواجهة الأمامية كان يمس PHP. تعديل النص يعني نشرًا في الخلفية. إضافة قسم جديد للصفحة يعني تدفق البيانات عبر المتحكمات، عبر ملحنات العرض، إلى ملفات Blade. الأشخاص الذين كان يجب أن يمتلكوا الواجهة الأمامية (المصممون، المسوقون، الإنتاج) لم يتمكنوا من لمسها بدون مهندس في الحلقة.

انتقلنا إلى Next.js 15 مع App Router. ليس لأنه كان الطريق الأسهل، ولكن لأنه أعطانا العرض من جانب الخادم، التوليد الثابت، إعادة التحقق التدريجي، ونموذج المكونات الصحيح، كل ذلك في إطار عمل واحد. كان القرار صحيحًا. التنفيذ كان به حواف خشنة ما زلنا نقوم بتنعيمها.

image

كان أول تدقيق لنا باستخدام Lighthouse على Next.js متواضعاً

لم يقدم أول تدقيق لنا باستخدام Lighthouse على موقع Next.js الجديد التحسين الذي توقعناه. عندما أطلقنا الموقع الجديد وشغلناه لأول مرة، توقعنا تحسنًا عن Laravel. لم نحصل على واحد، على الأقل ليس على الفور.

كانت الدرجة أسوأ في بعض الفئات. كان ذلك محيرًا حتى فهمنا السبب: الانتقال إلى إطار عمل حديث لا يجعل موقعك سريعًا تلقائيًا. إنه يوفر لك أدوات أفضل. استخدام تلك الأدوات بشكل صحيح هو مشكلة منفصلة.

أول شيء لاحظناه كان يبطئ موقعنا هو الموارد التي تعيق العرض. ليس JavaScript، فقد كنا حذرين بشأن ذلك. كانت المشكلة أكثر دقة: النطاقات الخارجية التي كنا نجلب منها لم يكن لديها تلميحات المتصفح. كانت صورنا تعيش على "$static.plusclouds.com$". كان API لدينا على "$apiv4.plusclouds.com$". لم يكن لأي منهما تلميح preconnect في رأس الوثيقة. لذلك في كل تحميل للصفحة، كان المتصفح يقوم بتحليل HTML، يواجه طلبًا لنطاق خارجي، ثم يبدأ في حل DNS ومصافحة TCP من البداية.

سطران في تخطيط الجذر أصلحا ذلك:

<link rel="preconnect" href="https://static.plusclouds.com" />
<link rel="preconnect" href="https://apiv4.plusclouds.com" />

يبدو الأمر بسيطًا جدًا. لكن تلميحات preconnect هي واحدة من تلك الأشياء حيث يتضاعف تكلفة عدم وجودها عبر كل تحميل صفحة فردي، لكل زائر فردي. يبدأ المتصفح الآن في إنشاء تلك الاتصالات قبل أن يواجه حتى الصورة الأولى أو API المكالمة. لذا، فإن تلميحات preconnect هي شيء يجب الانتباه إليه إذا كنت تريد جعل موقعك أسرع.

كيف قمنا بتقليل حجم حزمة JavaScript من خلال إدارة أفضل للسكربتات

كان تقليل حجم حزمة JavaScript من خلال إدارة أفضل للسكربتات واحدًا من الانتصارات الأكثر هدوءًا ولكن الأكثر تأثيرًا في انتقالنا. في عصر Laravel، تراكمت السكربتات بشكل عضوي. التحليلات هنا، أداة الدردشة هناك، بكسل طرف ثالث أضيف خلال حملة تسويقية ولم يتم إزالته أبدًا. كان كل واحد عبارة عن علامة سكربت متزامنة أو مؤجلة، وكان ترتيب إضافتها يعكس ترتيب شحن الميزات، وليس أي اعتبار مدروس لما تحتاجه الصفحة بالفعل للعرض.

عندما انتقلنا إلى Next.js، حملنا بعض تلك العادات معنا مع إدارة أفضل للسكربتات. كان لدينا مكونات تستورد مكتبات أيقونات كاملة عندما كانت تستخدم أيقونتين فقط. كان لدينا دوال مساعدة مستوردة في أعلى الملفات التي كانت مطلوبة فقط في فرع محدد. كان لدينا مكونات العميل معلمة 'use client' التي لم يكن لديها أي تفاعل على الإطلاق؛ لقد كتبت بهذه الطريقة عندما لم يكن أحد متأكدًا.

كل واحدة من هذه العناصر صغيرة. مجتمعة، تضيف إلى حزمة JavaScript أكبر بشكل ملحوظ. قمنا بمراجعة قاعدة الكود بشكل منهجي: تم تقييم كل سكربت طرف ثالث لمعرفة ما إذا كان يحتاج إلى أن يكون في < head > أو يمكن تأجيله. تم التحقق من كل استيراد كبير مقابل الاستخدام الفعلي.

تم تحويل المكونات التي لم تكن بحاجة إلى واجهات برمجة التطبيقات للمتصفح مرة أخرى إلى مكونات الخادم. انخفض حجم الحزمة، ومعه، الوقت قبل أن تصبح الصفحة تفاعلية.

القاعدة التي استقرينا عليها لجعل الموقع أسرع هي: لا يتم استيراد أي شيء حتى يكون مطلوبًا، لا يتم تشغيل أي شيء في المتصفح يمكن تشغيله على الخادم، ولا يتم تحميل أي شيء في < head > إلا إذا كان سيعيق عرضًا مرئيًا.

إذا كنت تريد المزيد من العملاء المحتملين للإشارة إلى موقعك السريع، تحقق من أداة الذكاء الاصطناعي الخاصة بنا التي تعمل على أتمتة عملية المبيعات.

LeadOcean

Start generating leads free

تحسين الصور في Next.js: WebP، CDN، وخصائص الأولوية

تحسين الصور في Next.js — بما في ذلك تحويل الصيغ، تسليم CDN، وخصائص الأولوية، كان العنصر الأكثر تكلفة في أي صفحة، وقد أخطأنا فيه أكثر من مرة. الجميع يوافق على تحسين الصور ثم يعودون إلى تحميل JPEG بحجم 3.7 ميجابايت مباشرة من تصدير Figma. فعلنا ذلك بالضبط. عدة مرات.

المحمل المخصص للصور الذي بنيناه يوجه كل حركة المرور الإنتاجية عبر imgproxy على CDN لدينا. يتم تغيير حجم كل صورة إلى الأبعاد المطلوبة فعليًا، وتقديمها بالتنسيق الصحيح للمتصفح الطالب، وتخزينها مؤقتًا عند الحافة. لم يعد الزائر المحمول على شاشة 390 بكسل يقوم بتنزيل نسخة 1600 بكسل من نفس الصورة. يتعامل المحمل مع كل هذا بشكل شفاف؛ يكتب المطور علامة < Image > عادية وCDN يقوم بالباقي.

لكن تحويل الصيغ هو مشكلة منفصلة عن التسليم. JPEG المقدمة من CDN سريع لا تزال JPEG. تحويل خلفيات الأبطال والصور التسويقية الكبيرة إلى WebP يقلل من أحجام الملفات بنسبة 60 إلى 80 بالمائة. كان لدينا PNG بحجم 1.3 ميجابايت على صفحة البطل الرئيسية ولم نلتقطها حتى أشار إليها Lighthouse في التدقيق الرابع على التوالي. يجب أن تزن تلك الصورة حوالي 200 كيلوبايت في WebP. لا يمكن لـCDN إصلاح ذلك؛ فقط تحويل الملف المصدر يمكنه ذلك.

الشيء الآخر الذي أخطأنا فيه لفترة أطول مما ينبغي: خاصية priority على صور Next.js. يقوم الإطار بتحميل الصور بشكل كسول افتراضيًا، وهو السلوك الصحيح للصور أسفل الطية. لكن عنصر Largest Contentful Paint (تقريبًا دائمًا صورة البطل) لا ينبغي أبدًا تحميله بشكل كسول. إضافة priority تخبر Next.js بتحميل تلك الصورة مسبقًا والتوقف عن معاملتها كمحتوى اختياري. إنها خاصية واحدة. التحسين في LCP فوري وقابل للقياس.

image

استراتيجية العرض في Next.js: التوليد الثابت، ISR، والعرض الديناميكي

اختيار استراتيجية العرض الصحيحة في Next.js (التوليد الثابت، ISR، أو العرض الديناميكي) هو واحد من أهم القرارات المعمارية في الإطار، وله عواقب أداء حقيقية.

العرض من الخادم عند كل طلب، التوليد الثابت في وقت البناء، التوليد الثابت مع إعادة التحقق الدورية: هذه أدوات مختلفة لمشاكل مختلفة، واستخدام الأداة الخاطئة له عواقب أداء حقيقية.

صفحات المنتج لدينا (مواصفات الخادم، مستويات التسعير، توثيق الميزات) لا تتغير بالدقيقة. الآن تستخدم generateStaticParams مدمجة مع ISR ونافذة إعادة التحقق لمدة ساعة واحدة. في وقت البناء، يتم عرض كل تركيبة لغة مسبقًا إلى HTML ثابت. يحصل المستخدم الذي يزور صفحة المنتج على ملف مخزن مؤقتًا يتم تقديمه من حافة CDN في أقل من 100 مللي ثانية. لا يوجد خادم، لا استعلام قاعدة بيانات، لا عملية Node.js تستيقظ.

الصفحات التي تحتاج إلى بيانات جديدة (فهرس المدونة، التسعير المباشر، أي شيء خاص بالمستخدم) تستخدم نوافذ إعادة التحقق القصيرة أو العرض الديناميكي مع التخزين المؤقت على مستوى المكون. النتيجة هي أن الغالبية العظمى من حركة المرور لدينا يتم تقديمها من HTML ثابت، والخادم يقوم بعمل حقيقي فقط عندما يتغير المحتوى بالفعل.

TTFB على معظم الصفحات الآن أقل من 100 مللي ثانية باستمرار. في إعداد Laravel القديم، نادرًا ما كان أقل من 400 مللي ثانية. هذا ليس الإطار الذي يقوم بالسحر، إنه نتيجة لاتخاذ قرارات متعمدة، لكل صفحة، حول استراتيجية العرض التي منطقية.

البيانات المنظمة لـSEO، علامات hreflang، وبيانات OpenGraph غير مرئية للمستخدمين ولكنها مهمة لكل شيء آخر، ولم يكن لدينا تقريبًا أي منها عندما انتقلنا. يتطلب التحسين لميزات الذكاء الاصطناعي التوليدية من Google محتوى منظمًا وقابلًا للزحف مع علامات التخطيط الصحيحة.

أضفنا JSON-LD لصفحات FAQPage إلى صفحات المنتج والميزات. مخطط SoftwareApplication لأدواتنا. BreadcrumbList لتسلسل التنقل. مخطط المؤسسة في تخطيط الجذر. يتم قراءة هذه من قبل زواحف البحث وبشكل متزايد من قبل أنظمة الذكاء الاصطناعي التي تقرر ما إذا كان سيتم تضمين المحتوى الخاص بك في الملخصات المولدة وصناديق الإجابة.

كانت حالة hreflang أكثر فوضوية. نحن ندعم أربع لغات وكانت روابطنا البديلة غير متسقة في أفضل الأحوال، مفقودة في أسوأ الأحوال. بنينا دالة مشتركة buildAlternates() التي تولد علامات hreflang الصحيحة من وسيطة مسار واحدة وتعمل على كل صفحة. إنه نوع الشيء الذي يبدو وكأنه أعمال منزلية حتى تدرك أن علامات hreflang الخاطئة أو المفقودة تضر بأداء البحث الدولي الخاص بك.

كانت بيانات OpenGraph مشابهة، بعض الصفحات كانت تحتوي عليها، وبعضها لم يكن، وكانت أبعاد الصور غير متسقة. توحيدها من خلال واجهة برمجة التطبيقات generateMetadata في Next.js وإضافة metadataBase إلى تخطيط الجذر يعني أننا توقفنا عن التفكير فيها لكل صفحة وبدأنا في الحصول عليها بشكل صحيح في كل مكان بشكل افتراضي.

النتائج: درجة Lighthouse فوق 90، LCP أقل من 2.5 ثانية، TTFB أقل من 100 مللي ثانية

بعد الانتقال، درجتنا في Lighthouse على الجوال هي باستمرار فوق 90. CLS أقل من 0.05. LCP أقل من 2.5 ثانية على معظم الصفحات. TTFB أقل من 100 مللي ثانية للمحتوى المقدم بشكل ثابت.

لم ننته بعد. لا تزال هناك صور يجب أن تكون WebP ولكن ليست كذلك، صفحات يمكن أن تكون مولدة بشكل ثابت ولكنها تعتمد على العرض الديناميكي، وبيانات منظمة يمكن أن تكون أكثر تحديدًا. القائمة أقصر مما كانت عليه، لكنها لا تصل أبدًا إلى الصفر.

الدرس الصادق من كل هذا هو أن الأداء ليس مشروعًا تنتهي منه، إنه مجموعة من الافتراضات التي تؤسسها. priority على كل صورة بطل قبل دمج PR. preconnect مضاف في نفس اليوم الذي يتم فيه تقديم نطاق خارجي جديد. البيانات المنظمة مكتوبة جنبًا إلى جنب مع محتوى الصفحة، وليس مضافة بأثر رجعي. الاستيرادات مدققة قبل أن تصبح وزن الحزمة.

عندما تصبح هذه الأشياء عادات بدلاً من قوائم مراجعة، تتوقف عن قضاء السبرينتات في التعافي من القرارات المتراكمة وتبدأ في الشحن بسرعة بشكل افتراضي.

انضم إلى مجتمعنا إذا كنت ترغب في الحصول على نصائح أكثر تخصيصًا لموقعك على الويب بشكل خاص.

Community

Further questions? Ask our team

تحقق من خوادمنا لفتح بنية تحتية سريعة وذكية من لوحة واحدة. ميزاتنا المجانية مثل النسخ الاحتياطي التلقائي والاستعادة، فحوصات الصحة المجدولة والتوسع الفوري تساعد في جعل موقعك يعمل بشكل أفضل. لا تتردد في التحقق منها.

PlusClouds Cloud

Deploy your first server today

##fast website##faster site#migration from laravel to nextjs#laravel to nextjs#leaving laravel

الأسئلة الشائعة

Why did you migrate from Laravel to Next.js?

Migrating to Next.js gave us server-side rendering, static generation, incremental revalidation, and a cohesive component model in one framework. The move addressed velocity, since frontend changes no longer required backend deployments and could be touched by designers and marketers with engineering support.

What did your first Lighthouse audit on the new Next.js site reveal?

The initial audit didn’t automatically improve performance and some categories scored worse. We found that external domains lacked preconnect hints, causing slowdowns, and adding preconnect lines helped the browser establish connections earlier.

How did you reduce JavaScript bundle size with better script management?

We audited third-party and internal scripts, removing what wasn’t needed and deferring what could wait. We also converted non-interactive client components back to server components and prevented unnecessary imports from loading in the head.

How did you optimize images with Next.js image optimization?

We built a custom image loader that routes traffic through our CDN’s imgproxy, resizing images to exact dimensions and delivering the proper format. Converting large images to WebP reduced file sizes by 60 to 80 percent, and using the priority prop to preload the hero image improved LCP.

How do you decide between static generation, ISR, and dynamic rendering in Next.js?

For pages that don’t change often, we prerender with generateStaticParams and ISR, serving static HTML from the CDN edge in under 100ms. Pages that need fresh data use short revalidation windows or dynamic rendering with component-level caching.

What SEO enhancements did you implement with structured data, hreflang, and OpenGraph?

We added FAQPage JSON-LD to product and feature pages, plus SoftwareApplication and BreadcrumbList schemas, and centralized Organization schema in the root layout. We also built a shared buildAlternates function for correct hreflang tags and centralized OpenGraph metadata using Next.js metadata APIs.

What measurable results did you achieve after the migration?

Post-migration, Lighthouse scores on mobile consistently exceed 90, CLS stays under 0.05, and LCP is under 2.5 seconds on most pages. TTFB for statically served content is under 100ms, with ongoing improvements and a mindset of maintaining fast defaults.