Приложение Rails по умолчанию, установленное пользователем, rails new
находится config.assets.compile = false
в производстве.
И обычный способ сделать это - запустить rake assets:precompile
перед развертыванием приложения, чтобы убедиться, что все активы конвейера активов скомпилированы.
Так что же произойдет, если я начну config.assets.compile = true
производство?
Мне precompile
больше не нужно бежать . Я верю, что произойдет, когда первый раз запрашивается актив, он будет скомпилирован. Это будет удар по производительности в первый раз (и это означает, что для этого обычно требуется среда выполнения js). Но кроме этих недостатков, после того, как актив был лениво скомпилирован, я думаю , что весь последующий доступ к этому активу не будет иметь никакого снижения производительности, производительность приложения будет точно такой же, как с предварительно скомпилированными активами после этой первоначальной ленивой компиляции первого удара. Это правда?
Я что-то пропустил? Какие-либо другие причины, чтобы не запускать config.assets.compile = true
в производство? Если у меня есть среда выполнения JS в процессе производства и я готов взять компромисс с ухудшением производительности при первом доступе к активу в обмен на отсутствие запуска precompile
, имеет ли это смысл?
Ответы:
Я написал эту часть руководства.
Вы определенно не хотите жить в процессе компиляции.
Когда у вас есть компиляция, вот что происходит:
Каждый запрос файла в / assets передается в Sprockets. При первом запросе для каждого актива он компилируется и кэшируется во все, что Rails использует для кэширования (обычно файловая система).
При последующих запросах Sprockets получает запрос и должен найти имя файла с отпечатками пальцев, проверить, что файл (изображение) или файлы (css и js), составляющие ресурс, не были изменены, а затем, если есть кэшированная версия, выполнить это.
Это все в папке активов и в любых папках vendor / assets, используемых плагинами.
Это много накладных расходов, так как, если честно, код не оптимизирован по скорости.
Это повлияет на скорость передачи активов клиенту и негативно скажется на времени загрузки страницы вашего сайта.
Сравните со значением по умолчанию:
Когда ресурсы предварительно скомпилированы и компиляция выключена, ресурсы скомпилированы и сняты с отпечатком пальца
public/assets
. Sprockets возвращает таблицу сопоставления имен файлов с простым отпечатком в Rails, а Rails записывает это в файловую систему. Файл манифеста (YML в Rails 3 или JSON со случайным именем в Rails 4) загружается в Memory при помощи Rails при запуске и кэшируется для использования вспомогательными методами ресурсов.Это делает создание страниц с правильными отпечатками очень быстрыми, а сами файлы обрабатываются с помощью веб-сервера из файловой системы. Оба значительно быстрее, чем живая компиляция.
Чтобы получить максимальную выгоду от конвейера и снятия отпечатков, вам нужно установить заголовки на будущее на вашем веб-сервере и включить сжатие gzip для файлов js и css. Sprockets записывает сжатые версии ресурсов, которые вы можете настроить на использование своего сервера, избавляя от необходимости делать это для каждого запроса.
Это позволяет клиенту получать активы как можно быстрее и с наименьшим возможным размером, ускоряя отображение страниц на стороне клиента и сокращая (с заголовком в далеком будущем) запросы.
Так что, если вы живете, это:
Против
Изменить: (Ответ, чтобы прокомментировать комментарий)
Трубопровод мог быть изменен на прекомпиляцию по первому запросу, но для этого есть некоторые серьезные препятствия. Во-первых, должна быть таблица поиска для имен с отпечатками пальцев, или вспомогательные методы слишком медленные. В соответствии с senario по требованию компиляции должен быть какой-то способ добавления в таблицу поиска, когда каждый новый ресурс компилируется или запрашивается.
Кроме того, кто-то должен будет заплатить цену медленной доставки активов в течение неизвестного периода времени, пока все активы не будут собраны и введены в действие.
По умолчанию, когда цена компиляции всего платится за один раз в автономном режиме, не влияет на общедоступных посетителей и гарантирует, что все работает до того, как все заработает.
Преодоление заключается в том, что это добавляет много сложности производственным системам.
[Редактировать, июнь 2015 г.] Если вы читаете это, потому что ищете решение для медленного времени компиляции во время развертывания, то вы можете рассмотреть возможность предварительной компиляции ресурсов локально. Информация об этом находится в руководстве по конвейеру активов . Это позволяет вам прекомпилировать локально только при наличии изменений, зафиксировать их, а затем выполнить быстрое развертывание без стадии прекомпиляции.
источник
Чтобы иметь меньше накладных расходов с предварительной компиляцией.
затем вы можете просто использовать изображения и таблицы стилей, например, "/assets/stylesheet.css" в * .html.erb или "/assets/web.png".
источник
Для тех, кто использует Heroku:
Если вы развертываете в Herkou, он будет выполнять прекомпиляцию автоматически для вас во время развертывания, если скомпилированные ресурсы не включены (т.е.
public/assets
не зафиксированы), поэтому нет необходимостиconfig.assets.compile = true
или фиксировать предварительно скомпилированные активы.Документы Heroku здесь . Для удаления нагрузки на ресурс dyno рекомендуется CDN .
источник
Это не то же самое, что прекомпиляция, даже после первого попадания: поскольку файлы не записываются в файловую систему, они не могут обслуживаться непосредственно веб-сервером. Всегда будет задействован некоторый код ruby, даже если он просто читает запись в кэше.
источник
precompile=true
этом скомпилированные ресурсы будут записаны в файловую систему. Ты уверен? Позвольте мне проверить ...tmp/cache
вместо тогоpublic/assets
, чтобы веб-сервер мог видеть, они все равно будут обслуживаться приложением rails, а не веб-сервер. л. это правильно, вы думаете?Устанавливать
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
и запускаю сервер, загрузка страницы происходит без задержек. (Только обработка запроса без компиляции активов)turbo-sprockets-rails3
это необходимо только на Ruby 3Из официального руководства :
Кроме того, этап прекомпиляции не является проблемой, если вы используете Capistrano для своих развертываний. Это позаботится об этом для вас. Ты просто бежишь
или (в зависимости от вашей настройки)
и все готово Если вы все еще не используете его, я настоятельно рекомендую проверить это.
источник
Потому что это открывает уязвимость обхода каталога - https://blog.heroku.com/rails-asset-pipeline-vulnerability
источник