Gestión de Dependencias de Snippets

Elemental CMS proporciona un sistema integral de gestión de dependencias para snippets, permitiéndote incluir recursos CSS y JavaScript que se cargan automáticamente cuando los snippets se renderizan. Esta guía explica cómo funcionan las dependencias y cómo gestionarlas efectivamente.

Entendiendo las Dependencias de Snippets

Los snippets pueden tener dos tipos de dependencias:

Estas dependencias se almacenan en la especificación del snippet y se inyectan automáticamente cuando el snippet se renderiza.

Estructura de Dependencias de Snippets

Cada snippet tiene un archivo de especificación (`.json`) que incluye arrays de dependencias:

{
    "_id": ObjectId("..."),
    "name": "nav-bar",
    "cssDeps": [
        {
            "name": "bootstrap",
            "type": "text/css",
            "url": "css/bootstrap.min.css",
            "meta": {
                "integrity": "sha384-...",
                "crossorigin": "anonymous"
            }
        }
    ],
    "jsDeps": [
        {
            "name": "jquery",
            "type": "application/javascript",
            "url": "js/jquery.min.js",
            "meta": {
                "defer": "true"
            }
        }
    ],
    "createdAt": "2025-08-22T20:01:46.809972",
    "lastModifiedAt": "2025-08-22T20:01:46.809972"
}

Creando Snippets con Dependencias

1. Crear el Snippet

Primero, crea un nuevo snippet:

elemental-cms snippets create -s mi-snippet

2. Editar la Especificación

Abre el archivo `mi-snippet.json` generado y agrega tus dependencias:

{
    "_id": ObjectId("..."),
    "name": "mi-snippet",
    "cssDeps": [
        {
            "name": "fontawesome",
            "type": "text/css",
            "url": "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css",
            "meta": {
                "integrity": "sha384-...",
                "crossorigin": "anonymous"
            }
        }
    ],
    "jsDeps": [
        {
            "name": "bootstrap",
            "type": "application/javascript",
            "url": "js/bootstrap.bundle.min.js",
            "meta": {
                "defer": "true"
            }
        }
    ],
    "createdAt": "2025-08-22T20:01:46.809972",
    "lastModifiedAt": "2025-08-22T20:01:46.809972"
}

3. Crear el Contenido HTML

Edita el archivo `mi-snippet.html` con tu contenido:

<div class="mi-snippet">
    <i class="fas fa-home"></i>
    <button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
        Abrir Modal
    </button>
</div>

Tipos y Formatos de Dependencias

Dependencias CSS

Las dependencias CSS pueden ser:

Dependencias JavaScript

Las dependencias JavaScript soportan tres tipos:

Inyección de Dependencias

Cuando los snippets se renderizan, las dependencias se inyectan automáticamente basándose en el parámetro `inject_inline_deps`:

Inyección Automática

Las dependencias se convierten automáticamente en etiquetas HTML:

// Las dependencias CSS se convierten en etiquetas <link>
<link rel="stylesheet" type="text/css" href="https://cdn.example.com/style.css" integrity="sha384-..." crossorigin="anonymous">

// Las dependencias JavaScript se convierten en etiquetas <script>
<script src="js/script.js" type="application/javascript" defer="true"></script>

Proceso de Renderizado

El proceso de renderizado sigue este orden:

  1. Las dependencias CSS se inyectan primero (en el <head> o antes del contenido)
  2. El contenido HTML del snippet se renderiza
  3. Las dependencias JavaScript se inyectan al final (antes del cierre </body>)

Trabajando con Dependencias Globales

Elemental CMS también soporta dependencias globales que se incluyen automáticamente en todas las páginas. Estas funcionan junto con las dependencias específicas de snippets.

Dependencias Globales vs Dependencias de Snippets

Dependencias Globales Dependencias de Snippets
Aplicadas a todas las páginas automáticamente Aplicadas solo cuando se usa el snippet
Gestionadas via comandos global-deps Gestionadas dentro de la especificación del snippet
Cargadas en orden específico (por tipo y campo order) Cargadas cuando el snippet se renderiza
Almacenadas en GLOBAL_DEPS_FOLDER Almacenadas en la especificación JSON del snippet

