Añadir una profundidad máxima de anidación para los detalles plegables

Me gustaría sugerir la adición de una profundidad máxima de anidación para la función integrada [details], o la introducción de una configuración del sitio que permita a los administradores configurar este límite.

El problema

Recientemente, un usuario en mi foro de Discourse creó una publicación que contenía 24 niveles de secciones [details] anidadas.

Esto causó varios problemas:

  1. Rendimiento del navegador: Los usuarios informaron que expandir varios niveles hacía que Firefox se volviera extremadamente lento o no respondiera.
  2. Tiempo de espera del endpoint Markdown: El acceso al endpoint .md del tema se volvió extremadamente lento. Observamos peticiones que tardaban 19,8 segundos y 31,1 segundos.
  3. Errores del servidor: El endpoint Markdown a veces devolvía una página de error “Oops”. Los registros de Discourse también mostraron advertencias de tiempo de espera del trabajador Pitchfork durante la conversión de Markdown.
  4. Posible agotamiento de recursos: Dado que los motores de búsqueda y los rastreadores de IA solicitan con frecuencia los endpoints .md, una publicación con un anidamiento profundo podría desencadenar repetidamente un procesamiento costoso y consumir recursos del servidor.

Después de eliminar la publicación problemática, el endpoint Markdown devolvió HTTP 200 y respondió en aproximadamente 1,7 segundos.

El tema afectado fue:

https://meta.appinn.net/t/topic/87672

(El comentario problemático ya ha sido eliminado.)

Mejora sugerida

Creo que sería útil hacer una de las siguientes cosas:

  • Limitar el anidamiento de [details] a una profundidad razonable, como 2 o 3 niveles.
  • Añadir una configuración del sitio, como details_max_nesting_depth, que permita a los administradores configurar la profundidad máxima de anidamiento.

Por compatibilidad hacia atrás, la configuración podría tener un valor predeterminado de ilimitado, permitiendo a los administradores aplicar un límite cuando sea necesario.

Si los usuarios superan el límite configurado, Discourse podría rechazar la publicación con un mensaje de validación claro.

Solución temporal: un plugin

He creado un pequeño plugin que limita el anidamiento de [details] a un máximo de 2 niveles:

GitHub - scavin/discourse-details-depth-limit · GitHub

El plugin valida las publicaciones en el lado del servidor y rechaza las publicaciones que contienen más de dos niveles de secciones plegables anidadas.

Lo he probado con éxito en mi entorno de desarrollo local de Discourse.

Para los administradores que experimenten problemas similares, este plugin puede servir como solución temporal hasta que esté disponible una solución oficial.

Creo que un límite configurable en el plugin Detalles integrado sería una salvaguarda útil contra el anidamiento accidental o excesivo.

2 Me gusta