JavaScript SDK - تهيئة SDK
التثبيت
Section titled التثبيتسيقوم السطر التالي بتثبيت المتتبع ومعه الـ SDK لتتمكن من الاستفادة من جميع ميزات المتتبع.
npm i @openreplay/tracker
التهيئة
Section titled التهيئةعند إنشاء مثيل لمتتبع OpenReplay، هناك عدة خيارات تكوين يمكنك تقديمها لتخصيص العديد من جوانب التسجيل وتجربة التسجيل.
يجب عليك تعيين خيار projectKey في المُنشئ. يمكنك الحصول على هذه القيمة من لوحة تحكم OpenReplay الخاصة بك تحت ‘Preferences > Projects’.
Single Page Applications (SPA)
Section titled Single Page Applications (SPA)إذا كان موقعك الإلكتروني هو Single Page Application (SPA) فيمكنك استخدام المتتبع كـ singleton:
import { tracker } from '@openreplay/tracker'
tracker.configure({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // when dealing with the self-hosted version of OpenReplay
})
tracker.start() // returns a promise with session info (sessionID, sessionHash, userUUID)
بدلاً من ذلك، يمكنك إنشاء مثيل فئة جديد:
import OpenReplay from '@openreplay/tracker';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY
});
tracker.start(); // returns a promise with session info (sessionID, sessionHash, userUUID)
Server-side Rendered (SSR)
Section titled Server-side Rendered (SSR)خلاف ذلك، إذا كان تطبيق الويب الخاص بك Server-Side-Rendered (SSR) (مثل NextJS، NuxtJS) استخدم المقتطف أدناه.
تأكد من أن tracker.start() يتم استدعاؤه بمجرد بدء التطبيق (في useEffect أو componentDidMount).
import OpenReplay from '@openreplay/tracker/cjs';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // when dealing with the self-hosted version of OpenReplay
});
//...
function MyApp() {
useEffect(() => { // use componentDidMount in case of React Class Component
tracker.start(); // returns a promise with session info (sessionID, sessionHash, userUUID)
}, [])
}
import OpenReplay from '@openreplay/tracker/cjs';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // when dealing with the self-hosted version of OpenReplay
capturePerformance: true,
__DISABLE_SECURE_MODE: true // for local testing
});
خيارات التهيئة
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.__debug__: numberلتمكين سجلات التصحيح. الافتراضي:0(معطل).2: الأخطاء.3: الأخطاء والتحذيرات.4: الأخطاء والتحذيرات والسجلات.5: مفصل.
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.
أوراق الأنماط
Section titled أوراق الأنماطinlineCss: number: يجبر المتتبع على تسجيل وإرسال أوراق الأنماط البعيدة كرسائل عادية بدلاً من تخزينها مؤقتًا في الخلفية. هذا مفيد عندما تكون ملفات CSS خاصة، وبالتالي لا يمكن تخزينها مؤقتًا بواسطة خلفية OpenReplay. يمكن أن تكون القيم:0: يتم تخزين ملف CSS مؤقتًا بواسطة الخلفية. السلوك الافتراضي.1: سيحاول تسجيل ملف css المرتبط ككائن AdoptedStyleSheet.2: جلب الملف، ثم محاكاة سلوك AdoptedStyleSheets لإعادة التشغيل.3: جلب الملف، ثم حفظه كـ css عادي داخل عقدة<style>— استخدم هذا الخيار إذا كان لديك الكثير من الخصائص المختصرة في ملفات CSS الخاصة بك (يغطي خطأ مواصفات CSSOM).
css: CssRulesOptions: يوفر دعمًا أفضل للتطبيقات المبنية باستخدام مكتبة emotion-js (مثل مكونات MUI). يأتي مع المعلمات التالية:scanInMemoryCSS: boolean: قم بتشغيل هذا إذا كانت لديك مشاكل مع الأنماط التي أنشأها emotionjs. الافتراضي:false.checkCssInterval: number: عدد مرات فحص أوراق الأنماط المتتبعة التي تحتوي على قواعد فارغة. الافتراضي:200(مللي ثانية).checkLimit: number: مفيد للحالات ذات العدد المحدود من التغييرات و/أو عندما يتم ترطيب أوراق الأنماط على العميل بعد العرض الأولي. يُطبق على كل ورقة أنماط بشكل فردي. يجب أن تكون القيمة = X/checkCssInterval حيث X هي مدة المراقبة بالملي ثانية. الافتراضي:0(معطل).
الخصوصية
Section titled الخصوصيةrespectDoNotTrack?: booleanلا تبدأ المتتبع إذا تم تمكين علامة do-not-track في متصفح المستخدم. الافتراضي:false.obscureTextEmails?: booleanيخفي عناوين البريد الإلكتروني في عناصر النص. سيتم تحويل عناوين البريد الإلكتروني إلى سلسلة عشوائية من النجوم. الافتراضي:true.obscureTextNumbers?: booleanيخفي الأرقام في عناصر النص. سيتم تحويل الأرقام إلى سلسلة عشوائية من النجوم. الافتراضي:false.obscureInputEmails?: booleanيخفي عناوين البريد الإلكتروني في حقول الإدخال. سيتم تحويل قيم البريد الإلكتروني إلى سلسلة عشوائية من النجوم. الافتراضي:true.obscureInputNumbers?: booleanيخفي الأرقام في حقول الإدخال. سيتم تحويل القيم الرقمية إلى سلسلة عشوائية من النجوم. إذا تم تعطيله، تأكد من تنظيف حقول الإدخال التي قد تحتوي على بيانات حساسة مثل الرموز البريدية أو تفاصيل بطاقة الائتمان. الافتراضي:true.obscureInputDates?: booleanيخفي التواريخ في حقول الإدخال. سيتم تحويل قيم التواريخ إلى سلسلة عشوائية من النجوم. الافتراضي:false.defaultInputMode?: 0 | 1 | 2وضع الالتقاط الافتراضي لقيم الإدخال. على التوالي: عادي، مخفي، أو متجاهَل. الافتراضي:2(متجاهَل).urls: يتيح لك تخصيص كيفية تسجيل أحداث موقع الصفحة عبر الخيارات التالية:urlSanitizer?: (url: string) => stringيتيح لك تنظيف عنوان url للصفحة (لإزالة رموز الاستخدام على سبيل المثال).titleSanitizer?: (title: string) => stringيتيح لك تنظيف عنوان الصفحة.
resourceNameSanitizer?: (url: string) => stringيتيح لك تنظيف عناوين URL لموارد الشبكة المسجلة.
لاحظ أن البيانات المستبعدة يتم إخفاؤها أو قمعها قبل إرسال البيانات إلى خوادم OpenReplay. لا يمكن أن تكون التغييرات المطبقة على الخيارات المذكورة أعلاه بأثر رجعي وستنطبق فقط على البيانات التي تم جمعها حديثًا. انظر Sanitize Data لمزيد من التفاصيل.
وحدة التحكم
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.longTasks?: booleanلالتقاط أحداث long-animation-frame. الافتراضي:false.
الشبكة
Section titled الشبكةيتعلق خيار network بالتقاط طلبات الشبكة والحمولات لـ fetch و XHR.
network?: {
failuresOnly: boolean;
sessionTokenHeader: string;
ignoreHeaders: Array<string> | boolean;
capturePayload: boolean; // make sure you sanitize your data before enabling it
sanitizer: (RequestResponseData) => RequestResponseData | null;
captureInIframes: boolean;
axiosInstances: AxiosInstance[];
useProxy?: boolean;
tokenUrlMatcher?: (url: string) => boolean;
}
راجع Network Options للحصول على أمثلة ومزيد من التفاصيل حول كيفية تنقيح البيانات الحساسة.
Canvas
Section titled Canvasيتعلق خيار canvas بالتقاط عناصر canvas/WebGL:
canvas?: {
disableCanvas?: boolean
fixedCanvasScaling?: boolean
useAnimationFrame?: boolean
fileExt?: 'webp' | 'png' | 'jpeg' | 'avif'
}
راجع Canvas and WebGL لمعرفة كيفية تمكين هذه القدرة ومزيد من التفاصيل حول الخيارات المتاحة.
إطارات iFrame عبر النطاقات
Section titled إطارات iFrame عبر النطاقاتيتعلق خيار crossdomain بالتقاط إطارات iFrame من نطاقات مختلفة. يتم استخدامه جنبًا إلى جنب مع خيار captureIFrames الذي يجب تعيينه على true.
crossdomain?: {
/**
* Enable cross-domain tracking
* @default false
* */
enabled?: boolean
/**
* Used to specify the parent domain, will be '*' by default
* (Check your CSP settings)
* @default '*'
* */
parentDomain?: string
}
اعتبارًا من إصدار المتتبع 14.0.10، لم تعد سمة data-domain مطلوبة على عناصر HTML عند العمل مع إطارات iFrame عبر النطاقات.
راجع Cross-domain iFrame Tracking للحصول على مزيد من التفاصيل حول كيفية التقاط 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 الأمان__DISABLE_SECURE_MODE?: booleanللسماح باتصال غير آمن بين المتتبع والخلفية على المواقع بدون SSL. يجب استخدام هذا لأغراض التطوير فقط. الافتراضي:false.