config.aktywa.compile = true w produkcji Rails, dlaczego nie?

Domyślna aplikacja Rails zainstalowana przez rails new mA config.assets.compile = false w produkcji.

Zwyczajnym sposobem 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 włączę config.assets.compile = true do produkcji?

Nie będę już musiał uciekać. To, co ja wierzę stanie się po raz pierwszy, gdy żądany składnik aktywów zostanie skompilowany. Będzie to występowy hit Za pierwszym razem (a to oznacza zazwyczaj potrzebujesz środowiska wykonawczego js w produkcji, aby to zrobić). Ale poza tymi wadami, po tym, jak zasób został leniwie skompilowany, myślę, że wszystkie późniejsze dostęp do tego zasobu będzie miał Nie wydajność aplikacji będzie dokładnie taki sam jak w przypadku wstępnie skompilowanych zasobów po tej początkowej pierwszej hit leniwej kompilacji. Czy to prawda? Czy coś mi umyka? Jakieś inne powody, by nie wprowadzać config.assets.compile = true do produkcji? Jeśli mam JS runtime w produkcji, i jestem skłonny podjąć kompromis obniżonej wydajności dla pierwszy dostęp do aktywów, w zamian za brak konieczności uruchomienia precompile, czy to ma sens?
Author: jrochkind, 2012-01-11

7 answers

Napisałem ten fragment przewodnika.

Zdecydowanie nie chcesz żyć kompilacji w produkcji.

Kiedy masz kompilację, to się dzieje:

Każde żądanie pliku w / assets jest przekazywane do Sprockets. Na pierwsze żądanie dla każdego Zasobu jest kompilowane i buforowane w dowolnym miejscu, którego Rails używa do buforowania (zazwyczaj system plików).

Przy kolejnych żądaniach Sprockets otrzymuje żądanie i musi odszukać nazwę pliku, sprawdź, czy plik(obraz) lub pliki (css i js), które składają się na zasób, nie zostały zmodyfikowane, a jeśli istnieje wersja buforowana, podaj to.

To jest wszystko w folderze assets i W Dowolnych folderach vendor / assets używanych przez wtyczki.

To sporo kosztów, ponieważ, szczerze mówiąc, kod nie jest zoptymalizowany pod kątem szybkości.

Będzie to miało wpływ na to, jak szybko asset przejść przez przewód do klienta, i negatywnie wpłynie na czas ładowania strony z twojego miejscu.

Porównaj z wartością domyślną:

Gdy zasoby są wstępnie skompilowane, a kompilacja jest wyłączona, aktywa są kompilowane i fingerprintowane do public/assets. Sprockets zwraca tabelę mapowania plain do nazw plików fingerprinted do Rails, a Rails zapisuje to do systemu plików. Plik manifestu (YML w Rails 3 lub JSON z randomizowaną nazwą w Rails 4) jest ładowany do pamięci przez Rails przy starcie i buforowany do użycia przez metody pomocnicze zasobów.

To sprawia, że generowanie stron z poprawne odciski palców są bardzo szybkie, a serwowanie samych plików jest szybkie web-server-from-the-filesystem. Oba są znacznie szybsze niż kompilowanie na żywo.

Aby uzyskać maksymalne korzyści z pipeline i fingerprintingu, musisz ustawić dalekosiężne nagłówki na swoim serwerze WWW i włączyć kompresję gzip dla plików JS i css. Sprockets pisze gzipped wersje zasobów, które można ustawić serwer do użycia, eliminując potrzebę, aby to zrobić dla każdego Prośba.

W ten sposób zasoby są wysyłane do klienta tak szybko, jak to możliwe i w możliwie najmniejszym rozmiarze, przyspieszając wyświetlanie stron po stronie klienta i zmniejszając (z odległym nagłówkiem) żądania.

Więc jeśli kompilujesz na żywo to:

  1. bardzo wolno
  2. brak kompresji
  3. Nie ma znaczenia, czy wyświetlane strony będą wyświetlane w czasie renderowania.]}

Kontra

  1. tak szybko, jak to możliwe
  2. skompresowane
  3. Usuń kompresję z serwera (opcjonalnie).
  4. zminimalizuj czas renderowania stron.

Edit: (Odpowiedz na komentarz)

