سنتحدث اليوم عن قياس أداء عرض مكونات 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()
.يعد تحليل تطبيق في LighthouseApplications مفيدًا دائمًا للاختبار على الأجهزة ، وهو على الأرجح متاح للمستخدمين النهائيين. أنا غالبا ما تعتمد على Webpagetest و رم و جوهر البياناتفي مثل هذه الأمور، والتي تسمح لي للحصول على مزيد من المعلومات الكاملة حول أداء التطبيق.القراء الأعزاء! كيف تبحث في أداء تطبيقات React الخاصة بك؟