JavaScript SDK - تهيئة SDK
التثبيت
Section titled التثبيتسيقوم السطر التالي بتثبيت المتتبع ومعه الـ SDK لتتمكن من الاستفادة من جميع ميزات المتتبع.
npm i @openreplay/tracker
التهيئة
Section titled التهيئةعند إنشاء مثيل لمتتبع OpenReplay، هناك عدة خيارات تكوين يمكنك تقديمها لتخصيص العديد من جوانب التسجيل وتجربة التسجيل.
يجب عليك تعيين خيار projectKey في المُنشئ. يمكنك الحصول على هذه القيمة من لوحة تحكم OpenReplay الخاصة بك تحت ‘التفضيلات > المشاريع’.
تطبيقات الصفحة الواحدة (SPA)
Section titled تطبيقات الصفحة الواحدة (SPA)إذا كان موقعك الإلكتروني هو تطبيق صفحة واحدة (SPA) استخدم الكود أدناه:
import { tracker } from '@openreplay/tracker'
tracker.configure({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // عند استخدام النسخة المستضافة ذاتيًا
})
tracker.start(); // يُرجع وعدًا بمعلومات الجلسة (sessionID، sessionHash، userUUID)
العرض من جانب الخادم (SSR)
Section titled العرض من جانب الخادم (SSR)إذا كان تطبيق الويب الخاص بك معروضًا من جانب الخادم (SSR) (مثل NextJS، NuxtJS) استخدم الكود أدناه. تأكد من أن tracker.start() يتم استدعاؤه بمجرد بدء التطبيق (في useEffect أو componentDidMount).
import OpenReplay from '@openreplay/tracker/cjs';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY,
});
//...
function MyApp() {
useEffect(() => { // استخدم componentDidMount في حالة مكون React من النوع Class
tracker.start(); // يُرجع وعدًا بمعلومات الجلسة (sessionID، sessionHash، userUUID)
}, [])
}
import OpenReplay from '@openreplay/tracker/cjs';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // عند التعامل مع النسخة المستضافة ذاتيًا من OpenReplay
capturePerformance: true,
__DISABLE_SECURE_MODE: true // للاختبار المحلي
});
خيارات التهيئة
Section titled خيارات التهيئةهناك مجموعة من الخيارات التي يمكنك تمريرها إلى المُنشئ. فقط projectKey مطلوب.
الأغراض العامة
Section titled الأغراض العامةprojectKey: stringمعرف المشروع الذي تقوم بتتبعه.sessionHash?: stringتجزئة الجلسة الأولية. هذا مفيد عندما تنتقل الجلسات عبر نطاقات فرعية مختلفة في تطبيق الويب الخاص بك ولكنك تريد دمجها في تسجيل واحد. في حالة عدم إمكانية متابعة الجلسة (غير موجودة أو منتهية)، سيبدأ المتتبع تلقائيًا جلسة جديدة. يتم إرجاعه أيضًا عندstop(). مزيد من التفاصيل حول هذا هنا.ingestPoint?: stringنطاق OpenReplay الخاص بك (مثل https://openreplay.mydomain.com/ingest)، والذي سيرسل المتتبع إليه الأحداث. هذا اختياري لمستخدمي OpenReplay Cloud. الافتراضي:https://api.openreplay.com/ingest(يشير إلى OpenReplay Cloud).revID?: stringمعرف الإصدار لتطبيق الويب الخاص بك. مفيد عند البحث عن مشكلات تحدث في إصدار محدد.resourceBaseHref?: stringيشير إلى النطاق العام حيث يمكن لـ OpenReplay جلب الأصول (الأنماط، الخطوط، والرموز). نظرًا لأنها مطلوبة لإعادة تشغيل الجلسة بشكل صحيح، فإن هذا الخيار مفيد لتجاوز قيد استضافة موقعك (وبالتالي الأصول) في نطاق خاص. مثال:https://mypublicsite.com/assets/.captureIFrames?: booleanلالتقاط جميع إطارات iframe من نفس النطاق في تطبيق الويب الخاص بك. إذا كنت ترغب في تتبع إطار iframe محدد، ببساطة أضف سمة HTMLdata-openreplay-captureإلى علامة<iframe>. الافتراضي:true.disableClickmaps?: booleanلتعطيل حساب محددات CSS (المستخدمة في خرائط النقر). الافتراضي:false.autoResetOnWindowOpen?: booleanقم بتمكين هذا الخيار لإعادة تعيين sessionID عند فتح علامة تبويب جديدة من تطبيقك. هذا يستبدل طريقةwindow.openلتجنب sessionIDs المكررة بسبب تخزين الجلسة المشتركة بين علامات تبويب المتصفح. الافتراضي:false.forceSingleTab: booleanيعطل إمكانية التسجيل في علامات تبويب متعددة والتي تدمج جلسات المستخدم، التي تتم عبر علامات تبويب متعددة، في إعادة تشغيل واحدة. بدلاً من ذلك، عند تمكين هذا الخيار، سيتم تسجيل الجلسات التي تم التقاطها في علامات تبويب المتصفح المختلفة في تسجيلات منفصلة. الافتراضي:false.disableStringDict: booleanيعطل منطق قاموس السلاسل (لتحسين التخزين) في التسجيلات. الافتراضي:false.fixedCanvasScaling: booleanيجبر صور canvas على أن تُرسم بكثافة بكسل 1 بدلاً من devicePixelRatio. (يقلل من الجودة المحتملة للصورة لجعل النتيجة النهائية أصغر في الحجم). الافتراضي:false.disableCanvas?: booleanيعطل تسجيل عناصر canvas. الافتراضي:false.assistSocketHost?: stringيمكن استخدامه لتعيين مضيف محدد لاتصال مكون Assist الإضافي. الافتراضي هو قيمةingestPoint.nodes?: { maintainer: MaintainerOptions }خيارnodes.maintainerالجديد يساعد في إدارة الذاكرة وتنظيف عقد DOM التي لم تعد قيد الاستخدام. لديه المعلمات التالية:interval: number: الفاصل الزمني (بالملي ثانية) بين عمليات التنظيف. الافتراضي: 30 * 1000 (30 ثانية).batchSize: number: عدد العقد للتحقق منها خلال كل عملية تنظيف. الافتراضي: 2500.enabled: boolean: تمكين أو تعطيل مدير العقد. الافتراضي: true.
import { tracker } from '@openreplay/tracker'
tracker.configure({
projectKey: PROJECT_KEY
ingestPoint: "https://openreplay.mydomain.com/ingest", // عند استخدام النسخة المستضافة ذاتيًا
nodes: {
maintainer: {
interval: 60 * 1000, // تنفيذ التنظيف كل دقيقة
batchSize: 2500, // التحقق من العقد في مجموعات من 2500
enabled: true, // تمكين مدير العقد
}
}
})
الخصوصية
Section titled الخصوصيةrespectDoNotTrack?: booleanلا تبدأ المتتبع إذا تم تمكين علامة عدم التتبع في متصفح المستخدم. الافتراضي:false.obscureTextEmails?: booleanيخفي عناوين البريد الإلكتروني في عناصر النص. سيتم تحويل عناوين البريد الإلكتروني إلى سلسلة عشوائية من النجوم. الافتراضي:true.obscureTextNumbers?: booleanيخفي الأرقام في عناصر النص. سيتم تحويل الأرقام إلى سلسلة عشوائية من النجوم. الافتراضي:false.obscureInputEmails?: booleanيخفي عناوين البريد الإلكتروني في حقول الإدخال. سيتم تحويل قيم البريد الإلكتروني إلى سلسلة عشوائية من النجوم. الافتراضي:true.obscureInputNumbers?: booleanيخفي الأرقام في حقول الإدخال. سيتم تحويل القيم الرقمية إلى سلسلة عشوائية من النجوم. الافتراضي:false.obscureInputDates?: booleanيخفي التواريخ في حقول الإدخال. سيتم تحويل قيم التواريخ إلى سلسلة عشوائية من النجوم. الافتراضي: false.defaultInputMode?: 0 | 1 | 2وضع الالتقاط الافتراضي لقيم الإدخال. على التوالي: عادي، مخفي، أو متجاهل. الافتراضي:1(مخفي).
لاحظ أن البيانات المستبعدة يتم إخفاؤها أو قمعها قبل إرسال البيانات إلى خوادم OpenReplay. لا يمكن أن تكون التغييرات المطبقة على الخيارات المذكورة أعلاه بأثر رجعي وستنطبق فقط على البيانات التي تم جمعها حديثًا. انظر تنظيف البيانات لمزيد من التفاصيل.
وحدة التحكم
Section titled وحدة التحكمconsoleMethods?: Array<'log' | 'info' | 'warn' | 'error' 'debug' | 'assert'> | nullيحدد قائمة طرق وحدة التحكم التي سيتم التقاطها. الافتراضي:['log', 'info', 'warn', 'error', 'debug', 'assert']consoleThrottling?: numberالحد الأقصى لعدد إدخالات وحدة التحكم التي يتم التقاطها في الثانية. الافتراضي:30.
الاستثناءات
Section titled الاستثناءاتcaptureExceptions?: booleanيلتقط استثناءات JavaScript وتتبع المكدس. الافتراضي:true.
التوقيتات
Section titled التوقيتاتcaptureResourceTimings?: booleanيسجل توقيتات الموارد. الافتراضي:true.capturePageLoadTimings?: booleanيسجل توقيتات تحميل الصفحة. الافتراضي:true.capturePageRenderTimings?: booleanيحسب مقاييس عرض الصفحة مثل Speed Index، Visually Complete أو Time To Interactive. يتطلبcaptureResourceTimings = true. الافتراضي:true.
الأداء
Section titled الأداءcapturePerformance?: booleanلالتقاط مقاييس الأداء مثل معدل الإطارات، واستهلاك وحدة المعالجة المركزية والذاكرة. الافتراضي:true.
الشبكة
Section titled الشبكةيتعلق خيار network بالتقاط طلبات الشبكة والحمولات لـ fetch و XHR.
network?: {
failuresOnly: boolean;
sessionTokenHeader: string;
ignoreHeaders: Array<string> | boolean;
capturePayload: boolean; // تأكد من تنظيف بياناتك قبل تمكين هذا
sanitizer: (RequestResponseData) => RequestResponseData | null;
captureInIframes: boolean;
axiosInstances: AxiosInstance[];
useProxy?: boolean;
tokenUrlMatcher?: (url: string) => boolean;
}
راجع خيارات الشبكة للحصول على أمثلة ومزيد من التفاصيل حول كيفية تنقيح البيانات الحساسة.
Canvas
Section titled Canvasيتعلق خيار canvas بالتقاط عناصر canvas/WebGL:
canvas?: {
disableCanvas?: boolean
fixedCanvasScaling?: boolean
useAnimationFrame?: boolean
fileExt?: 'webp' | 'png' | 'jpeg' | 'avif'
}
راجع Canvas و WebGL لمعرفة كيفية تمكين هذه القدرة ومزيد من التفاصيل حول الخيارات المتاحة.
إطارات iframe عبر النطاقات
Section titled إطارات iframe عبر النطاقاتيتعلق خيار crossdomain بالتقاط إطارات iframe من نطاقات مختلفة. يتم استخدامه جنبًا إلى جنب مع خيار captureIFrames الذي يجب تعيينه على true.
crossdomain?: {
/**
* تمكين التتبع عبر النطاقات
* @default false
* */
enabled?: boolean
/**
* يستخدم لتحديد النطاق الأب، سيكون '*' افتراضيًا
* (تحقق من إعدادات CSP الخاصة بك)
* @default '*'
* */
parentDomain?: string
}
اعتبارًا من إصدار المتتبع 14.0.10، لم يعد مطلوبًا وجود سمة data-domain على عناصر HTML عند العمل مع إطارات iframe عبر النطاقات.
راجع تتبع iframe عبر النطاقات للحصول على مزيد من التفاصيل حول كيفية التقاط iframe من نطاق مختلف.
مؤشر الماوس
Section titled مؤشر الماوسيتعلق خيار mouse بالتقاط المحددات للنقرات لبناء خرائط النقر.
mouse?:
{
disableClickmaps?: boolean
minSelectorDepth?: number
nthThreshold?: number
maxOptimiseTries?: number
}
disableClickmaps?: booleanيعطل حساب المحددات تمامًا. الافتراضي:false.minSelectorDepth?: numberالحد الأدنى لطول محدد محسن (الافتراضي 2). مثال:body > div > div > p => body > pnthThreshold?: numberعدد محاولات المحدد قبل الرجوع إلى محددات nth-child. هذه عملية مكلفة وقد تفرض عبئًا كبيرًا، لا تقم بتعيينها أعلى من 2000. الافتراضي:1000.maxOptimiseTries?: numberعدد المحاولات لتحسين وتقصير المحدد. الافتراضي:10 000.
إعادة الاتصالات
Section titled إعادة الاتصالاتconnAttemptCount?: numberالحد الأقصى لعدد المحاولات عند فشل طلبات HTTP الخاصة بالمتتبع في الوصول إلى الخلفية. الافتراضي:10.connAttemptGap?: numberالمدة بين كل محاولة إعادة (معبرًا عنها بالمللي ثانية). الافتراضي:8000.
أعلام الميزات
Section titled أعلام الميزاتonFlagsLoadرد اتصال يستخدم لأداء إجراء بمجرد تحميل أعلام الميزات (في كل مرة).
flags?: {
onFlagsLoad?: (flags: IFeatureFlag[]) => void
}
// ...
interface IFeatureFlag {
key: string
is_persist: boolean
value: string | boolean
payload: string
}
الأمان
Section titled الأمان__DISABLE_SECURE_MODE?: booleanللسماح باتصال غير آمن بين المتتبع والخلفية على المواقع بدون SSL. يجب استخدام هذا لأغراض التطوير فقط. الافتراضي:false.