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ąć




Napisz do nas

Wybierz plik

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