JavaScript SDK - Inicialización del SDK
Instalación
Section titled InstalaciónLa siguiente línea instalará el tracker y con él el SDK para que puedas aprovechar todas las características del tracker.
npm i @openreplay/tracker
Inicialización
Section titled InicializaciónAl instanciar el tracker de OpenReplay, hay varias opciones de configuración que puedes proporcionar para personalizar muchos aspectos de la grabación y la experiencia de grabación.
Debes establecer la opción projectKey en el constructor. Puedes obtener este valor desde tu panel de control de OpenReplay en ‘Preferencias > Proyectos’.
Aplicaciones de Página Única (SPA)
Section titled Aplicaciones de Página Única (SPA)Si tu sitio web es una Aplicación de Página Única (SPA) utiliza el siguiente código:
import { tracker } from '@openreplay/tracker'
tracker.configure({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // cuando se utiliza la versión autohospedada
})
tracker.start() // devuelve una promesa con información de sesión (sessionID, sessionHash, userUUID)
Renderizado del lado del servidor (SSR)
Section titled Renderizado del lado del servidor (SSR)De lo contrario, si tu aplicación web es Renderizada del Lado del Servidor (SSR) (por ejemplo, NextJS, NuxtJS) utiliza el siguiente fragmento de código. Asegúrate de que tracker.start() se llame una vez que la aplicación haya iniciado (en useEffect o componentDidMount).
import OpenReplay from '@openreplay/tracker/cjs';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY,
});
//...
function MyApp() {
useEffect(() => { // usa componentDidMount en caso de un componente de clase de React
tracker.start(); // devuelve una promesa con información de sesión (sessionID, sessionHash, userUUID)
}, [])
}
Ejemplo
Section titled Ejemploimport OpenReplay from '@openreplay/tracker/cjs';
//...
const tracker = new OpenReplay({
projectKey: PROJECT_KEY,
ingestPoint: "https://openreplay.mydomain.com/ingest", // cuando se utiliza la versión autohospedada de OpenReplay
capturePerformance: true,
__DISABLE_SECURE_MODE: true // para pruebas locales
});
Opciones de Inicialización
Section titled Opciones de InicializaciónHay un conjunto de opciones que puedes pasar al constructor. Solo projectKey es requerido.
Propósito General
Section titled Propósito GeneralprojectKey: stringEl ID del proyecto que estás rastreando.sessionHash?: stringEl hash de la sesión inicial. Esto es útil cuando las sesiones atraviesan diferentes subdominios en tu aplicación web pero quieres unirlas en una sola grabación. En caso de que no sea posible continuar la sesión (no existe o ha finalizado), el tracker iniciará automáticamente una nueva. También se devuelve enstop(). Más detalles sobre esto aquí.ingestPoint?: stringTu dominio de OpenReplay (por ejemplo, https://openreplay.mydomain.com/ingest), al que el tracker enviará eventos. Esto es opcional para los usuarios de OpenReplay Cloud. Valor por defecto:https://api.openreplay.com/ingest(que apunta a OpenReplay Cloud).revID?: stringEl ID de revisión de tu aplicación web. Útil al buscar problemas que ocurren en una versión específica.resourceBaseHref?: stringSe refiere al dominio accesible públicamente donde OpenReplay puede obtener los recursos (estilos, fuentes e íconos). Dado que son necesarios para una correcta reproducción de la sesión, esta opción es útil para sortear la limitación de tener tu sitio (y por lo tanto los recursos) alojado en un dominio privado. Ejemplo:https://misitiopublico.com/assets/.captureIFrames?: booleanPara capturar todos los iFrames del mismo dominio en tu aplicación web. Si deseas rastrear un iFrame específico, simplemente agrega el atributo HTMLdata-openreplay-capturea la etiqueta<iframe>. Valor por defecto:true.disableClickmaps?: booleanPara deshabilitar el cálculo del selector CSS (utilizado en mapas de clics). Valor por defecto:false.__debug__: numberPara habilitar registros de depuración. Valor por defecto:0(deshabilitado).2: Errores.3: Errores y advertencias.4: Errores, advertencias y logs.5: Verboso.
autoResetOnWindowOpen?: booleanHabilita esta opción para restablecer el sessionID al abrir una nueva pestaña desde tu aplicación. Esto sobrescribe el métodowindow.openpara evitar sessionIDs duplicados debido al almacenamiento de sesión compartido entre pestañas del navegador. Valor por defecto:false.forceSingleTab: booleanDeshabilita la capacidad de grabación en múltiples pestañas que une sesiones de usuario, realizadas en múltiples pestañas, en una sola reproducción. En cambio, al habilitar esta opción, las sesiones capturadas en diferentes pestañas del navegador se grabarán en grabaciones separadas. Valor por defecto:false.disableStringDict: booleanDeshabilita la lógica del diccionario de cadenas (para optimizar el almacenamiento) en las grabaciones. Valor por defecto:false.fixedCanvasScaling: booleanFuerza a que las imágenes de canvas se rendericen con una densidad de píxeles de 1 en lugar de devicePixelRatio. (reduce la calidad potencial de una imagen para hacer que el resultado final sea más pequeño en tamaño). Valor por defecto:false.disableCanvas?: booleanDeshabilita la grabación de elementos canvas. Valor por defecto:false.assistSocketHost?: stringSe puede utilizar para establecer un host específico para la conexión del plugin de asistencia. Por defecto es el valor deingestPoint.nodes?: { maintainer: MaintainerOptions }La nueva opciónnodes.maintainerayuda a gestionar la memoria y limpiar nodos DOM que ya no se usan. Tiene los siguientes parámetros:interval: number: Intervalo de tiempo (en milisegundos) entre ejecuciones de limpieza. Valor por defecto: 30 * 1000 (30 segundos).batchSize: number: Número de nodos a verificar durante cada ejecución de limpieza. Valor por defecto: 2500.enabled: boolean: Habilita o deshabilita el mantenedor de nodos. Valor por defecto: true.
Ejemplo
Section titled Ejemplo
import { tracker } from '@openreplay/tracker';
tracker.configure({
projectKey: 'your_project_key',
ingestPoint: "https://openreplay.mydomain.com/ingest", // cuando se utiliza la versión autohospedada
nodes: {
maintainer: {
interval: 60 * 1000, // Ejecutar limpieza cada minuto
batchSize: 2500, // Verificar nodos en lotes de 2500
enabled: true, // Habilitar el mantenedor de nodos
}
}
});
Privacidad
Section titled PrivacidadrespectDoNotTrack?: booleanNo iniciar el tracker si la bandera do-not-track está habilitada en el navegador del usuario. Valor por defecto:false.obscureTextEmails?: booleanOculta correos electrónicos en elementos de texto. Los correos electrónicos se convertirán en una cadena aleatoria de asteriscos. Valor por defecto:true.obscureTextNumbers?: booleanOculta números en elementos de texto. Los números se convertirán en una cadena aleatoria de asteriscos. Valor por defecto:false.obscureInputEmails?: booleanOculta correos electrónicos en campos de entrada. Los valores de correo electrónico se convertirán en una cadena aleatoria de asteriscos. Valor por defecto:true.obscureInputNumbers?: booleanOculta números en campos de entrada. Los valores numéricos se convertirán en una cadena aleatoria de asteriscos. Valor por defecto:false.obscureInputDates?: booleanOculta fechas en campos de entrada. Los valores de fecha se convertirán en una cadena aleatoria de asteriscos. Valor por defecto:false.defaultInputMode?: 0 | 1 | 2Modo de captura predeterminado para valores de entrada. Respectivamente: plano, oculto o ignorado. Valor por defecto:1(oculto).
Ten en cuenta que los datos excluidos se ocultan o suprimen antes de enviar los datos a los servidores de OpenReplay. Los cambios aplicados a las opciones anteriores no pueden ser retroactivos y solo se aplicarán a los datos recién recopilados. Consulta Sanitizar Datos para más detalles.
Hojas de Estilo
Section titled Hojas de EstiloinlineCss: number: Obliga al tracker a registrar y enviar las hojas de estilo remotas como mensajes normales en vez de cachearlas en el backend.0: Comportamiento por defecto (se cachea).1: Intenta registrar el archivo como objetoAdoptedStyleSheet.2: Obtiene el archivo y simula el comportamiento deAdoptedStyleSheets.3: Obtiene el archivo y lo guarda como CSS plano dentro de<style>— útil con muchas propiedades abreviadas.
css: CssRulesOptions: Soporte extra para apps con emotion-js (p. ej. MUI).scanInMemoryCSS: boolean: Actívalo si tienes problemas con estilos de emotion-js. Por defectofalse.checkCssInterval: number: Intervalo (ms) para escanear hojas de estilo con reglas vacías. Por defecto200.checkLimit: number: Límite de escaneos por hoja. Por defecto0(deshabilitado).
Consola
Section titled ConsolaconsoleMethods?: Array<'log' | 'info' | 'warn' | 'error' 'debug' | 'assert'> | nullEspecifica la lista de métodos de consola a capturar. Valor por defecto:['log', 'info', 'warn', 'error', 'debug', 'assert']consoleThrottling?: numberNúmero máximo de entradas de consola capturadas por segundo. Valor por defecto:30.
Excepciones
Section titled ExcepcionescaptureExceptions?: booleanCaptura excepciones de JavaScript y trazas de pila. Valor por defecto:true.
Tiempos
Section titled TiemposcaptureResourceTimings?: booleanRegistra los tiempos de recursos. Valor por defecto:true.capturePageLoadTimings?: booleanRegistra los tiempos de carga de la página. Valor por defecto:true.capturePageRenderTimings?: booleanCalcula métricas de renderizado de página como Índice de Velocidad, Visualmente Completo o Tiempo para Interactivo. RequierecaptureResourceTimings = true. Valor por defecto:true.
Rendimiento
Section titled RendimientocapturePerformance?: booleanPara capturar métricas de rendimiento como tasa de fotogramas, consumo de CPU y memoria. Valor por defecto:true.longTasks?: booleanPara capturar eventos de long-task. Valor por defecto:false.
La opción network se relaciona con capturar solicitudes de red y cargas útiles para fetch y XHR.
network?: {
failuresOnly: boolean;
sessionTokenHeader: string;
ignoreHeaders: Array<string> | boolean;
capturePayload: boolean; // asegúrate de sanitizar tus datos antes de habilitar esto
sanitizer: (RequestResponseData) => RequestResponseData | null;
captureInIframes: boolean;
axiosInstances: AxiosInstance[];
useProxy?: boolean;
tokenUrlMatcher?: (url: string) => boolean;
}
Consulta Opciones de Red para ejemplos y más detalles sobre cómo redactar datos sensibles.
Canvas
Section titled CanvasLa opción canvas se relaciona con capturar elementos canvas/WebGL:
canvas?: {
disableCanvas?: boolean
fixedCanvasScaling?: boolean
useAnimationFrame?: boolean
fileExt?: 'webp' | 'png' | 'jpeg' | 'avif'
}
Consulta Canvas y WebGL para saber cómo habilitar esta capacidad y más detalles sobre las opciones disponibles.
iFrames de Dominio Cruzado
Section titled iFrames de Dominio CruzadoLa opción crossdomain se relaciona con capturar iFrames de diferentes dominios. Se utiliza junto con la opción captureIFrames que debe establecerse en true.
crossdomain?: {
/**
* Habilitar seguimiento de dominio cruzado
* @default false
* */
enabled?: boolean
/**
* Se utiliza para especificar el dominio padre, será '*' por defecto
* (Verifica tus configuraciones CSP)
* @default '*'
* */
parentDomain?: string
}
A partir de la versión del Tracker 14.0.10, el atributo data-domain ya no es requerido en elementos HTML al trabajar con iFrames de dominio cruzado.
Consulta Seguimiento de iFrames de Dominio Cruzado para más detalles sobre cómo capturar un iFrame de un dominio diferente.
Puntero del Ratón
Section titled Puntero del RatónLa opción mouse se relaciona con capturar selectores para clics para construir mapas de clics.
mouse?:
{
disableClickmaps?: boolean
minSelectorDepth?: number
nthThreshold?: number
maxOptimiseTries?: number
}
disableClickmaps?: booleanDeshabilita completamente el cálculo del selector. Valor por defecto:false.minSelectorDepth?: numberLongitud mínima de un selector optimizado (por defecto 2). Ejemplo:body > div > div > p => body > pnthThreshold?: numberNúmero de intentos de selector antes de recurrir a selectores nth-child. Esta es una operación costosa y puede incurrir en una sobrecarga significativa, no establezcas un valor superior a 2000. Valor por defecto:1000.maxOptimiseTries?: numberNúmero de intentos para optimizar y acortar el selector. Valor por defecto:10 000.
Reconexiones
Section titled ReconexionesconnAttemptCount?: numberNúmero máximo de reintentos cuando las solicitudes HTTP del tracker no logran llegar al backend. Valor por defecto:10.connAttemptGap?: numberDuración entre cada intento de reintento (expresado en ms). Valor por defecto:8000.
Flags de Características
Section titled Flags de CaracterísticasonFlagsLoadcallback utilizado para realizar una acción una vez que los flags de características se cargan (cada vez).
flags?: {
onFlagsLoad?: (flags: IFeatureFlag[]) => void
}
// ...
interface IFeatureFlag {
key: string
is_persist: boolean
value: string | boolean
payload: string
}
Seguridad
Section titled Seguridad__DISABLE_SECURE_MODE?: booleanPara permitir conexiones inseguras entre el tracker y el backend en sitios sin SSL. Esto debe usarse solo con fines de desarrollo. Valor por defecto:false.