Combinando Dependencias Globales y de Snippets

Cuando una página se renderiza, se incluyen tanto las dependencias globales como las de snippets:

  1. Las dependencias CSS globales se cargan primero
  2. Las dependencias CSS de snippets se cargan después
  3. El contenido de la página se renderiza
  4. Las dependencias JavaScript globales se cargan
  5. Las dependencias JavaScript de snippets se cargan al final

Mejores Prácticas

1. Usar Nombres Descriptivos

Da a tus dependencias nombres significativos para mejor organización:

{
    "name": "bootstrap-css",
    "type": "text/css",
    "url": "css/bootstrap.min.css"
}

2. Incluir Verificaciones de Integridad

Para recursos externos, incluye hashes de integridad para seguridad:

{
    "name": "jquery",
    "type": "application/javascript",
    "url": "https://code.jquery.com/jquery-3.6.0.min.js",
    "meta": {
        "integrity": "sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK",
        "crossorigin": "anonymous"
    }
}

3. Usar Atributos de Carga Apropiados

Usa atributos meta para controlar el comportamiento de carga:

{
    "name": "analytics",
    "type": "application/javascript",
    "url": "js/analytics.js",
    "meta": {
        "async": "true"
    }
}

4. Minimizar Dependencias

Solo incluye dependencias que realmente uses en el snippet:

Gestionando Dependencias

Agregando Dependencias

Para agregar dependencias a un snippet existente:

  1. Edita el archivo `.json` del snippet
  2. Agrega objetos de dependencia a los arrays `cssDeps` o `jsDeps`
  3. Haz push del snippet actualizado a la base de datos

Removiendo Dependencias

Para remover dependencias:

  1. Edita el archivo `.json` del snippet
  2. Remueve los objetos de dependencia de los arrays
  3. Haz push del snippet actualizado a la base de datos

Actualizando Dependencias

Para actualizar versiones de dependencias:

  1. Edita el archivo `.json` del snippet
  2. Actualiza el campo `url` con la nueva versión
  3. Actualiza cualquier hash de integridad si es aplicable
  4. Haz push del snippet actualizado a la base de datos

Patrones Comunes de Dependencias

Integración Bootstrap

{
    "cssDeps": [
        {
            "name": "bootstrap-css",
            "type": "text/css",
            "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css",
            "meta": {
                "integrity": "sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3",
                "crossorigin": "anonymous"
            }
        }
    ],
    "jsDeps": [
        {
            "name": "bootstrap-js",
            "type": "application/javascript",
            "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js",
            "meta": {
                "integrity": "sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p",
                "crossorigin": "anonymous"
            }
        }
    ]
}

Iconos Font Awesome

{
    "cssDeps": [
        {
            "name": "fontawesome",
            "type": "text/css",
            "url": "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css",
            "meta": {
                "integrity": "sha512-9usAa10IRO0HhonpyAIVpjrylPvoDwiPUiKdWk5t3PyolY1cOd4DSE0Ga+ri4AuTroPR5aQvXU9xC6qOPnzFeg==",
                "crossorigin": "anonymous"
            }
        }
    ]
}

Estilos Locales Personalizados

{
    "cssDeps": [
        {
            "name": "custom-styles",
            "type": "text/css",
            "url": "css/mi-snippet.css"
        }
    ]
}

Solución de Problemas

Dependencias No Se Cargan

Si las dependencias no se están cargando:

Conflictos de Dependencias

Para resolver conflictos de dependencias:

Problemas de Rendimiento

Para optimizar la carga de dependencias:

Características Avanzadas

Dependencias Condicionales

Puedes cargar dependencias condicionalmente basándote en el contexto de la página:


    <!-- Dependencias específicas para español -->
    <link rel="stylesheet" href="css/spanish-specific.css">

Carga Dinámica de Dependencias

Para escenarios complejos, puedes cargar dependencias dinámicamente:

<script>
    if (typeof jQuery === 'undefined') {
        var script = document.createElement('script');
        script.src = 'js/jquery.min.js';
        document.head.appendChild(script);
    }
</script>

Este sistema integral de gestión de dependencias te permite crear snippets ricos e interactivos mientras mantienes una separación limpia de responsabilidades y rendimiento óptimo.