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.
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.
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"
}
Primero, crea un nuevo snippet:
elemental-cms snippets create -s mi-snippet
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"
}
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>
Las dependencias CSS pueden ser:
Las dependencias JavaScript soportan tres tipos:
Cuando los snippets se renderizan, las dependencias se inyectan automáticamente basándose en el parámetro `inject_inline_deps`:
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>
El proceso de renderizado sigue este orden:
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 | 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 |
Cuando una página se renderiza, se incluyen tanto las dependencias globales como las de snippets:
Da a tus dependencias nombres significativos para mejor organización:
{
"name": "bootstrap-css",
"type": "text/css",
"url": "css/bootstrap.min.css"
}
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"
}
}
Usa atributos meta para controlar el comportamiento de carga:
{
"name": "analytics",
"type": "application/javascript",
"url": "js/analytics.js",
"meta": {
"async": "true"
}
}
Solo incluye dependencias que realmente uses en el snippet:
Para agregar dependencias a un snippet existente:
Para remover dependencias:
Para actualizar versiones de dependencias:
{
"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"
}
}
]
}
{
"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"
}
}
]
}
{
"cssDeps": [
{
"name": "custom-styles",
"type": "text/css",
"url": "css/mi-snippet.css"
}
]
}
Si las dependencias no se están cargando:
Para resolver conflictos de dependencias:
Para optimizar la carga de dependencias:
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">
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.