رد ملف تعريف أداء التطبيق

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

سنستخدم تطبيق React Movies Queue كمنصة للتجارب.


تفاعل مع تطبيق قائمة انتظار الأفلام

تفاعل API المحلل


تم تصميم React Profiler API لقياس أداء العرض ويساعد على تحديد اختناقات أداء التطبيق.

import React, { Fragment, unstable_Profiler as Profiler} from "react";

Profilerيقبل المكون رد الاتصال onRenderكخاصية. يتم استدعاؤه في كل مرة يقوم فيها عنصر في شجرة ملف التعريف بتحديث.

const Movies = ({ movies, addToQueue }) => (
  <Fragment>
    <Profiler id="Movies" onRender={callback}>

دعنا ، لأغراض الاختبار ، نحاول قياس الوقت المطلوب لتقديم أجزاء من المكون Movies. هنا هو كيف يبدو.


يقبل تطبيق React Movies Queue وأبحاث الأفلام باستخدام

أدوات رد الاتصال لمطور ReactonRender المعلمات التي تصف ما يتم تقديمه والوقت الذي يستغرقه العرض. يشمل ذلك ما يلي:

  • id: خاصية idمن شجرة المكونات Profilerالتي تم إجراء التغيير من أجلها.
  • phase: أو mount(إذا تم تركيب الشجرة) ، أو update(إذا تم إعادة عرض الشجرة).
  • actualDuration: الوقت المستغرق لتقديم تحديث ثابت.
  • baseDuration: الوقت المقدر لتقديم الشجرة الفرعية بأكملها دون التخزين المؤقت.
  • startTime: الوقت الذي بدأ فيه رد الفعل في تقديم هذا التحديث.
  • commitTime: الوقت الذي ارتكبت فيه شركة React هذا التحديث.
  • interactions: العديد من "التفاعلات" لهذا التحديث.

const callback = (id, phase, actualTime, baseTime, startTime, commitTime) => {
    console.log(`${id}'s ${phase} phase:`);
    console.log(`Actual time: ${actualTime}`);
    console.log(`Base time: ${baseTime}`);
    console.log(`Start time: ${startTime}`);
    console.log(`Commit time: ${commitTime}`);
}

سنقوم بتحميل الصفحة وننتقل إلى وحدة تحكم أدوات مطوري Chrome. هناك يجب أن نرى ما يلي.


نتائج التنميط في أدوات المطورين

يمكننا أيضًا فتح أدوات React Developer ، والانتقال إلى الإشارة المرجعيةProfilerوتصور المعلومات حول وقت عرض المكون. فيما يلي تصور لهذه المرة في شكل رسم بياني لهب.


من خلال العمل على نتائج التنميط في React Developer Tools ،

أود أيضًا استخدام وضع العرض هناRanked، الذي يوفر عرضًا منظمًا للبيانات. ونتيجة لذلك ، تكون المكونات التي تستغرق وقتًا طويلاً في العرض في أعلى القائمة.


عرض نتائج التنميط في الوضع المُصنف.

بالإضافة إلى ذلك ، يمكنك استخدام العديد من المكونات لأخذ القياسات في أجزاء مختلفة من التطبيقProfiler:

import React, { Fragment, unstable_Profiler as Profiler} from "react";

render(
  <App>
    <Profiler id="Header" onRender={callback}>
      <Header {...props} />
    </Profiler>
    <Profiler id="Movies" onRender={callback}>
      <Movies {...props} />
    </Profiler>
  </App>
);

وكيف تحلل تفاعلات المستخدم مع المكونات؟

واجهة برمجة تطبيقات تفاعل التفاعل


سيكون من الجيد أن تكون قادرًا على تتبع تفاعلات المستخدم مع واجهة التطبيق (مثل النقرات على العناصر). سيسمح لك ذلك بالعثور على إجابات لأسئلة مثيرة للاهتمام مثل هذا: "كم من الوقت استغرق تحديث DOM بعد النقر فوق هذا الزر؟". لحسن الحظ ، يتمتع React بدعم تجريبي لتحليل تفاعلات المستخدم مع التطبيق باستخدام Interaction Tracing API من حزمة الجدولة الجديدة . يمكنك قراءة الوثائق الموجودة عليه هنا .

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

يوجد في تطبيقنا زر Add Movie To Queueيتم عرض الرمز عليه +. يعمل على إضافة الأفلام إلى قائمة انتظار المشاهدة.


زر لإضافة فيلم إلى قائمة انتظار العرض فيما

يلي مثال على التعليمات البرمجية التي تراقب تحديثات الحالة لتفاعل المستخدم هذا مع التطبيق:

import { unstable_Profiler as Profiler } from "react";
import { render } from "react-dom";
import { unstable_trace as trace } from "scheduler/tracing";

class MyComponent extends Component {
  addMovieButtonClick = event => {
    trace("Add To Movies Queue click", performance.now(), () => {
      this.setState({ itemAddedToQueue: true });
    });
  };
}

يمكننا تسجيل معلومات حول هذا التفاعل والتعرف على مدته من خلال الاتصال بأدوات مطور React.


تحليل تفاعل المستخدم مع عنصر التطبيق

باستخدام Interaction Tracing API ، يمكنك أيضًا جمع معلومات حول عرض المكون الأول:

import { unstable_trace as trace } from "scheduler/tracing";

trace("initial render", performance.now(), () => {
   ReactDom.render(<App />, document.getElementById("app"));
});



تحليل العرض الأول للمكون

يعطي مؤلف API أمثلة أخرى على استخدامه. على سبيل المثال ، توضيح ملف تعريف المهام غير المتزامنة.

الدمى


لأتمتة اختبار تفاعل المستخدم مع عناصر التطبيق ، قد يبدو استخدام Puppeteer مثيرًا للاهتمام . هذه مكتبة Node.js توفر الوصول إلى واجهة برمجة تطبيقات عالية المستوى مصممة للتحكم في متصفح Chrome بدون واجهة مستخدم باستخدام بروتوكول DevTools.

عند استخدام العرائس، يتم توفير المطور مع مساعد طرق tracing.start() و tracing.stop()تهدف إلى مؤشرات الأداء DevTools جمع. فيما يلي مثال على استخدام هذه الآليات لجمع البيانات حول ما يحدث عند النقر فوق الزر الذي يهمنا.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const navigationPromise = page.waitForNavigation();
  await page.goto('https://react-movies-queue.glitch.me/')
  await page.setViewport({ width: 1276, height: 689 });
  await navigationPromise;

  const addMovieToQueueBtn = 'li:nth-child(3) > .card > .card__info > div > .button';
  await page.waitForSelector(addMovieToQueueBtn);

  //  ...
  await page.tracing.start({ path: 'profile.json' });
  //   
  await page.click(addMovieToQueueBtn);
  //  
  await page.tracing.stop();

  await browser.close();
})()

