Retour à l'accueil

Optimisation du site web pour Safari iOS

Liste de vérification des optimisations élimine les problèmes typiques de Safari sur iOS : files d'attente HTTP/1.1, thrashing JS, canvas OOM. Inclut HTTP/2, lazy loading, defer scripts, PurgeCSS. Convient aux développeurs middle/senior.

Site web rapide dans Safari : liste de vérification complète
Advertisement 728x90

Optimisation de site web pour Safari : Liste de contrôle pour développeurs

Les sites qui se chargent fluidement sur Chrome ou Firefox ralentissent souvent sur Safari sous iOS. Les limitations du HTTP/1.1, un moteur JavaScript monothread et des limites strictes de mémoire entraînent des files d'attente de requêtes, des ralentissements et des fermetures par manque de mémoire. Cette liste de contrôle d'optimisation aborde les problèmes typiques de Safari sans compromettre les fonctionnalités.

Corrections critiques pour la stabilité de Safari

Safari limite les connexions à 6 par domaine en HTTP/1.1, créant des files d'attente lors du chargement de multiples ressources. Le moteur JS monothread peine avec les événements fréquents de défilement/redimensionnement, et les canvas dépassant 4000×10000 pixels peuvent faire planter les onglets.

Étapes essentielles

  • Passer au HTTP/2

Configuration 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;

}

```

Recharger : sudo nginx -s reload. Vérifier dans DevTools : Protocole = h2.

  • Chargement différé pour les images hors écran

```html

<img src="hero.jpg" alt="Bannière principale" class="hero-image">

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

```

Pour Swiper :

```html

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

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

```

  • Différer tous les scripts sauf 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>

```

  • Supprimer les bibliothèques inutilisées

Vérifier : console.log(window.THREE). Rechercher dans le projet : THREE. ou three.js.

  • Limiter défilement/redimensionnement/roulette

```javascript

let ticking = false;

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

if (!ticking) {

requestAnimationFrame(() => {

onScrollHeavyTask();

ticking = false;

});

ticking = true;

}

});

```

  • Optimiser le canvas sur mobile

Recalculer en fonction de la largeur d'écran, réduire les particules sur les petites résolutions.

Améliorations prioritaires de chargement

Compression Gzip/Brotli dans 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;

Préconnexion pour CDN dans <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 pour 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 version PostCSS est similaire.

Supprimer jQuery Migrate : s'assurer qu'il n'y a pas de JQMIGRATE dans la console.

font-display: swap :

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

Optimisations pour Lighthouse

CSS critique en ligne + chargement asynchrone :

<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 avec fallback :

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

Gulp pour 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'));
});

Points clés à retenir

  • HTTP/2 élimine les files d'attente de connexion dans Safari.
  • Limiter défilement/redimensionnement évite les ralentissements dans le JS monothread.
  • Chargement différé + différer réduisent le blocage du rendu.
  • PurgeCSS et suppression de bibliothèques réduisent le volume JS/CSS.
  • L'optimisation du canvas est cruciale pour les arrière-plans animés.

Des audits réguliers avec cette liste minimisent la perte de trafic des audiences iOS.

— Editorial Team

Advertisement 728x90

Lire ensuite