JavaScript SDK - تهيئة SDK
التثبيت
Section titled التثبيتسيقوم السطر التالي بتثبيت المتتبع ومعه الـ SDK لتتمكن من الاستفادة من جميع ميزات المتتبع.
npm i @openreplay/tracker
التهيئة
Section titled التهيئةعند إنشاء مثيل لمتتبع OpenReplay، هناك عدة خيارات تكوين يمكنك تقديمها لتخصيص العديد من جوانب التسجيل وتجربة التسجيل.
يجب عليك تعيين خيار projectKey في المُنشئ. يمكنك الحصول على هذه القيمة من لوحة تحكم OpenReplay الخاصة بك تحت ‘Preferences > Projects’.
تطبيقات الصفحة الواحدة (SPA)
Section titled تطبيقات الصفحة الواحدة (SPA)إذا كان موقعك الإلكتروني هو تطبيق صفحة واحدة (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)
بدلاً من ذلك، يمكنك إنشاء مثيل جديد للفئة (class):
import OpenReplay from '@openreplay/tracker';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY
});
tracker.start(); // returns a promise with session info (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,
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تجزئة (hash) الجلسة الأولية. هذا مفيد عندما تنتقل الجلسات عبر نطاقات فرعية مختلفة في تطبيق الويب الخاص بك ولكنك تريد دمجها في تسجيل واحد. في حالة عدم إمكانية متابعة الجلسة (غير موجودة أو منتهية)، سيبدأ المتتبع تلقائيًا جلسة جديدة. كما يتم إرجاعه عند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: مفيد للحالات التي يكون فيها عدد التغييرات محدودًا و/أو عندما تتم ترطيب (hydrated) أوراق الأنماط على العميل بعد العرض الأولي. يُطبَّق على كل ورقة أنماط على حدة. يجب أن تكون القيمة = 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.
Feature Flags
Section titled Feature FlagsonFlagsLoadرد اتصال يُستخدم لأداء إجراء بمجرد تحميل أعلام الميزات (في كل مرة).
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.