Witaj na blogu prowadzonym przez Sebana. Spisuję tutaj swoje uwagi na różny temat. Przeważają tematy związane z Internetem, popieranymi przeze mnie rozwiązaniami dotyczącymi wykorzystania komputerów, oraz kilka innych.

Ruby on Rails asset packager

02 lipca 2009 | Klucze: Ogólne, programowanie, rails, ruby, Techblog
3 komentarze. trackback

Kazdy serwis internetowy, który zdobył popularność w sieci w końcu staje przed problemem wydajności. Problem często daje się dość prosto rozwiązać, stosując proste zasady opisane chociażby w książce Steve Soundersa High Performance Web Sites. Głównym przesłaniem jest: zmniejsz ilość żądań wysyłanych do twojego serwera. Przeglądarka wysyła żądanie za każdym razem, gdy musi coś pobrać z serwera. Plik html, css, js, jpg, ... Dla każdego obrazka, arkusza stylu, skryptu JavaScript wyśle żądanie. Im mniej będzie żądań tym szybciej klient zobaczy stronę. Logiczną wydaje się potrzeba minimalizacji ilości plików JS lub CSS. Chcę pokazać plugin do Ruby on Rails asset_packager, który potrafi spakować dla nas pliki CSS i JS w jeden duży.

Plugin ma w zasadzie prostą ideę: złącz pliki w jeden i usuń to co nie jest w nich potrzebne (komentarze etc.). Jednak nie jest to taki zwykły prosty skrypcik do łączenia plików. Plugin ma możliwość tworzenia wielu paczek z plików, które zostaną mu wskazane. Takie ustawienia pluginu zapisane w pliku config/asset_packager.yml sprawią, że zostaną utworzone dwie paczki dla JavaScriptu i stylów. Pierwsza paczka JS "base" składa się z pięciu plików, druga "secondary" z dwóch. Pojedyńczy plik CSS/JS może znajdować się w wielu paczkach. Możemy serwować różne paczki dla zalogowanych użytkowników i inne dla niezalogowanego użytkwonika odwiedzającego stronę. Taką polityke stosuje serwis pomagający zarzadzać finansami - benefi.pl. Złączone paczki nie są generowane w locie kiedy trzeba, należy je utworzyć ręczkie poprzez odpowiednie zadanie rake: rake assets:build_all. W layoutcie należy użyć helpera javascript_include_merged i stylesheet_link_merged.

Wrzucanie takich połączonych paczek do repozytorium i przebodowywanie ich za każdym razem gdy zmienimy cokolwiek w CSS lub JS to jakieś nieporozumienie i aż prosi się o sytuację "zapomniałem przebudować pliki". Zamiast tego proponuję dodać małe zadanie do Capfile: Zadanie będzie wykonywało się automatycznie zawsze gdy zrobimy deploy aplikacji na zdalny serwer. Proste i przyjemne.


KOMENTARZE

03 lipca 2009 | Piotr Sarnacki |

Kiedyś używałem asset packagera, ale teraz wolę smurfa - http://github.com/thumblemonks/smurf/tree/master . Określanie każdej paczki w oddzielnym pliku może być bardzo męczące. Pół biedy jeżeli pakujesz wszystkie wymagane skrypty do jednego pliku. Niestety często waga javascriptów (nawet spakowanych) przekraczas kilkaser kb i jeżeli jakiś plik jest stosowany tylko na kilku stronach, to nie opłaca się go wrzucać wszędzie, tylko na te kilka stron. Dlatego najlepiej pisać jak najbardziej modularne skrypty rozbite na mniejsze pliki.

Tylko wtedy można się pociąć używając asset packagera. Dlatego lepszy jest smurf, który pakuje javascripty i stylesheety całkowicie transparentnie.

W moim forku smurfa wrzuciłem YUI compressor, który daje trochę lepsze wyniki niż to co jest zastosowane w oficjalnej wersji: http://github.com/drogus/smurf/tree/master

03 lipca 2009 | Seban |

Dzięki, tego nie sprawdzałem. Ja jestem zadowolony z asset_packagera, ale smurfa też teraz sprawdzę

05 lipca 2009 | Damian Legawiec |

Również używam smurfa i polecam - bardzo dobrze się integruje z railsami i po prostu nie wchodzi w drogę. I zero klepania yamlów ;)