الآن ، بعد تحميل الملف profile.jsonفي Performanceشريط أدوات المطور ، يمكننا أن نرى ما هي المكالمات الوظيفية التي تم تشغيلها بنقرة زر.


تحليل نتائج النقر على الزر

إذا كنت مهتمًا بموضوع تحليل أداء المكون - ألق نظرة على هذه المادة.

واجهة برمجة تطبيقات توقيت المستخدم


تتيح واجهة برمجة تطبيقات توقيت المستخدم للمطور إنشاء مقاييس أداء مخصصة باستخدام طوابع زمنية دقيقة للغاية. window.performance.mark()تنشئ الطريقة طابعًا زمنيًا يتم تعيين الاسم له. window.performance.measure()تتيح لك الطريقة معرفة الوقت المنقضي بين قياسين.

//     
performance.mark('Movies:updateStart');
//  

//     
performance.mark('Movies:updateEnd');

//        
performance.measure('moviesRender', 'Movies:updateStart', 'Movies:updateEnd');

عند إنشاء ملف تعريف لتطبيق React باستخدام علامة التبويب Performanceأدوات مطوري Chrome ، يمكنك العثور على قسم Timingمليء بالمقاييس المؤقتة المتعلقة بمكونات React. رد فعل أثناء العرض ، يمكن نشر هذه المعلومات باستخدام واجهة برمجة تطبيقات توقيت المستخدم.


علامة تبويب الأداء في أدوات مطوري Chrome

لاحظ أنه تتم إزالة واجهات برمجة تطبيقات أوقات المستخدم من تجميعات React DEV ، واستبدالها بواجهة برمجة تطبيقات React Profiler ، والتي توفر طوابع زمنية أكثر دقة. ربما في المستقبل ، سيتم إرجاع الدعم لواجهة برمجة التطبيقات هذه عن طريق القيام بذلك للمتصفحات التي تدعم مواصفات مستوى توقيت المستخدم 3. 

على الإنترنت ، قد تجد مواقع تفاعلية تستخدم واجهة برمجة تطبيقات توقيت المستخدم لتحديد المقاييس الخاصة بها. يتضمن هذا ، على سبيل المثال ،Time to first post title visibleمقياسRedditومقياس SpotifyTime to playback ready.


المقاييس الخاصة المستخدمة في مواقع التفاعل يتم عرض

المقاييس التي تم إنشاؤها بواسطة واجهة برمجة تطبيقات توقيت المستخدم بشكل ملائمفي لوحة المنارة فيأدوات مطوري Chrome.


المقاييس في لوحة منارة

، وأحدث الإصدارات من على سبيل المثال Next.js تشمل مقاييس العرف وآليات لقياس العديد من الفعاليات المختلفة. بما في ذلك الآتي:

  • Next.js-hydration: الوقت اللازم لجلب الترميز المقدم مسبقًا إلى حالة العمل.
  • Next.js-nav-to-render: الوقت من بداية التنقل إلى بداية العرض.

يتم عرض جميع هذه القياسات في المنطقة Timings.


تحليل مقاييس Next.js

أدوات المطور والمنارة


أذكرك أنه Performanceيمكن استخدام Lighthouse وشريط أدوات مطور Chrome لإجراء تحليل عميق لعملية التحميل وأداء تطبيقات التفاعل. هنا يمكنك العثور على المقاييس التي تؤثر بشكل خاص على إدراك المستخدمين للصفحات.


تحليل أداء الصفحة

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


تعديل TBT

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




بالإضافة إلى ذلك ، فإن تحليل تطبيق Lighthouse يعطي مطوري React الكثير من النصائح المحددة حول الكثير من المشكلات. فيما يلي نتيجة التحليل في Lighthouse 6.0 . هنا ، يتم فتح قسم إزالة جافا سكريبت غير المستخدم ، والذي يبلغ عن كود جافا سكريبت غير المستخدم الذي تم تحميله في التطبيق ، والذي يمكن استيراده باستخدامReact.lazy().


يعد تحليل تطبيق في Lighthouse

Applications مفيدًا دائمًا للاختبار على الأجهزة ، وهو على الأرجح متاح للمستخدمين النهائيين. أنا غالبا ما تعتمد على Webpagetest و رم و جوهر البياناتفي مثل هذه الأمور، والتي تسمح لي للحصول على مزيد من المعلومات الكاملة حول أداء التطبيق.

القراء الأعزاء! كيف تبحث في أداء تطبيقات React الخاصة بك؟


All Articles