Dzisiaj opowiem o problemie, z którym na pewno się spotkałeś jeśli stworzyłeś jakąś aplikację internetową.
Opowiem też jak można rozwiązać problem z użyciem ASP.NET Core i kiedy warto rozważyć użycie nowego sposobu.
Chodzi o dołączanie bibliotek javascript, które w tradycyjnej formie wygląda w ten sposób:
W pokazanym kodzie tworzymy element języka HTML o nazwie script z atrybutem src, który definiuje lokalizację pliku z kodem JavaScript.
W naszym przypadku dołączamy do strony bibliotekę jquery stworzoną przez Johna Resiga. Przy okazji polecam świetną książkę o języku JavaScript: Tajemnice JavaScriptu. Podręcznik Ninja
Dodatkowo jak widać, skorzystaliśmy z biblioteki umieszczonej na serwerze CDN Zamiast pobierać bibliotekę jQuery z internetu i dołączać do naszego projektu. W tym drugim przypadku nasz kod mógłby wyglądać następująco:
A więc mamy dwie opcje a oba podejścia mają swoje zalety.
1) pobrać skrypt i dołączyć do projektu
- bezpieczeństwo - posiadamy kontrolę nad zawartością pliku - nikt jej nie podmieni bez naszej wiedzy (atak typu man in the middle)
- niezawodność - CDN może być w danym momencie niedostępny. Wówczas przy założeniu, że korzystamy w projekcie z biblioteki jQuery to w efekcie cała nasza strona może przestać działać.
2) skorzystać ze zdalnej lokalizacji
- nie musimy pobierać pliku z internetu
- mniejsze obciążenie naszego serwera, ponieważ plik jest serwowany z zewnętrznej lokalizacji
- Szybkość - istnieje szansa, że przeglądarka użytkownika naszej aplikacji posiada już w swojej pamięci tak popularną bibliotekę jaką jest jQuery. Taki scenariusz zakłada, że użytkownik wcześniej korzystał ze strony, która posiadała odwołanie do tej samej lokalizacji na CDN.
Dotychczas trzeba było wybierać: albo opcja 1 albo opcja 2. Okazuje się, że możemy skorzystać ze wszystkich wymienionych wyżej zalet obu podejść(no może poza zabezpieczeniem się przed atakiem man-in-the-middle). Otóż z pomocą przychodzi język ASP.NET Core i jego klasa
Nowa, przełomowa konstrukcja wygląda tak:
Jak to działa?
Kiedy nie zadziała pobranie biblioteki ze lokalizacji: "https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js", to następuje załadowanie jej z alternatywnej lokalizacji, czyli "~/lib/jquery/dist/jquery.min.js". Atrybut asp-fallback-test pozwoli nam sprawdzić, czy biblioteka załadowała się z lokalizacji "https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js". Wiadomo, że window.jQuery przyjmie wartość undefined kiedy biblioteka nie załaduje się prawidłowo. Wówczas załadowany zostanie skrypt z alternatywnego źródła oznaczonego atrybutem asp-fallback-src.
Myślę, że warto korzystać z tej konstrukcji w projektach ASP.NET Core.
Jednak odradzałbym to w przypadkach kiedy kluczowe są względy bezpieczeństwa, kiedy powinniśmy całkowicie zrezygnować z CDN na rzecz lokalnych plików.
Opowiem też jak można rozwiązać problem z użyciem ASP.NET Core i kiedy warto rozważyć użycie nowego sposobu.
Chodzi o dołączanie bibliotek javascript, które w tradycyjnej formie wygląda w ten sposób:
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js">
W pokazanym kodzie tworzymy element języka HTML o nazwie script z atrybutem src, który definiuje lokalizację pliku z kodem JavaScript.
W naszym przypadku dołączamy do strony bibliotekę jquery stworzoną przez Johna Resiga. Przy okazji polecam świetną książkę o języku JavaScript: Tajemnice JavaScriptu. Podręcznik Ninja
Dodatkowo jak widać, skorzystaliśmy z biblioteki umieszczonej na serwerze CDN Zamiast pobierać bibliotekę jQuery z internetu i dołączać do naszego projektu. W tym drugim przypadku nasz kod mógłby wyglądać następująco:
<script src="~/lib/jquery/dist/jquery-2.2.0.min.js">
A więc mamy dwie opcje a oba podejścia mają swoje zalety.
1) pobrać skrypt i dołączyć do projektu
- bezpieczeństwo - posiadamy kontrolę nad zawartością pliku - nikt jej nie podmieni bez naszej wiedzy (atak typu man in the middle)
- niezawodność - CDN może być w danym momencie niedostępny. Wówczas przy założeniu, że korzystamy w projekcie z biblioteki jQuery to w efekcie cała nasza strona może przestać działać.
2) skorzystać ze zdalnej lokalizacji
- nie musimy pobierać pliku z internetu
- mniejsze obciążenie naszego serwera, ponieważ plik jest serwowany z zewnętrznej lokalizacji
- Szybkość - istnieje szansa, że przeglądarka użytkownika naszej aplikacji posiada już w swojej pamięci tak popularną bibliotekę jaką jest jQuery. Taki scenariusz zakłada, że użytkownik wcześniej korzystał ze strony, która posiadała odwołanie do tej samej lokalizacji na CDN.
Dotychczas trzeba było wybierać: albo opcja 1 albo opcja 2. Okazuje się, że możemy skorzystać ze wszystkich wymienionych wyżej zalet obu podejść(no może poza zabezpieczeniem się przed atakiem man-in-the-middle). Otóż z pomocą przychodzi język ASP.NET Core i jego klasa
ScriptTagHelperzdefiniowana w przestrzeni nazw
Microsoft.AspNetCore.Mvc.TagHelpers.
Nowa, przełomowa konstrukcja wygląda tak:
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js" asp-fallback-src="~/lib/jquery/dist/jquery.min.js" asp-fallback-test="window.jQuery"> </script>
Jak to działa?
Kiedy nie zadziała pobranie biblioteki ze lokalizacji: "https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js", to następuje załadowanie jej z alternatywnej lokalizacji, czyli "~/lib/jquery/dist/jquery.min.js". Atrybut asp-fallback-test pozwoli nam sprawdzić, czy biblioteka załadowała się z lokalizacji "https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js". Wiadomo, że window.jQuery przyjmie wartość undefined kiedy biblioteka nie załaduje się prawidłowo. Wówczas załadowany zostanie skrypt z alternatywnego źródła oznaczonego atrybutem asp-fallback-src.
Myślę, że warto korzystać z tej konstrukcji w projektach ASP.NET Core.
Jednak odradzałbym to w przypadkach kiedy kluczowe są względy bezpieczeństwa, kiedy powinniśmy całkowicie zrezygnować z CDN na rzecz lokalnych plików.
Bardzo ciekawy wpis Darek (jak i cały blog), liczę na więcej tematów związanych z .NET Core.
OdpowiedzUsuńPozdrawiam, Adam Dratwa