Domyślna aplikacja Railsów zainstalowana przez rails new
ma config.assets.compile = false
w produkcji.
A zwykłym sposobem na wykonanie czynności jest uruchomienie rake assets:precompile
przed wdrożeniem aplikacji, aby upewnić się, że wszystkie zasoby potoku zasobów są skompilowane.
Co się stanie, jeśli ustawię config.assets.compile = true
produkcję?
Nie będę już musiał biec precompile
. Co ja wierzę stanie się to po raz pierwszy dany składnik aktywów jest wymagane, zostanie skompilowany. Będzie to hit wydajności po raz pierwszy (i oznacza to ogólnie, że potrzebujesz do tego środowiska uruchomieniowego js). Ale oprócz tych wad, po leniwym skompilowaniu zasobu, myślę, że cały późniejszy dostęp do tego zasobu nie będzie miał negatywnego wpływu na wydajność, wydajność aplikacji będzie dokładnie taka sama jak w przypadku wstępnie skompilowanych zasobów po tej pierwszej leniwej kompilacji. czy to prawda?
Czy czegoś mi brakuje? Czy są jakieś inne powody, aby nie wprowadzać do config.assets.compile = true
produkcji? Jeśli mam środowisko uruchomieniowe JS w produkcji i jestem gotów skorzystać z obniżonej wydajności przy pierwszym dostępie do zasobu w zamian za brak konieczności uruchamiania precompile
, czy ma to sens?
Odpowiedzi:
Napisałem ten fragment przewodnika.
Na pewno nie chcesz kompilować na żywo podczas produkcji.
Po kompilacji dzieje się tak:
Każde żądanie pliku w / zasobach jest przekazywane do Sprockets. Na pierwsze żądanie dla każdego zasobu jest on kompilowany i buforowany w cokolwiek, czego Rails używa do buforowania (zwykle system plików).
Przy kolejnych żądaniach Sprockets odbiera żądanie i musi wyszukać nazwę pliku odcisków palców, sprawdzić, czy plik (obraz) lub pliki (css i js), które tworzą zasób, nie zostały zmodyfikowane, a następnie, jeśli istnieje wersja buforowana, obsługuj to.
To wszystko w folderze zasobów i we wszystkich folderach dostawców / zasobów używanych przez wtyczki.
Jest to duże obciążenie, ponieważ, szczerze mówiąc, kod nie jest zoptymalizowany pod kątem szybkości.
Będzie to miało wpływ na szybkość przesyłu danych do klienta i wpłynie negatywnie na czas ładowania strony w Twojej witrynie.
Porównaj z domyślnymi:
Gdy zasoby są wstępnie kompilowane, a kompilacja wyłączona, zasoby są kompilowane i pobierane odciskami palców do pliku
public/assets
. Sprockets zwraca Railsowi tabelę mapowania zwykłych na nazwy plików odcisków palców, a Railsy zapisują to w systemie plików. Plik manifestu (YML w Railsach 3 lub JSON z losową nazwą w Railsach 4) jest ładowany do pamięci przez Railsy podczas uruchamiania i buforowany w celu użycia przez metody pomocnika zasobów.To sprawia, że generowanie stron z prawidłowymi zasobami odcisków palców jest bardzo szybkie, a same serwery plików są szybko obsługiwane przez serwer WWW z systemu plików. Oba są znacznie szybsze niż kompilowanie na żywo.
Aby uzyskać maksymalne korzyści z potoku i pobierania odcisków palców, musisz ustawić dalekosiężne nagłówki na swoim serwerze internetowym i włączyć kompresję gzip dla plików js i css. Sprockets zapisuje skompresowane wersje zasobów, które możesz ustawić dla swojego serwera, eliminując potrzebę, aby robił to dla każdego żądania.
Dzięki temu zasoby są wysyłane do klienta tak szybko, jak to możliwe, w możliwie najmniejszym rozmiarze, przyspieszając wyświetlanie stron po stronie klienta i zmniejszając (przy pomocy nagłówków w przyszłości).
Jeśli więc kompilujesz na żywo, jest to:
Przeciw
Edycja: (odpowiedź na komentarz uzupełniający)
Rurociąg może zostać zmieniony w celu prekompilacji na pierwsze żądanie, ale istnieją pewne poważne przeszkody, aby to zrobić. Po pierwsze, musi istnieć tabela odnośników dla nazw odcisków palców lub metody pomocnicze są zbyt wolne. W senario kompilacji na żądanie musiałby istnieć sposób dołączenia do tabeli odnośników, ponieważ każdy nowy zasób jest kompilowany lub żądany.
Ponadto ktoś musiałby zapłacić cenę powolnego dostarczania aktywów przez nieznany okres czasu, dopóki wszystkie aktywa nie zostaną skompilowane i wdrożone.
Domyślnie, gdy cena kompilacji wszystkiego jest płacona jednorazowo w trybie off-line, nie ma wpływu na odwiedzających i gwarantuje, że wszystko zadziała, zanim wszystko zacznie działać.
Przełomem jest to, że bardzo komplikuje systemy produkcyjne.
[Edytuj, czerwiec 2015 r.] Jeśli czytasz to, ponieważ szukasz rozwiązania na długie czasy kompilacji podczas wdrażania, możesz rozważyć lokalną prekompilację zasobów. Informacje na ten temat znajdują się w przewodniku potoku zasobów . Umożliwia to lokalną prekompilację tylko w przypadku zmiany, zatwierdzenie jej, a następnie szybkie wdrożenie bez etapu prekompilacji.
źródło
Aby mieć mniej kosztów ogólnych dzięki kompilacji wstępnej.
możesz wtedy po prostu użyć obrazów i arkuszy stylów jako „/assets/stylesheet.css” w * .html.erb lub „/assets/web.png”
źródło
Dla każdego używającego Heroku:
Jeśli wdrożysz w Herkou, automatycznie przeprowadzi dla ciebie prekompilację podczas wdrażania, jeśli skompilowane zasoby nie zostaną uwzględnione (tj.
public/assets
Nieconfig.assets.compile = true
zostaną zatwierdzone ), więc nie będzie potrzeby lub nie zostanie zatwierdzone wstępnie skompilowane zasoby.Dokumenty Heroku są tutaj . CDN zaleca się usunąć obciążenie zasobów hamowni.
źródło
Nie będzie to to samo, co prekompilacja, nawet po pierwszym trafieniu: ponieważ pliki nie są zapisywane w systemie plików, nie mogą być obsługiwane bezpośrednio przez serwer WWW. Zawsze zaangażowany będzie jakiś kod ruby, nawet jeśli po prostu czyta wpis z pamięci podręcznej.
źródło
precompile=true
pomocy skompilowane zasoby MUSZĄ zostać zapisane w systemie plików. Jesteś pewny? Pozwól, że sprawdzę ...tmp/cache
raczej na zamiastpublic/assets
, więc nie jest to miejsce, które może zobaczyć serwer WWW, nadal będą obsługiwane przez aplikację railsową, a nie serwer WWW. bla. czy to prawda, myślisz?Zestaw
config.asset.compile = false
Dodaj do swojego Gemfile
group :assets do gem 'turbo-sprockets-rails3' end
Zainstaluj pakiet
Biegać
rake assets:precompile
Następnie uruchom serwer
źródło
config.asset.compile = true in production.rb
plik, ponieważ nie ma dodanego mechanizmu pre-comple. Z tego powodu za każdym razem, gdy uruchamiamy serwer, ładowanie strony zajmuje zbyt dużo czasu (gdy żądanie trafia zarówno do przetwarzania żądania, jak i do kompilacji zasobów). Terazturbo-sprockets-rails3
dołączam do Gemfile i uruchamiam wcześniej polecenie, którerake assets:precompile
kompiluje zasoby. Teraz ustawiamconfig.asset.compile = false in production.rb
i uruchamiam serwer, ładowanie strony bez opóźnień. (Przetwarzanie tylko wniosku bez kompilacji zasobów)turbo-sprockets-rails3
jest to konieczne tylko w Ruby 3Z oficjalnego przewodnika :
Ponadto krok prekompilacji wcale nie jest kłopotliwy, jeśli używasz Capistrano do swoich wdrożeń. Dba o to dla ciebie. Po prostu biegniesz
lub (w zależności od konfiguracji)
i wszystko gotowe. Jeśli nadal go nie używasz, gorąco polecam sprawdzenie.
źródło
Ponieważ otwiera lukę w zabezpieczeniach związanych z przejściem do katalogu - https://blog.heroku.com/rails-asset-pipeline-vulnerability
źródło