Подтвердить что ты не робот

Rake assets: прекомпиляция для конкретного JS файла

Можно ли запустить rake assets:precompile для конкретного файла JavaScript?

В противном случае полная прекомпиляция длится 5 минут и очень быстро меняет файлы JavaScript.

4b9b3361

Ответ 1

Короткие: вы не можете.

Во время предварительной компиляции Rails проходит через файл Application.js и объединяет весь импорт в один, поэтому просто изменение одного файла просто невозможно из-за сжатия, которое происходит там. (Он ничего не делает для файлов, не связанных с application.js)

Далее: вам не нужно запускать рейк-активы: прекомпиляция во время разработки при выполнении быстрых исправлений. Только при развертывании (в зависимости от вашего терпения) не должно быть проблем с запуском задачи 5 минут.

Вы должны использовать среду разработки во время разработки, где предварительная компиляция активов не требуется, так как Rails будет обслуживать активы, не связанные и не профинансированные. Если вы запускаете сборку Rails на веб-сервере через rails s, это должно быть по умолчанию, но вы можете явно запустить сервер рельсов, используя:

rails s RAILS_ENV=development

Если активы еще не отображаются правильно или вы видите ошибки, убедитесь, что у вас есть config.assets.debug = true

Ответ 2

Если вы хотите предварительно скомпилировать только один файл, вы можете сделать обычную задачу рейка, чтобы сделать это довольно легко.

namespace :assets do

  desc "compile one js file"

  task :compile_one_file => :environment do
    dest = "#{Rails.root}/vendor/assets/javascripts/compiled/"
    js_asset = "your_jsfile.js"
    File.write(dest + js_asset, Uglifier.compile(Rails.application.assets.find_asset(js_asset).to_s))
  end

end

затем из командной строки

rake assets:compile_one_file

Надеюсь, что это поможет, я нахожу это полезным для файлов js поставщиков, которые я не часто меняю, таких как jquery и jquery plugins. Таким образом, когда он развивается, он ускоряет загрузку моей страницы, не позволяя конвейеру активов трассировать все отдельные запросы для моих файлов поставщиков. Он просто обслуживает один миниатюрный файл js всех моих поставщиков js.

Ответ 3

@Тигрень является частично правильной. Активы Rails 3.1+ предназначены для полного управления Rails, и по умолчанию все активы будут скомпилированы до одного js и одного актива css.

ОДНАКО...

Компиляция до одного актива зависит от использования манифеста ресурса (application.js и application.css), который обрабатывается драгоценным камнем Sprockets. По умолчанию эти манифесты включают директиву require_tree и эту директиву, которая включает все файлы. Если вы удалите эту директиву, вам нужно немного поработать, чтобы скомпилировать ваши ресурсы.

Если вы хотите создать отдельные активы, вы можете установить опцию config в приложении .rb.

config.assets.precompile += %w( additional/asset.css funky/stuff.js )

Вышеприведенная строка добавит файлы дополнительные /asset.css и funky/stuff.js в список файлов, которые будут создаваться, когда ресурсы предварительно скомпилированы (обратите внимание, что '+ =' используется для расширения значений по умолчанию список). Чтобы быть максимально явным, это означает, что у вас будет четыре скомпилированных актива: application.js, funky/stuff.js, application.css и дополнительные /asset.css.

Тем не менее, вы можете проверить драгоценный камень guard-rails-assets. Жемчуг является гибким в том, как он поддерживает предварительную компиляцию; возможна предварительная компиляция только измененных активов. Я слышал хорошие отзывы об этом, но не использовал его сам.

Ответ 4

@Tigraine неверна.

Возможно, вам просто нужно создать папки и поместить в них файлы css и импортировать их в разные файлы в папке с ресурсами.

Как

application.css
 *= require_self
 *= require foundation_and_overrides
 *= require reset
 *= require_tree ./screen

Где Экран - это папка, которую я разместил внутри папки стилей. как assets/stylesheets/screen/. Я вызываю application.css с

<%= stylesheet_link_tag    "application", media: "screen, projection" %>

Теперь, если вы хотите создать один файл css для другого макета, вы создаете его под assets/stylesheets

Как xxx.css

Если вам нужно несколько файлов для xxx, вы выполняете те же действия, что и выше, но важная часть здесь заключается в том, что вы добавляете эту строку в

production.rb

config.assets.precompile += %w( xxx.css )

Затем внутри макета вы добавляете:

<%= stylesheet_link_tag    "xxx", media: "screen, projection" %>

Ответ 5

Вы можете сделать это полностью без Rails. Это может ускорить работу в зависимости от вашей среды.

quick_compile.rb

require 'sprockets'

sprocket =  Sprockets::Environment.new
sprocket.js_compressor = :uglifier # or read off config yml
sprocket.append_path('app/assets/javascripts') # the directory that holds you js src.

file = File.new('test_min.js','w+') # the output file path.
file.puts(sprocket.find_asset('test.js')) # the file to complie
file.close

Если вы хотите просто проверить оператор // = require, вы можете удалить настройку js_compressor. Звездочка объединит необходимые файлы.