config.assets.compile = вірно у виробництві Rails, чому ні?


185

Додаток Rails, встановлений за замовчуванням, rails newуже створено config.assets.compile = false.

І звичайний спосіб зробити це - запустити rake assets:precompileперед розгортанням програми, щоб переконатися, що всі активи конвеєра активів зібрані.

Отже, що станеться, якщо я встановлю config.assets.compile = trueу виробництво?

Мені не потрібно precompileбільше бігати . Я вважаю, що це відбудеться, коли перший запит на актив буде скомпільований. Це буде хітом продуктивності, який вперше (а це означає, що для виробництва цього вам, як правило, потрібен js виконання). Але крім цих недоліків, після того, як актив був ліниво складений, я думаю, що весь наступний доступ до цього ресурсу не матиме жодних результатів, продуктивність програми буде точно такою ж, як і у попередньо складених активів після цієї першої першої лінивої компіляції. це правда?

Що-небудь мені не вистачає? Будь-які інші причини не заводити config.assets.compile = trueу виробництво? Якщо у мене є час виконання JS у виробництві, і я готовий прийняти компроміс з погіршеною роботою для першого доступу до активу, взамін того, що не потрібно працювати precompile, чи має це сенс?


1
Попередження, старіші версії зірочок містять помилку, і якщо config.assets.compile налаштований на істину, існує ризик вразливості переходу між каталогами ( blog.heroku.com/rails-asset-pipeline-vulnerability )
Mauro

Саме так має працювати Stackoverflow. Добре написане запитання та добре написана відповідь. Я люблю тебе і оп, і @ richard-hulse.
schmijos

Відповіді:


259

Я написав цей біт путівника.

Ви точно не хочете жити компілювати у виробництві.

Коли ви компілюєте, це відбувається:

Кожен запит на файл у / активах передається до Зірочок. За першим запитом для кожного активу він компілюється та кешується в будь-якому Rails, який використовується для кешу (зазвичай файлова система).

При наступних запитах Зірочки отримують запит і повинні шукати відбиток файлу з ім'ям пальця, переконайтесь, що файл (зображення) або файли (css та js), що складають актив, не були змінені, а потім, якщо є кешована версія, служать цьому.

Це все в папці активів і в будь-яких папках постачальників / активів, які використовуються плагінами.

Це багато накладних витрат, оскільки, чесно кажучи, код не оптимізований для швидкості.

Це матиме вплив на швидкість переходу активу по клієнту та негативно вплине на час завантаження сторінки вашого сайту.

Порівняйте із замовчуванням:

Коли активи попередньо компілюються, а компіляція вимкнена, активи збираються та відбивають пальці на public/assets. Зірочки повертають таблицю відображення простої до відбитків файлів файлів до Rails, і Rails записує це у файлову систему. Файл маніфесту (YML в Rails 3 або JSON з рандомізованим іменем в Rails 4) завантажується в пам'ять Rails при запуску і кешується для використання методами помічників активів.

Це робить генерацію сторінок з правильними відбитками даних дуже швидкими, а обслуговування самих файлів - швидким веб-сервером із файлової системи. Обидва значно швидше, ніж компіляція в реальному часі.

Щоб отримати максимальну перевагу конвеєра та відбитків пальців, вам потрібно встановити дальші майбутні заголовки на веб-сервері та ввімкнути стиснення gzip для js та css-файлів. Sprockets записує gzipped версії об’єктів, якими ви можете встановити ваш сервер на використання, усуваючи необхідність цього робити для кожного запиту.

Це допоможе клієнту вивести активи максимально швидко та в найменшому розмірі, прискоривши відображення сторінок на клієнті та зменшивши (з подальшим майбутнім заголовком) запити.

Тож якщо ви збираєтеся жити, це:

  1. Дуже повільно
  2. Не вистачає стиснення
  3. Це вплине на час візуалізації сторінок

Проти

  1. Якнайшвидше
  2. Стиснута
  3. Видаліть підслуховування стиснення з сервера (необов’язково).
  4. Мінімізуйте час візуалізації сторінок.

Редагувати: (Відповідь на коментар)

На перший запит трубопровід може бути змінений на попередній збір, але для цього є деякі основні перешкоди. Перший полягає в тому, що повинна бути таблиця пошуку для відбитків імен з відбитками пальців або помічники методів є занадто повільними. Під час сенаріу на компіляцію за запитом потрібно було б додати спосіб додати до таблиці пошуку, коли кожен новий актив збирається або запитується.

Крім того, хтось повинен буде платити ціну повільної доставки активів за невідомий проміжок часу, поки всі активи не будуть зібрані та встановлені.

За замовчуванням, коли ціна складання всього оплачується за один раз, не впливає на публічних відвідувачів і гарантує, що все працює, перш ніж все вийде наживо.

Укладення угод полягає в тому, що це додає багато складності виробничим системам.

[Редагувати, червень 2015] Якщо ви читаєте це, тому що ви шукаєте рішення для повільного часу компіляції під час розгортання, ви можете розглянути можливість попереднього компілювання активів на локальному рівні. Інформація про це міститься в посібнику з конвеєра активів . Це дозволяє виконувати попередню компіляцію на локальному рівні лише тоді, коли відбудеться зміна, зробити це, а потім швидко розгортатись без етапу попереднього компіляції.


