Звездочки - предварительная компиляция отдельного актива

Я пытаюсь заставить sprokets скомпилировать отдельный автономный актив js, чтобы он уменьшил и уменьшил его и стал частью целых проектов rails.

Мне нужно, чтобы этот js имел имя, не являющееся дайджестом, поэтому оно не изменится (т.е. будет встроено в другие сайты и т. Д.)

Я не могу заставить рельсы (4) / звездочки выполнять мои приказы.

Что я пробовал:

  1. Добавление актива (script.js) в папке misc under assets/javascripts и не загружайте ее в манифест javascript звездочек. Несмотря на то, что это сохраняет его в проекте, оно не уменьшается и не минимизируется и не загружается автоматически через синхронизацию ресурсов.

  2. Попытка добавления другого манифеста под названием scripts-manifest.js в //= require script.js актив, чтобы добавить его путь в пути прекомпиляции в application.rb, но проблема в том, что rails 4 добавляет дайджест ко всем ресурсам, несмотря ни на что (не работает так в rails 3)

  3. Попытался с помощью https://github.com/alexspeller/non-stupid-digest-assets добавить не активную версию ресурса. Возможно, я сделал это неправильно, так как он не работает или ничего не делает..

    Я добавляю инициализатор NonStupidDigestAssets.whitelist = ["script.js"] и попытался поместить его в app/assets/javascripts/misc и в public/, но он все равно не будет работать /

Я читал, что этот драгоценный камень должен помочь в большинстве случаев, и я уверен, что я делаю что-то не так с определением пути или нет, включая его где-то

3 ответа

Один из способов сделать это - добавить инициализатор, который генерирует скомпилированные версии напрямую.

  1. Добавьте свой js-файл в подпапку в /app/assets/javascripts, Не включайте это в application.js поэтому он не добавляется в скомпилированные ресурсы.
  2. Создать инициализатор в /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) }

  3. Включите публичный файл 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, генерация непереваренных активов была удалена (по уважительным причинам), и это простой и прямой способ реализовать желаемое поведение.

Другие вопросы по тегам