Volver al inicio

Optimización de Sitio Web para Safari iOS

Lista de verificación de optimizaciones elimina problemas típicos de Safari en iOS: colas HTTP/1.1, thrashing JS, canvas OOM. Incluye HTTP/2, lazy loading, defer scripts, PurgeCSS. Adecuada para desarrolladores intermedios/senior.

Sitio web rápido en Safari: lista de verificación completa
Advertisement 728x90

Optimización de Sitios Web para Safari: Lista de Verificación para Desarrolladores

Los sitios que cargan sin problemas en Chrome o Firefox a menudo se ralentizan en Safari en iOS. Las limitaciones de HTTP/1.1, un motor JavaScript de un solo hilo y límites estrictos de memoria provocan colas de solicitudes, trashing y cierres por falta de memoria (OOM). Esta lista de verificación de optimización aborda problemas típicos de Safari sin comprometer la funcionalidad.

Correcciones Críticas para la Estabilidad en Safari

Safari limita las conexiones a 6 por dominio en HTTP/1.1, lo que causa colas al cargar múltiples recursos. El motor JS de un solo hilo tiene dificultades con eventos frecuentes de desplazamiento/redimensionamiento, y los lienzos (canvas) de más de 4000×10000 píxeles pueden bloquear pestañas.

Pasos Esenciales

  • Cambiar a HTTP/2

Configuración de Nginx:

Google AdInline article slot

```nginx

server {

listen 443 ssl http2;

Google AdInline article slot

server_name mysite.com;

ssl_certificate /path/to/cert.pem;

ssl_certificate_key /path/to/key.pem;

Google AdInline article slot

root /var/www/html;

index index.html;

}

```

Recargar: sudo nginx -s reload. Verificar en DevTools: Protocolo = h2.

  • Carga diferida para imágenes debajo del pliegue

```html

<img src="hero.jpg" alt="Banner principal" class="hero-image">

<img src="gallery/photo1.jpg" alt="Foto" loading="lazy">

```

Para Swiper:

```html

<img data-src="slide1.jpg" class="swiper-lazy" alt="Diapositiva">

<div class="swiper-lazy-preloader"></div>

```

  • Diferir todos los scripts excepto jQuery

```html

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

<script src="js/slider.js" defer></script>

<script src="js/main.js" defer></script>

```

  • Eliminar bibliotecas no utilizadas

Verificar: console.log(window.THREE). Buscar en el proyecto: THREE. o three.js.

  • Limitar eventos de desplazamiento/redimensionamiento/rueda

```javascript

let ticking = false;

window.addEventListener('scroll', () => {

if (!ticking) {

requestAnimationFrame(() => {

onScrollHeavyTask();

ticking = false;

});

ticking = true;

}

});

```

  • Optimizar lienzos en móviles

Recalcular según el ancho de pantalla, reducir partículas en resoluciones pequeñas.

Mejoras de Alta Prioridad en la Carga

Compresión Gzip/Brotli en nginx:

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

Preconexión para CDN en <head>:

<link rel="preconnect" href="https://code.jquery.com">
<link rel="preconnect" href="https://cdn.jsdelivr.net">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

PurgeCSS para CSS (Gulp):

const gulp = require('gulp');
const purgecss = require('gulp-purgecss');

gulp.task('purge', () => {
  return gulp.src('dist/css/style.css')
    .pipe(purgecss({
      content: ['**/*.html', '**/*.js'],
      safelist: [/swiper/, /modal/, /active/, /open/]
    }))
    .pipe(gulp.dest('dist/css'));
});

La versión de PostCSS es similar.

Eliminar jQuery Migrate: asegurarse de que no haya JQMIGRATE en la consola.

font-display: swap:

@font-face {
  font-family: 'Open Sans';
  src: url('/fonts/OpenSans.woff2') format('woff2');
  font-weight: 400;
  font-display: swap;
}

Optimizaciones para Lighthouse

CSS crítico en línea + carga asíncrona:

<style>
  .header { background: #fff; }
  .hero { font-size: 2rem; }
</style>
<link rel="preload" href="css/main.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="css/main.css"></noscript>

WebP con respaldo:

<picture>
  <source srcset="images/photo.webp" type="image/webp">
  <source srcset="images/photo.jpg" type="image/jpeg">
  <img src="images/photo.jpg" alt="Descripción" loading="lazy" width="800" height="600">
</picture>

Gulp para WebP:

const imagemin = require('gulp-imagemin');
const webp = require('gulp-webp');

gulp.task('webp', () => {
  return gulp.src('src/images/**/*.{jpg,png}')
    .pipe(webp())
    .pipe(gulp.dest('dist/images'));
});

Conclusiones Clave

  • HTTP/2 elimina las colas de conexión en Safari.
  • Limitar eventos de desplazamiento/redimensionamiento evita el trashing en el JS de un solo hilo.
  • La carga diferida + diferir reduce el bloqueo de renderizado.
  • PurgeCSS y la eliminación de bibliotecas reducen el volumen de JS/CSS.
  • La optimización de lienzos es crítica para fondos animados.

Las auditorías regulares con esta lista minimizan la pérdida de tráfico de audiencias iOS.

— Editorial Team

Advertisement 728x90

Leer después