1
Дякую, я прийняв вашу відповідь. Але зараз моє запитання: гаразд, це зараз не роблять, але, можливо, ви вважаєте, що трубопровід Asset міг би мати особливість, де він ліниво збирається за першим запитом, роблячи це точно так само, як докомпіляція, включаючи запис до ./public та оновлення маніфест відбитка?
jrochkind

Дивись вище. Це питання, тому що Capistrano не працює для вас?
Річард Хулз

Я не використовую Capistrano. Мені раніше не потрібно було, додаткові складності не вартували. Можливо, трубопровід активів - це солома, яка ламає верблюдів назад і вимагає цього. На вашу думку, чи неможливо керувати розгортаннями Rails за допомогою конвеєра активів без капітального чи подібного? Прикро, що для простих налаштувань це не було великою проблемою робити це вручну.
jrochkind

Вам справді потрібен Capistrano для Rails 3.1. Активи збираються в новому загальнодоступному каталозі, поки ваша стара програма ще працює. Коли компіляція виконана, нова версія посилається на зв’язок і сервер перезавантажується автоматично.
Річард Хулз

"Щоб отримати максимальну перевагу в конвеєрі та відбитках пальців, вам потрібно встановити далекі майбутні заголовки на веб-сервері та включити gzip-стиснення для js та css-файлів." це?
Ісаак Бетеш

7

Щоб мати менше накладних витрат з попередньою компіляцією.

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

тоді ви можете просто використовувати зображення та таблиці стилів як "/assets/stylesheet.css" у * .html.erb або "/assets/web.png"


6

Для всіх, хто використовує Heroku:

Якщо ви будете розгортатися в Herkou, він виконає попередній компіляцію для вас автоматично під час розгортання, якщо складені активи не включені (тобто public/assetsне здійснені), тому не потрібно config.assets.compile = trueабо виконувати попередньо складені активи.

Документи Героку тут . CDN рекомендується зняти навантаження на дино ресурс.


1

Це не буде аналогічно попередньому компілюванню навіть після першого введення: оскільки файли не записуються у файлову систему, вони не можуть бути безпосередньо подані веб-сервером. Деякий рубіновий код завжди буде задіяний, навіть якщо він просто читає запис кеша.


Гм, я думав, що з precompile=true, складені активи БУДЬ записуватися у файлову систему. Ти впевнений? Дозвольте перевірити ...
jrochkind

1
Ба, я думаю, ти маєш рацію - вони написані у файловій системі, але це схоже на, tmp/cacheа не public/assets, тому не місце, яке бачить веб-сервер, вони все ще будуть обслуговуватися додатком рейки не веб-сервер. бла. це правильно, ви думаєте?
jrochkind

Правильно. Не буде так швидко, як веб-сервер підбирає їх прямо. Можливо, не важливо, якщо ви поставите компакт-диск на зразок хмари перед вашим додатком
Frederick Cheung

1

Встановити config.asset.compile = false

Додайте до свого Gemfile

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

Встановіть комплект

Біжи rake assets:precompile

Потім запустіть ваш сервер


Наскільки я встановив config.asset.compile = true in production.rbфайл, тому що немає механізму попереднього завершення. Завдяки цьому кожен раз, коли ми запускаємо сервер, потрібно занадто багато часу для завантаження сторінки (Коли запит потрапляє і на обробку запиту, і на збирання активів). Тепер я включений turbo-sprockets-rails3у Gemfile і запускаю команду, яка попередньо rake assets:precompileзбирає активи. Тепер я встановлюю config.asset.compile = false in production.rbі запускаю сервер, завантажуючи сторінку без будь-якої затримки. (Лише обробка запиту без складання активів)
Mohammed Saleem

2
Варто сказати, що turbo-sprockets-rails3це потрібно лише на Ruby 3
Andre Figueiredo

0

З офіційного довідника :

За першим запитом активи збираються та кешуються, як зазначено у розробці вище, а імена маніфестів, які використовуються у помічниках, змінюються, щоб включити хеш MD5.

Зірочки також встановлюють HTTP-заголовок Cache-Control на max-age = 31536000. Це сигналізує всім кешам між вашим сервером та клієнтським браузером про те, що цей вміст (файл, що подається) може кешуватися протягом 1 року. Результатом цього є зменшення кількості запитів на цей актив від вашого сервера; актив має хороші шанси опинитися в локальному кеші браузера або в якомусь проміжному кеші.

Цей режим використовує більше пам'яті, працює бідніше, ніж за замовчуванням, і не рекомендується.

Крім того, крок перед компіляцією зовсім не складе проблем, якщо ви використовуєте Capistrano для своїх пристроїв. Він дбає про це за вас. Ти просто біжиш

cap deploy

або (залежно від налаштувань)

cap production deploy

і ти все налаштований. Якщо ви все ще не використовуєте його, настійно рекомендую перевірити його.


Тож ви вважаєте, що мова з офіційного довідника зі мною погоджується? Я бачив цей посібник, я не зовсім впевнений, чи означає це те, що я пропоную вище, що ви думаєте? Це моє запитання.
jrochkind

Так, ви говорите в основному те саме. Я пропоную вам не включати живу компіляцію.
Серхіо Туленцев

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.