Optymalizowanie strony internetowej pod "CWV"

W tym artykule dowiesz się jak optymalizować stronę internetową pod kątem wskaźników dotyczących szybkości i wydajności.
2022-04-08 14:33
4 minuty czytania

Optymalizacja objętości plików css

Instalacja pluginu ‘gulp-purgecss’.

 

konsola

yarn add -D gulp-purgecss

 

Aby zainstalowany plugin działał poprawnie, należy dodać jego wywołanie w funkcji “bundleCssProduction”. Do konfiguracji pluginu potrzebna jest ścieżka do aktualnie “budowanego” szablonu, więc należy przekazać ją jako argument w miejscu gdzie jest wywoływana.

 

frontend/gulp/tasks/bundle-css.js:52

return await bundleCssProduction(templatePath, sourcePath, targetPath, onError);

 

frontend/gulp/utils/bundle-css-production.js.js:8

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

 

Dodanie wywołania pluginu do łańcucha wywołań gulpa. Opcja “content” służy do zdefiniowania ścieżki plików, które będą sprawdzane przez plugin w celu odfiltrowania nieużywanych klas css, co przekłada się na ostateczną wielkość wynikowego pliku.

 

frontend/gulp/utils/bundle-css-production.js.js:30:48

const bundleCssProduction = (
  templatePath,
  sourcePath,
  targetPath,
  onError
) => {
  return src(sourcePath)
      .pipe(sassGlob())
      .pipe(
          sass(sassOptions).on('error', (error) =>  {
                  onError(error.messageFormatted)
              }
          )
      )
      .pipe(autoprefixer(autoprefixerOptions))
      .pipe(rename(path.basename(targetPath)))
      .pipe(purgeCss({ content: [`${templatePath}/**/*.tmpl`] }))
      .pipe(dest(path.dirname(targetPath)));
};

 

Test poprawności instalacji.

 

konsola

yarn bundle-css


17:59:10] Using gulpfile /opt/lampp/htdocs/gulpfile.js

[17:59:10] Starting 'bundleCssProduction'...

[17:59:10] Bundling sixtyfive's css...

[17:59:11] Finished 'bundleCssProduction' after 898 ms

Done in 3.20s.



Skopiowałem podstawowy szablon i odpaliłem builda z pluginem. Pierwszy screen przedstawia plik bez a drugi z pluginem.

CWV (1) 

CWV (2) 

Usunięcie nieużywanych skryptów i styli

frontend/templates/sixtyfive/javascripts/main.js:1:7

// import { initTooltiper } from './tooltiper'
// import { initLightbox } from './lightbox'
// import { initSearchSystem } from './search-system'
// import { initResponsiveTable } from './responsive-table'
import { initFormsAgreement } from './forms-agreement';
import { initMenuDropdown } from './menu-dropdown';
// import { initDragAndDrop } from './drag-and-drop';

 

frontend/templates/sixtyfive/javascripts/main.js:23:29

// initTooltiper()
// initLightbox()
// initSearchSystem()
// initResponsiveTable()
initFormsAgreement()
initMenuDropdown()
// initDragAndDrop()

 

Możliwe problemy ze sliderem

Jeśli występują problemy ze sliderem, należy dodać widoczne poniżej komentarze na początku i końcu pliku “_slider-lite.scss”.

 

frontend/templates/sixtyfive/scss/modules/_slider-lite.scss

/*! purgecss start ignore */
....
/*! purgecss end ignore */

 

Ładowanie wszystkich zewnętrznych skryptów js i arkuszy styli (Jeśli to możliwe) z cdn

Zastępujemy aktualne przypięte skrypty i style ładowane z naszego serwera na takie, które będą ładowane z cdn’a

 

frontend/templates/sixtyfive/views/main.tmpl:44:53

