Fix Bootstrap y Cache

This commit is contained in:
2025-09-10 15:21:29 -03:00
parent fb872f0889
commit 363f71282f
2 changed files with 37 additions and 22 deletions

View File

@@ -4,29 +4,27 @@ server {
root /usr/share/nginx/html; root /usr/share/nginx/html;
index index.html; index index.html;
# --- NUEVO BLOQUE ESPECÍFICO PARA BOOTSTRAP.JS --- # --- BLOQUE PARA BOOTSTRAP.JS (MEJORADO) ---
# Se aplica EXCLUSIVAMENTE a la petición de /bootstrap.js
location = /bootstrap.js { location = /bootstrap.js {
# Esta cabecera le dice a los proxies que deben revalidar el archivo # Aseguramos que Nginx genere la huella digital ETag
# con el servidor de origen antes de servirlo desde la caché. etag on;
add_header Cache-Control "no-cache, must-revalidate";
# 'expires off' es otra capa de seguridad para evitar que se cachee
expires off;
# Intenta servir el archivo. Si no existe, devuelve 404. # Instrucciones explícitas de no cachear
expires -1;
add_header Cache-Control "no-cache, must-revalidate, private";
try_files $uri =404; try_files $uri =404;
} }
# Bloque para otros activos estáticos (con hash) que SÍ pueden ser cacheados agresivamente # Bloque para otros activos con hash (con caché agresiva)
location ~* \.(?:js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { location ~* \.(?:js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
# Estos archivos cambian de nombre en cada build, así que pueden
# ser cacheados por mucho tiempo sin riesgo.
expires 1y; expires 1y;
add_header Cache-Control "public"; add_header Cache-Control "public";
try_files $uri =404; try_files $uri =404;
} }
# Bloque para la SPA # Bloque para el enrutamiento de la aplicación React
location / { location / {
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
} }

View File

@@ -1,5 +1,4 @@
// frontend/public/bootstrap.js // frontend/public/bootstrap.js
(function() { (function() {
// El dominio donde se alojan los widgets // El dominio donde se alojan los widgets
const WIDGETS_HOST = 'https://widgets.eldia.com'; const WIDGETS_HOST = 'https://widgets.eldia.com';
@@ -27,17 +26,17 @@
// Función principal // Función principal
async function initWidgets() { async function initWidgets() {
try { try {
// 1. Obtener el manifest.json para saber los nombres de archivo actuales // 1. Obtener el manifest.json
const response = await fetch(`${WIDGETS_HOST}/manifest.json`); const response = await fetch(`${WIDGETS_HOST}/manifest.json`);
if (!response.ok) { if (!response.ok) {
throw new Error('No se pudo cargar el manifest de los widgets.'); throw new Error('No se pudo cargar el manifest de los widgets de mercados.');
} }
const manifest = await response.json(); const manifest = await response.json();
// 2. Encontrar el punto de entrada principal (nuestro main.tsx) // 2. Encontrar el punto de entrada principal
const entryKey = Object.keys(manifest).find(key => manifest[key].isEntry); const entryKey = Object.keys(manifest).find(key => manifest[key].isEntry);
if (!entryKey) { if (!entryKey) {
throw new Error('No se encontró el punto de entrada en el manifest.'); throw new Error('No se encontró el punto de entrada en el manifest de mercados.');
} }
const entry = manifest[entryKey]; const entry = manifest[entryKey];
@@ -51,12 +50,26 @@
}); });
} }
// 4. Cargar el JS principal y esperar a que esté listo // 4. Cargar el JS principal
await loadScript(jsUrl); await loadScript(jsUrl);
// 5. Una vez cargado, llamar a la función de renderizado // 5. Una vez cargado, llamar a la función de renderizado para CADA WIDGET
if (window.MercadosWidgets && typeof window.MercadosWidgets.render === 'function') { if (window.MercadosWidgets && typeof window.MercadosWidgets.render === 'function') {
window.MercadosWidgets.render(); console.log('Bootstrap Mercados: La función render existe. Renderizando widgets...');
// Buscamos los contenedores específicos para los widgets de mercados
const widgetContainers = document.querySelectorAll('[data-mercado-widget]');
if (widgetContainers.length === 0) {
console.warn('Bootstrap Mercados: No se encontraron contenedores de widget en la página.');
}
widgetContainers.forEach(container => {
// Pasamos el contenedor y su dataset (props) a la función de renderizado
window.MercadosWidgets.render(container, container.dataset);
});
} else {
console.error('Bootstrap Mercados: La función window.MercadosWidgets.render no fue encontrada.');
} }
} catch (error) { } catch (error) {
@@ -64,7 +77,11 @@
} }
} }
// Iniciar todo el proceso // Esperamos a que el DOM esté listo para ejecutar
initWidgets(); if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initWidgets);
} else {
initWidgets();
}
})(); })();