Звездочки - предварительная компиляция отдельного актива
Я пытаюсь заставить sprokets скомпилировать отдельный автономный актив js, чтобы он уменьшил и уменьшил его и стал частью целых проектов rails.
Мне нужно, чтобы этот js имел имя, не являющееся дайджестом, поэтому оно не изменится (т.е. будет встроено в другие сайты и т. Д.)
Я не могу заставить рельсы (4) / звездочки выполнять мои приказы.
Что я пробовал:
Добавление актива (
script.js
) в папке misc under assets/javascripts и не загружайте ее в манифест javascript звездочек. Несмотря на то, что это сохраняет его в проекте, оно не уменьшается и не минимизируется и не загружается автоматически через синхронизацию ресурсов.Попытка добавления другого манифеста под названием
scripts-manifest.js
в//= require script.js
актив, чтобы добавить его путь в пути прекомпиляции вapplication.rb
, но проблема в том, что rails 4 добавляет дайджест ко всем ресурсам, несмотря ни на что (не работает так в rails 3)Попытался с помощью https://github.com/alexspeller/non-stupid-digest-assets добавить не активную версию ресурса. Возможно, я сделал это неправильно, так как он не работает или ничего не делает..
Я добавляю инициализатор
NonStupidDigestAssets.whitelist = ["script.js"]
и попытался поместить его в app/assets/javascripts/misc и в public/, но он все равно не будет работать /
Я читал, что этот драгоценный камень должен помочь в большинстве случаев, и я уверен, что я делаю что-то не так с определением пути или нет, включая его где-то
3 ответа
Один из способов сделать это - добавить инициализатор, который генерирует скомпилированные версии напрямую.
- Добавьте свой js-файл в подпапку в
/app/assets/javascripts
, Не включайте это вapplication.js
поэтому он не добавляется в скомпилированные ресурсы. Создать инициализатор в
/config/initializers
который использует Uglify напрямуюoutput_file = "#{Rails.root}/public/public_script.js"
input_file = "#{Rails.root}/app/assets/javascripts/non_digest/public_script.js"
uglified = Uglifier.compile(File.read(input_file))
File.open(output_file, 'w') {|f| f.write(uglified) }
Включите публичный файл js (в этом примере:
/public/public_script.js
) в макете вашего приложения
Таким образом, у вас есть прямой доступ для внесения пользовательских изменений в то, как uglify обрабатывает ваши js, и расположение файла никогда не меняется для ваших внешних служб, обращающихся к ним.
Я сделал все это локально и проверил, что это работает, используя бета-версию Rails 4.2
Просто хотел добавить свое собственное решение, основанное на ответе Кена.
я создал non_digest.rb
в config/initializers
:
Dir["#{Rails.root}/app/assets/javascripts/non_digest/*"].each do |asset|
asset_name = File.basename(asset)
asset_output = "#{Rails.root}/public/external/#{asset_name}"
asset_uglified = Uglifier.compile(File.read(asset))
File.open(asset_output, 'w') {|a| a.write(asset_uglified) }
end
Не забудьте заглушить файл в javascripts/application.js
, поскольку мы, вероятно, не хотим, чтобы он был скомпилирован с остальной частью нашего JS, и мы можем продолжать использовать //= require_tree .
:
//= stub non_digest/external_bookmarklet
То, как вы будете делать это с помощью направляющих 4, выглядит следующим образом:
- добавить его в список прекомпиляций
config.assets.precompile += %w(your_file_name.js)
- убедитесь, что это не упоминается в
application.js
(напрямую или черезrequire_tree
) - ссылка на переваренный файл при развертывании
- читать
manifest.yml
чтобы получить фактическое имя файла ln -s digested-filename.js actual-filename.js
- читать
начиная с рельсов 4, генерация непереваренных активов была удалена (по уважительным причинам), и это простой и прямой способ реализовать желаемое поведение.