Rurociąg może zostać zmieniony na precompile na pierwsze żądanie, ale są pewne poważne przeszkody. Pierwszą z nich jest to, że musi istnieć tabela wyszukiwania dla nazw odcisków palców lub metody pomocnicze są zbyt wolne. W SENARIO kompilacji na żądanie musiałby być jakiś sposób, aby dołączyć do tabeli wyszukiwania, ponieważ każdy nowy zasób jest kompilowany lub / align = "left" /

Ponadto ktoś musiałby zapłacić cenę powolnej dostawy aktywów przez nieznany okres czasu, dopóki wszystkie aktywa nie zostaną skompilowane i na miejscu.

Domyślna wartość, w której cena kompilacji jest opłacana off-line w tym samym czasie, nie wpływa na odwiedzających i zapewnia, że wszystko działa przed uruchomieniem.

[1]}problem polega na tym, że zwiększa złożoność systemów produkcyjnych.

[Edit, czerwiec 2015] jeśli czytasz to dlatego, że szukasz rozwiązania pozwalającego na powolną kompilację podczas wdrażania, możesz rozważyć prekompilację zasobów lokalnie. Informacje na ten temat znajdują się w asset pipeline guide. Umożliwia to lokalnie prekompilację tylko wtedy, gdy nastąpi zmiana, zatwierdzenie, a następnie szybkie wdrożenie bez etapu prekompilacji.

 265
Author: Richard Hulse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-23 01:47:27

Aby mieć mniej kosztów z Pre-kompilacji rzeczy.

Precompile everything initially with these settings in production.rb
# Precompile *all* assets, except those that start with underscore
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/

Możesz po prostu użyć obrazów i arkuszy stylów jako " / assets / stylesheet.css " w *.html.erb lub " / assets / web.png "

 7
Author: dbKooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 22:21:34

Dla każdego, kto używa Heroku:

Jeśli wdrożysz do Herkou, zrobi to automatycznie podczas wdrażania, jeśli skompilowane zasoby nie są włączone (tzn. public/assets nie zostały zatwierdzone), więc nie ma potrzeby config.assets.compile = true, ani zatwierdzania wstępnie skompilowanych zasobów.

Dokumenty Heroku są tutaj . A CDN jest zalecany do usunięcia obciążenia zasobu hamowni.

 6
Author: William Denniss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-12 11:01:03

To nie będzie to samo co precompilowanie, nawet po pierwszym trafieniu: Ponieważ pliki nie są zapisywane na systemie plików, nie mogą być obsługiwane bezpośrednio przez serwer WWW. Jakiś kod ruby zawsze będzie zaangażowany, nawet jeśli tylko odczyta wpis w pamięci podręcznej.

 1
Author: Frederick Cheung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 15:38:55

Set config.asset.compile = false

Dodaj do swojego Gemfile

group :assets do gem 'turbo-sprockets-rails3' end

Zainstaluj pakiet

Run rake assets:precompile

Następnie uruchom serwer

 1
Author: Mohammed Saleem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 11:36:47

Z oficjalnego przewodnika :

Na pierwsze żądanie zasoby są kompilowane i buforowane zgodnie z opisem w rozwoju powyżej, a nazwy manifestów używane w helperach są zmieniane tak, aby zawierały hash MD5.

Sprockets ustawia również nagłówek HTTP Cache-Control na max-age=31536000. Sygnalizuje to wszystkim pamięci podręcznej między serwerem a przeglądarką klienta, że ta zawartość (obsługiwany plik) może być buforowana przez 1 rok. Efektem tego jest zmniejszenie liczby wniosków o ten zasób z serwera; zasób ma duże szanse na to, że znajdzie się w lokalnej pamięci podręcznej przeglądarki lub w pośredniej pamięci podręcznej.

Ten tryb wykorzystuje więcej pamięci, działa gorzej niż domyślny i nie jest zalecany.

Również krok precompile nie jest problemem, jeśli używasz Capistrano do swoich wdrożeń. Zajmie się tym za Ciebie. You just run

cap deploy

Lub (w zależności od konfiguracji)

cap production deploy
I wszystko gotowe. Jeśli nadal go nie używasz, Gorąco polecam sprawdzam.
 0
Author: Sergio Tulentsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
 0
Author: Aurel Branzeanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-14 15:01:33