¿Qué Configuración Necesita Windi Para Purgar El CSS En Producción?
2026-06-30 03:19:40
143
關注7
分享
MilaSigo
Amante libros
Vendedora
ABO人格測試
快速測測看!你的真實屬性是 Alpha、Beta 還是 Omega?
費洛蒙
屬性
理想的戀愛
潛藏慾望
隱藏黑化屬性
馬上測測看
1 答案
Cooper
Comentarista
Abogado
Me encanta cuando el CSS queda ajustado y sin peso extra en producción; con Windi CSS esto se logra básicamente configurando correctamente qué archivos escanea y qué clases debe proteger (safelist). Yo siempre reviso dos cosas: que Windi esté apuntando a las carpetas donde está mi HTML/Vue/JS/MD y que las clases dinámicas que genero en tiempo de ejecución estén en una lista segura, porque si no, el purgado se las puede llevar.
En versiones modernas de Windi (v3+), la clave es la opción scan. Un ejemplo típico de windi.config.js que uso es el siguiente:
module.exports = { scan: { dirs: ['src', 'pages', 'components',// carpetas a escanear fileExtensions: ['vue', 'js', 'ts', 'jsx', 'tsx', 'html', 'md'] // extensiones a buscar }, safelist: [ // clases que siempre queremos mantener (pueden ser strings o regex) 'prose', /^bg-/, // útil si generas bg-${color} 'text-center' , theme: {}, plugins: [] };
Con esto Windi sabe exactamente dónde buscar clases usadas y eliminar las no referenciadas al construir para producción. Si usas Vite o Nuxt con los plugins oficiales (vite-plugin-windicss o @nuxtjs/windicss) normalmente el purgado se hace automáticamente en el build, pero la clave sigue siendo que los dirs/fileExtensions incluyan todo tu código y templates. Si tienes páginas generadas a partir de Markdown o archivos fuera de src, hay que añadir esas carpetas aquí.
Si trabajas con una versión más antigua de Windi o con ciertos entornos, verás la opción extract en lugar de scan. Un ejemplo compatible sería:
Algunos consejos prácticos que siempre aplico: 1) añade en safelist cualquier clase que construyas por concatenación (p. ej. ), 2) incluye archivos generados dinámicamente (templates, fragments, .md) para que no se borre CSS que sí necesitas, 3) excluye nodemodules y carpetas grandes que no quieres escanear para ahorrar tiempo, y 4) revisa el log del build: Windi suele indicar cuántas clases ha generado y si hay patrones que no encontró.
En resumen, para purgar eficazmente en producción necesitas configurar los paths que Windi escaneará (scan o extract según versión), declarar una safelist para clases dinámicas y asegurarte de que el plugin de bundler está activo durante el build. Con eso mis builds quedan ligeros y el estilo sigue intacto, y me deja más tiempo para disfrutar de lo creativo en lugar de pelear con el CSS muerto.
2026-07-06 04:05:53
4
查看全部答案
掃碼下載 APP
相關作品
Ya no quedan cristales, Alfa
Serein M
10
1.2K
Durante sesenta y seis noches de luna llena, el Alfa Zephyr me colmó de elaborados rituales de cortejo, suplicándome que aceptara ser su compañera.
En la sexagésima séptima… finalmente dije que sí.
La noche en que consagramos nuestro vínculo de apareamiento, le entregué una bolsita encantada con sesenta y seis cristales de luz de luna.
Hicimos un trato: cada vez que rompiera mi corazón, yo aplastaría uno. Ese era el precio de mi perdón.
En los seis años desde que nos unimos, rompió mi corazón una y otra vez por su amiga de la infancia, Chloe. Y cada vez… yo aplastaba un cristal.
Cuando el cristal número sesenta y cuatro se convirtió en polvo, Zephyr por fin pareció notar que algo no estaba bien.
Dejé de decirle que mantuviera su distancia con Chloe. Dejé de necesitar que estuviera a mi lado.
Pero cuando intentó dejarme por esa Omega una vez más, lo sujeté del brazo.
—Vas a ir con ella… ¿Debería aplastar otro cristal por esto?
Zephyr se quedó inmóvil, con el cansancio reflejado en el rostro.
—Haz lo que te dé la gana. De todos modos, te quedan muchos.
Solo asentí, observando su espalda mientras desaparecía.
Él todavía creía que los cristales de luz de luna eran infinitos.
No tenía idea… de que solo quedaban dos en la bolsita.
Diego, heredero Zambrano y mi prometido de conveniencia —eso que llamaban el Príncipe—, mantenía una amante. La consentía tanto que la volvió caprichosa e insufrible.
Justo cuando yo comenzaba los trámites para anular el compromiso, de repente vi un torrente de comentarios flotando ante mis ojos:
“¿Qué culpa tiene el Príncipe? Solo quiere que le prestes atención.”
“¡Nenita, no canceles la boda! Con solo unas lágrimas, él te entregaría hasta la luna.”
Giré la cabeza. Afuera, por la ventana, aquella amante, cubierta de joyas de lujo, sonreía radiante mientras se colgaba del brazo de Diego.
Él, por su parte, bajó la mirada con indolencia, con una suerte de condescendencia distraída.
Sonreí y respondí al mensaje de mi abogado: “Continúe redactando el acuerdo de ruptura del compromiso.”
Podía ver una cuenta regresiva sobre la cabeza de las personas cuando ya habían decidido dejar a su pareja. El día que la cuenta regresiva de mi padre llegó a cero, plantó sobre la mesa del desayuno una carta de un abogado y nos abandonó a mi madre y a mí.
El día que la cuenta regresiva de mi mejor amiga llegó a cero, por fin echó de su departamento a ese parásito de novio y cambió las cerraduras antes del anochecer.
Por eso siempre me había aterrado ver una cuenta regresiva sobre la cabeza de mi prometido, Lucian Bellandi. Por suerte, en los siete años que llevaba a su lado, el espacio sobre su cabeza había permanecido vacío.
Lucian era el Don más joven en la historia de la familia Bellandi. Era dueño de los muelles, los casinos y la mitad del dinero sucio de la zona sur, pero reservaba toda su ternura para mí.
Eso cambió el mes pasado, cuando pasó a buscarme después de una subasta de los Bellandi. Levanté la mirada y unos números rojos como la sangre me hirieron los ojos.
“702 días, 14 horas y 22 minutos”.
Menos de dos años. Sentí que se me helaba la sangre. Busqué una explicación con desesperación. ¿Había hecho algo mal?
Después, durante una tormenta de nieve junto al lago, nos encontramos con Mia Crane en la entrada trasera del Hotel Bellandi. Lucian acababa de contratarla como nueva asistente de su fundación benéfica.
Tenía nieve en el cabello y las pestañas. Tiritaba de pies a cabeza, pero su sonrisa era radiante y de una inocencia conmovedora.
Lucian sacó un pañuelo de seda negro del bolsillo interior de su saco y se lo entregó. Tenía una actitud tranquila. No había nada abiertamente inapropiado en ese gesto.
Pero en ese momento, la cuenta regresiva sobre su cabeza cambió.
“327 días, 4 horas y 47 minutos”.
Más de trescientos días desaparecieron. Y entonces supe que había encontrado el motivo.
Un par de días antes del Año Nuevo, Diego —mi novio— decidió irse a la playa con su asistente.
Yo no dije nada. No lloré, no grité, no hice escándalo. Incluso lo ayudé a empacar, con todo el cariño del mundo. ¿Y él qué hizo? Se burló. Me dijo que, ahora que estaba embarazada, por fin había aprendido a comportarme.
Apenas se fue, me fui directo a abortar.
En mi vida pasada, había intentado retenerlo con ese bebé. Y lo había logrado: él no se había marchado.
Al final, su asistente había ido sola a la playa, y ahí la habían matado de una forma brutal.
Diego siempre fingía que nada le afectaba. Siempre con esa cara tranquila, como si todo le diera igual.
Pero, cuando estaba a punto de dar a luz, fue él quien me abrió el vientre con sus propias manos. Apretó con fuerza… hasta que asesinó a mi hijo.
Y fue en ese momento cuando lo entendí todo: siempre me había despreciado, y desde la muerte de aquella mujer… me odiaba sin medida.
Por eso, ahora, que había vuelto a nacer, pensaba dejarlo sin nada.
Era la prometida de Ian Chávez, conocido como el "Príncipe Cisne", ofreció su posición de Primer Bailarín para casarse conmigo.
Él, tan arrogante y solitario, sin embargo, ofreció la más absoluta sumisión en el escenario a mi coreografía de "La Corona Eterna".
Tres años de estudio en París después, a mi regreso, descubrí que esa bailarina suplente, cuya espalda se parecía a la mía, ya se había adueñado de nuestro salón de ensayos privado.
En la fiesta de bienvenida, Ian abandonó a los patrocinadores para correr detrás de la suplente, que lloraba.
Tras el terciopelo del telón, escuché las palabras tiernas que nunca me había dirigido a mí:
—Yamina, al principio te elegí porque eras su sombra, solo buscaba un sustituto.
—Pero eres tan diferente, tu coreografía me embriaga, incluso más que la suya.
—Solo asegurémonos de que ella no lo sepa antes de la función de despedida de “La Corona Eterna”.
Desde el salón de ensayos llegaron gemidos sofocados y esa frase:
—Te daré incluso mi posición de Primer Bailarín.
Y justo allí, donde él una vez tomó mis manos y juró que Yo, Estrella López, sería su única alma gemela para toda la vida.
Di la vuelta y me fui.
De vuelta en el camerino y llamé al Sr. Díaz, su mayor rival.
—Director Díaz, acepto el contrato para cambiar de compañía. Y por favor, prepáreme un regalo. Que la función de despedida de Ian se convierta en el mayor escándalo que el mundo del arte haya visto.
"Mi íncubo llegó hace un mes y todavía no deja que lo toque. ¿Por qué pasa esto?"
Escribí al asesor con el ceño fruncido, ya perdiendo la paciencia.
La respuesta del agente no tardó en llegar, redactada con esa cortesía empalagosa de siempre.
"Señorita, nuestras unidades suelen estar ansiosas por convivir con sus dueñas. Si el suyo se comporta así, lo más probable es que esté defectuoso. Si gusta, podemos tramitar el cambio ahora mismo. El nuevo le estaría llegando en una semana."
Me quedé mirando a Diego. Era perfecto, tal como lo había soñado siempre.
No podía con el pensamiento de devolverlo.
Decidí darle un voto de confianza y esperar unos días más. Si de plano no funcionaba, intentaría mandarlo a reparar.
Me encantaba demasiado como para rendirme así de fácil. Pero todo se fue al carajo durante la cena familiar.
Fue ahí donde sentí un nudo en el estómago al darme cuenta de que mi íncubo tuvo una reacción al ver a mi hermanastra... que estaba sentada justo frente a él.
En ese momento, caí en cuenta: el día que llegó el paquete, fue ella quien lo abrió.
Esa misma noche, volví a contactar al asesor.
"¿Me confirman que el nuevo llega en una semana? Olvídenlo, mándenme el reemplazo de una vez."
Me flipa lo eficiente que es Windi para mantener el CSS en producción ligero sin que tengas que renunciar a flexibilidad o utilidades dinámicas. Yo lo he usado en varios proyectos y la forma en que resuelve el crecimiento descontrolado del CSS es muy distinta a la de frameworks que generan todas las clases posibles: Windi funciona on-demand (JIT), escanea tu código y solo genera las reglas que realmente usas, lo que ya reduce muchísimo el tamaño final.
En práctica, Windi detecta las clases en tus archivos (HTML, Vue, React, Svelte, JS, TS, e incluso plantillas no convencionales) gracias a extractors configurables. Durante el build en producción, el motor JIT crea solo las reglas necesarias, incluidos los valores arbitrarios como «bg-[#1a2b3c]» o «px-[22px]», en vez de precompilar todas las combinaciones posibles. Esto evita el enorme fichero CSS que obtendrías si generases todas las variantes por adelantado. Además, puedes definir una safelist para forzar que ciertas clases siempre estén disponibles, y patrones de extracción para que Windi reconozca las clases dinámicas que construyes con concatenaciones o templates literales.
Otros mecanismos que ayudan a recortar peso: puedes desactivar o modularizar la capa «preflight» si no la necesitas, lo que elimina estilos base no usados; los «shortcuts» permiten agrupar combinaciones frecuentes en una sola clase personalizada, lo que reduce repetición; y la configuración de variantes/plugins que no uses puede mantenerse fuera del build. Windi también admite el modo «attributify», que a nivel de HTML puede hacer tu marcado más limpio y ayudarte a evitar múltiples clases redundantes. En cuanto a la cadena de herramientas, Windi se integra con Vite, Webpack y otros bundlers para generar un CSS final único, que suele pasar por minificación y cacheo de assets en el pipeline de producción (puedes añadir plugins de PostCSS si necesitas tratamiento extra como cssnano o purging adicional).
Consejos prácticos que aplico: definir bien los patrones de extracción para detectar clases dinámicas (evitas fugas de CSS), mantener la safelist lo más pequeña posible, desactivar funcionalidades no usadas (preflight, utilidades experimentales) y aprovechar los shortcuts para normalizar patrones de diseño. También reviso el build con el analizador que ofrece Windi o con herramientas de bundle-analyze para ver qué reglas se generan y eliminar dependencias o patrones innecesarios. En proyectos reales eso se traduce en CSS de kilobytes en lugar de megabytes y tiempos de carga mucho mejores. Al final, me encanta usar Windi porque me da la libertad de escribir estilos utilitarios muy expresivos sin pagar el precio de un CSS enorme en producción.
Me flipa la forma en que «Windi CSS» acelera proyectos que usan «Tailwind CSS»: no es solo velocidad por velocidad, es una experiencia de desarrollo y entrega mucho más ágil. «Windi CSS» fue pionera en generar utilidades bajo demanda, lo que significa que en vez de compilar una hoja de estilos enorme con todas las clases posibles, el motor analiza el HTML/JSX/Vue/etc. y crea únicamente las reglas que realmente se usan. Eso se traduce en bundles de CSS dramáticamente más pequeños en producción y en tiempos de carga mucho mejores para los usuarios.
En detalle técnico, «Windi CSS» implementa un motor JIT (just-in-time) muy eficiente que detecta clases en tus archivos y produce CSS de forma virtual en el servidor de desarrollo o durante el build. Esto elimina el paso pesado de generar y purgar un CSS completo: en dev obtienes HMR instantáneo porque solo cambian y se sirven las reglas necesarias, y en producción el resultado es un archivo mínimo sin CSS muerto. Además, tiene un sistema de caché y persistencia que evita recompilar las mismas utilidades una y otra vez, acelerando compilaciones incrementales y el tiempo de CI/CD.
Otra ventaja práctica es la flexibilidad y las extensiones que trae «Windi CSS»: modos como attributify reducen el tamaño y la verbosidad en HTML, los transformadores permiten agrupaciones y shorthand que evitan repetir clases, y los extractores detectan patrones complejos (templates, strings dinámicos, etc.). Todo esto contribuye a evitar generar duplicados o reglas innecesarias. También dispone de soporte nativo para variantes arbitrarias y reglas dinámicas, lo que permite escribir utilidades compactas en vez de crear clases redundantes, y a la larga eso baja la presión en el motor de render del navegador (menos reglas = menos trabajo al parsear y aplicar estilos).
Desde el punto de vista del rendimiento UX, un CSS más pequeño reduce el bloqueo en la renderización: menos bytes que descargar, parsear y aplicar, lo que acelera el Time to First Paint y el Time to Interactive. Menos reglas también ayudan al proceso de layout y repaint cuando hay cambios dinámicos. En proyectos grandes esto puede ser visible en dispositivos móviles o conexiones lentas. Por otra parte, la integración con herramientas modernas (Vite, Nuxt, Webpack) es sólida, lo que facilita adoptar «Windi CSS» sin romper flujos ya establecidos y con mejoras inmediatas en velocidad de dev y build.
Al comparar con el flujo clásico de «Tailwind CSS», hoy en día Tailwind incluye su propio JIT, pero «Windi CSS» sigue destacando por algunas utilidades adicionales, su motor de generación virtual y ciertas optimizaciones de rendimiento y ergonomía. En resumen, usar «Windi CSS» con «Tailwind CSS» (o en su lugar) reduce el tamaño del CSS, acelera los ciclos de desarrollo y mejora la experiencia final del usuario al disminuir los tiempos de carga y trabajo de render del navegador. Me encanta cómo transforma proyectos pesados en experiencias ligeras y rápidas; es uno de esos cambios tecnológicos que se nota tanto en el código como en la navegación diaria.
Me encanta cómo Windi acelera el flujo de trabajo, así que aquí te cuento paso a paso cómo lo instalo cuando empiezo un proyecto Vue 3 con Vite.
Primero, en el proyecto ejecuto: npm install -D windicss vite-plugin-windicss. Luego creo un archivo de configuración llamado windi.config.js o windi.config.ts en la raíz, donde defino colores, safelist y plugins si los necesito. Por ejemplo, exporto un objeto con theme, plugins y extract para que analice mis archivos .vue y .html.
Después modifico vite.config.js: import WindiCSS from 'vite-plugin-windicss' y lo añado a la lista de plugins: plugins: [vue, WindiCSS]. En el entry (main.js o main.ts) importo la hoja virtual con import 'virtual:windi.css' y, si quiero, import 'virtual:windi-devtools' para debug. Reinicio el servidor Vite y ya puedo usar clases utilitarias directamente en mis SFC. Si necesito modo attributify activo, lo configuro en windi.config.js. Me resulta limpio, rápido y totalmente compatible con la mentalidad de utilidades de Tailwind, pero con compilado más ágil y menos configuración en general.
Ver un stack limpio de Nuxt 3 impulsado por Windi CSS es de esas combinaciones que te hacen sonreír por lo práctico y rápido que resulta. Aquí te doy una guía paso a paso, con trucos y ejemplos concretos para que lo configures sin dolores de cabeza y con una buena experiencia de desarrollo.
Instalación y dependencias: en la raíz del proyecto ejecuta: npm install -D windicss vite-plugin-windicss. Después crea el archivo de configuración de Windi: windi.config.ts con algo así como: import { defineConfig } from 'windicss/helpers'
export default defineConfig({
attributify: true,
shortcuts: {
'btn': 'px-4 py-2 rounded bg-blue-600 text-white hover:bg-blue-700'
},
theme: {
extend: {}
},
extract: {
include: ['/.{vue,html,ts,js}',
exclude: ['nodemodules', '.git']
}
})
Integración con Nuxt 3: abre nuxt.config.ts y añade la integración vía Vite. Importa el plugin y registra el fichero virtual de estilos para que Windi inyecte sus estilos en dev y build. Ejemplo mínimo:
import Windi from 'vite-plugin-windicss'
export default defineNuxtConfig({
css: ['virtual:windi.css',
vite: {
plugins: [Windi]
}
})
Notas útiles: 'virtual:windi.css' es clave para que Nuxt incluya la hoja resultante. Si quieres la extensión de inspección en desarrollo, puedes sumar 'virtual:windi-devtools' en la propiedad css solo en desarrollo o usar los plugins adicionales de Windi en la configuración del plugin.
Uso en componentes y patrones prácticos: con attributify activado puedes escribir atributos tipo html:
, o seguir usando clases utility como class='flex items-center gap-4'. Aprovecha los shortcuts definidos en windi.config.ts para patrones repetidos, por ejemplo . Para asegurarte de que clases generadas dinámicamente no se pierdan en producción, utiliza safelist en la configuración si necesitas proteger patrones dinámicos o añade los patrones a extract.include.
Optimización y resolución de problemas comunes: si no ves estilos, revisa que el servidor de desarrollo haya sido reiniciado y que 'virtual:windi.css' esté presente en nuxt.config.ts. Si faltan utilidades en producción, amplía las rutas en extract.include para que Windi escanee todos tus archivos .vue, .ts y .js. Si quieres autocompletado y validación, instala la extensión de editor 'Windi CSS' para VSCode; mejora muchísimo la experiencia. Para más personalización puedes añadir plugins de Windi, variantes personalizadas y temas extendidos en el windi.config.ts.
En resumen, la integración es rápida: instalar, crear windi.config.ts, añadir vite-plugin-windicss en nuxt.config.ts y declarar 'virtual:windi.css'. A partir de ahí trabajas con utilidades, attributify y shortcuts, y Windi se encarga del tree-shaking en producción. Me resulta muy cómodo para prototipar y mantener código limpio sin perder rendimiento; la combinación Nuxt 3 + Windi acelera el flujo y deja espacio para enfocarse en la UI y la experiencia.
Me encanta comparar herramientas cuando resuelven el mismo problema con enfoques distintos: en el caso de Windi y Tailwind, la diferencia en cómo manejan las clases dinámicas se nota mucho en el flujo de trabajo diario. He usado ambos en proyectos con Vue y React, y la experiencia varía según cuánto generes clases en tiempo de ejecución (concatenaciones, bindings, plantillas, variables CSS). Aquí cuento las diferencias clave, ejemplos prácticos y qué elegir según tu estilo de desarrollo.
Windi nació con un motor on-demand que escanea plantillas y genera CSS en tiempo real, y eso le da una ventaja clara en detección de clases dinámicas. Su extractor es más permisivo y cuenta con transformadores que interpretan expresiones más complejas (por ejemplo, strings interpoladas en templates de Vue o concatenaciones comunes). Eso significa que cosas como class=\"text-\${size}\" o :class=\"[isActive ? 'bg-red-500' : 'bg-green-500']\" tienen mayor probabilidad de ser detectadas sin configuración adicional. Además Windi ofrece 'attributify' (usar atributos en vez de class) y 'shortcuts' para crear alias de utilidades, lo que ayuda cuando generas clases de forma programática: puedes centralizar patrones y reducir la necesidad de interpolaciones en tiempo de ejecución.
Tailwind, especialmente desde la llegada de su modo JIT oficial, redujo mucho la brecha: el compilador JIT genera utilidades bajo demanda y soporta valores arbitrarios como w-[calc(100%-12px)] o text-[var(--size)]. Sin embargo, Tailwind suele requerir más disciplina en proyectos con clases completamente dinámicas: si las clases no aparecen literalmente en los archivos fuente, hay que recurrir a safelists o patrones de purga (regex) en la configuración para asegurar su inclusión. En resumen, Tailwind JIT es muy potente y ahora cubre muchos casos, pero en escenarios con binding complejo o plantillas generadas dinámicamente, puede pedir más configuración manual.
Otro punto práctico: rendimiento y dev UX. Windi fue diseñado para ser ultrarrápido y sensible en el dev server, con recálculos ágiles cuando cambian las clases. También su ecosistema trae utilidades integradas para extraer clases en distintos formatos y para agrupar variantes, lo que resulta cómodo si eres de los que escribe clases en runtime. Tailwind ha reducido la diferencia, pero en setups donde los strings de clase se generan por lógica compleja, Windi tiende a ahorrarte tiempo al evitar safelists extensas. Por otro lado, Tailwind tiene una comunidad enorme y plugins consolidados, y si tus clases dinámicas están limitadas a unos pocos patrones, la configuración de Tailwind suele ser suficiente.
En mi experiencia personal, si tu proyecto usa muchas interpolaciones, bindings de Vue/Svelte o patrones dinámicos, Windi te da menos fricciones. Si prefieres la estabilidad y el ecosistema de Tailwind y puedes controlar dónde aparecen las clases (o añadir safelists/regex), Tailwind JIT te dará el poder necesario sin complicarte demasiado. Al final, la elección suele reducirse a cuánto generas clases en runtime y cuánto quieres que la herramienta "adivine" esos patrones por ti: ambos son excelentes, pero Windi tiende a ser más permisivo y orientado a flujos dinámicos, mientras que Tailwind apuesta por predictibilidad y un ecosistema más masivo.
Hay un procedimiento bastante claro que yo sigo cuando tengo que convertir letras "de máquina" (o cualquier conjunto de glifos) en una fuente que se pueda usar en CSS, y te lo voy contando paso a paso.
Primero recolecto o diseño los glifos: si ya tengo un .ttf o .otf lo abro en una herramienta tipo FontForge o Glyphr Studio para revisar nombres, métricas y unicodes. Si estoy creando desde cero, dibujo cada carácter y me aseguro de asignarles códigos Unicode correctos. Luego exporto y convierto a formatos web: idealmente .woff2 para navegadores modernos, y .woff o .ttf como fallback. Herramientas prácticas que uso son FontForge, Transfonter y también pyftsubset para subsettings.
La parte CSS es sencilla pero importante: subo los archivos al servidor (o los inyecto en base64), declaro @font-face con font-family, src (apuntando a .woff2 primero), font-weight y font-style, y añado font-display: swap para evitar FOIT. Ajusto unicode-range si quiero limitar el conjunto y así ahorrar peso. Finalmente pruebo en distintos navegadores y reviso licencia y permisos. Me gusta ver cómo el texto gana personalidad; siempre termino ajustando letter-spacing y line-height para que la fuente realmente respire en la web.
He revisado cómo funcionan esos identificadores y te cuento lo que he aprendido y probado en varios dispositivos.
En la mayoría de las apps el llamado «discovery id» (o identificador de descubrimiento) no suele borrarse desde una opción simple en la configuración de usuario de la propia aplicación. Yo he encontrado que hay dos capas: una local (en tu teléfono) y otra en los servidores de la app. Para la parte local, lo que me ha funcionado es borrar los datos de la app, limpiar caché o desinstalar y volver a instalar; en Android también puedes restablecer el identificador de publicidad desde Ajustes > Google > Anuncios > Restablecer ID de publicidad, y en iPhone normalmente está en Ajustes > Privacidad/Seguimiento y en opciones de publicidad (según versión de iOS). Eso cambia o resetea el identificador del dispositivo, pero no borra automáticamente lo que la compañía ya tiene en sus servidores.
En cuanto a la parte del servidor, yo he tenido que pedir soporte para que eliminen mi registro o usar las opciones de eliminación de cuenta. Si estás en la UE o regiones con leyes de privacidad (como GDPR), puedes solicitar la supresión de datos y suelen responder a peticiones de borrado. Ten en cuenta que borrar o resetear el discovery id puede afectar recomendaciones, sincronización y personalización; yo siempre hago una copia mental de lo que puedo perder antes de avanzar. En general: sí puedes eliminar o cambiar el identificador en tu dispositivo con las opciones que te comenté, pero para borrarlo completamente de la plataforma lo habitual es contactar con soporte o usar la opción de eliminar cuenta. Esa combinación me ha funcionado y me deja más tranquilo con mi privacidad.
Tengo una opinión bastante clara después de verla: «La Purga 4» sí se propone mostrar el origen de las purgas, pero lo hace desde un ángulo muy concreto y con intenciones narrativas claras.
La película funciona como precuela y nos sitúa en el momento en que la idea deja de ser rumor y se institucionaliza. En pantalla se muestra que no fue un fenómeno espontáneo ni exclusivamente anárquico, sino una política diseñada y promovida por una entidad con poder —una clase política que manipula estadísticas, medios y recursos— para experimentar con la violencia como método de control social. Se ve cómo la Purga fue lanzada como un experimento localizado, con incentivos económicos y medidas logísticas que convierten la brutalidad en algo “medible”. Personalmente me impresionó cómo la cinta enfatiza la explotación de comunidades vulnerables: la Purga se presenta como una herramienta para que los de arriba deshacerse de “lo indeseable” sin ensuciarse las manos.
No obstante, también siento que la película no pretende (y en parte no puede) contar toda la genealogía ideológica del fenómeno. Explica el mecanismo inicial —quién lo promovió, por qué se puso a prueba y cómo se justificó públicamente— pero deja en sombra la historia más larga detrás del ascenso de ese tipo de ideas en la sociedad. Es decir, entiende el origen como un acto deliberado de poder, no como una erupción social sin responsables, y eso le da claridad dramática; pero a la vez simplifica factores complejos como la polarización cultural y la economía que preceden a una medida así.
Al final, me quedé con la sensación de que «La Purga 4» hace bien su trabajo cinematográfico: humaniza a quienes sufren el experimento, muestra la maquinaria política y ofrece motivos creíbles para la posterior expansión nacional del evento. No responde a todo, pero sí cambia por completo cómo miras las otras películas de la saga: ya no son solo noches de violencia, sino la consecuencia de una decisión política fría y calculada. Me pareció inquietante y eficaz, y me dejó pensando en cómo la ficción refleja peligros reales cuando el poder se organiza para normalizar la violencia.
Siempre me impresiona cómo un texto se puede transformar con unas cuantas tijeras bien afiladas. Después de años de leer montones de manuscritos y trabajar sobre borradores eternos, he desarrollado un flujo que me resulta infalible: primero la panorámica, luego el detalle. Empiezo por preguntarme cuál es la intención grande del texto: ¿qué necesita contar sí o sí? Cortar lo que no sirve para esa intención es liberador y suele eliminar entre el 20 y el 40% del volumen sin remordimientos.
En la siguiente pasada me concentro en la estructura interna: identificar capítulos o secciones que repiten ideas, eliminar escenas que no mueven el arco y fusionar párrafos redundantes. Aquí me ayudan las marcas de colores o una lista de objetivos por capítulo; si una sección no cumple con su objetivo, la recorto o la reescribo. Luego hago una edición a nivel oración: reducir adverbios, preferir verbos activos, simplificar subordinadas innecesarias y vigilar las muletillas. Busco cadenas habituales de relleno —por ejemplo «muy», «realmente», «en cierto modo», «hay»/«había» innecesarios— y las filtro con búsqueda.
Para la limpieza fina uso herramientas básicas: el corrector ortográfico, conteo de palabras por sección, búsqueda por frecuencia de palabras y un historial de versiones para no perder nada útil. Trabajo en varias pasadas: dos de contenido (macro y medio) y al menos una de pulido de línea. Al final, dejo reposar el texto unas horas o días y leo en voz alta las partes largas: eso revela repeticiones rítmicas y frases torpes. Siempre termino con una impresión personal sobre lo salvado y lo que merece otra vuelta, y disfruto ver cómo el texto respira mejor.
No creo que el director presente la purga como una verdadera justicia. En «The Purge» se nota el pulso de alguien que quiere tensionar al público: nos muestra el ritual, pero desde un ángulo que desarma cualquier sentimiento de celebración. La violencia está filmada de forma cruda y claustrofóbica, con planos que nos obligan a mirar la vulnerabilidad de los personajes más que a glorificar la venganza.
Además, la película demuestra las fisuras sociales que hacen que la purga sea profundamente injusta: las clases altas aprovechan el caos, mientras los pobres y marginados son las verdaderas víctimas. Eso me hace pensar que el director usa la estética del thriller y del horror para criticar, no para justificar. Al final, la sensación que me queda no es de alivio moral sino de inquietud: la supuesta orden es un negocio y una excusa para la violencia, y la película lo subraya con intención, no con complacencia.