<link
rel="stylesheet"  href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css"
integrity="sha512-yHknP1/AwR+yx26cB1y0cjvQUMvEa2PFzt1c9LlS4pRQ5NOTZFWbhBig+X9G9eYW/8m0/4OXNx8pxJ6z57x0dw=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
defer
>
<link
rel="stylesheet" href="build/main.bundle.css')]}"
>
<link
rel="stylesheet"
href="https://www.krakweb.plfrontend/stylesheets/style_print.css"
media="print"
>

 

frontend/templates/sixtyfive/views/main.tmpl:63:88

<script
src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js"   integrity="sha512-q583ppKrCRc7N5O0n2nzUiJ+suUv7Et1JGels4bXOaMFQcamPk9HjdUknZuuFjBNs7tsMuadge5k9RzdmO+1GQ=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
async
>
</script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"   integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
defer
>
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"
integrity="sha512-XtmMtDEcNz2j7ekrtHvOVR4iwwaD6o/FUJe6+Zq+HgcCsk3kj4uSQQR8weQ2QVj1o0Pk6PwYLohm206ZzNfubg=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
defer
>
</script>
<script 

src="" 

defer

>

</script>
<script 

src="build/main.bundle.js')]}" defer

>

</script>



Dodatkowo dodajemy “preconnecty”.

https://web.dev/uses-rel-preconnect/

 

/templates/sixtyfive/views/main.tmpl:26:27

<link rel="preconnect" href="https://cdnjs.cloudflare.com"  crossorigin>



Optymalizacja metryki CSP (Cumulative Layout Shift)

Dodajemy do każdego tagu “img” atrybut “width”, “height”. Kolejnym krokiem jest ustawienie tzw leniwego ładowania zdjęć, można to zrobić za pomocą biblioteki Lazysizes (https://afarkas.github.io/lazysizes/index.html). Przykładowe użycie poniżej.

 

frontend/templates/sixtyfive/modules/randomPhotos/photo.tmpl

<div class="col-md-6 col-lg-4">
<div class="p-5 d-flex gap-4 flex-column bg-primary">
  <h3 class="text-white font-weight-semibold fs-16 text-overflow-ellipsis"></h3>
  <img class="lazyload w-100"width="347" height="347" data-sizes="auto" src="" alt="" />
  <a href="" class="btn btn-tertiary"></a>
</div>
</div>



Optymalizacja objętości plików css (Zastosowanie zasady DRY)

Jeśli w projekcie korzystamy z biblioteki css  to nie piszmy własnych styli, które najczęściej można zastąpić klasami z danej biblioteki. Mały ułamek tego, co można zrobić poniżej.

Plik html przed optymalizacją

<div class="col-md-6 col-lg-4">
<div class=" randomPhoto">
  <h6 class="randomPhoto__name"></h6>
  <img class="randomPhoto__img" src="" alt="" />
  <a href="" class="btn btn-tertiary"></a>
</div>
</div>

 

Plik css przed optymalizacją

.randomPhoto {
  padding: 2rem;
  display: flex;
  row-gap: 1rem;
  flex-direction: column;
  background-color: $primary;

&__name {
  color: $white;
  font-weight: 600;
  @include font-size(14);
}

&__img {
  width: 100%;
  object-fit: cover;
}
}



Plik html po optymalizacji

<div class="col-md-6 col-lg-4">
<div class="p-5 d-flex gap-4 flex-column bg-primary">
  <h3 class="text-white font-weight-semibold fs-16 text-overflow-ellipsis"></h3>
  <img class="lazyload w-100" width="347" height="347" data-sizes="auto" src="" alt="" />
  <a href="" class="btn btn-tertiary"></a>
</div>
</div>



Plik css po optymalizacji

// Można usunąć





Blog Artykuły
Ustawienia dostępności
Wysokość linii
Odległość między literami
Wyłącz animacje
Przewodnik czytania
Czytnik
Wyłącz obrazki
Skup się na zawartości
Większy kursor
Skróty klawiszowe