3

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

Мне нужно, что это Js иметь не переваривать имя, так что это не изменится (то есть встроенные в другие веб-сайты и т.д.)

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

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

  1. Добавление актива (script.js) в Unders папке различ активов/JavaScripts и не загружать его в звездочках яваскрипта манифеста. Хотя это и удерживает его в проекте, он не получает угасания и минимизацию, и автоматически не загружается через активацию.

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

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

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

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

ответ

1

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

  1. Добавить файл js в подпапку в формате /app/assets/javascripts. Не включайте это в application.js, чтобы он не добавлялся в скомпилированные активы.
  2. Создать инициализатор в /config/initializers, который использует уродовать непосредственно

    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

0

путь вы могли бы сделать это с рельсами 4 является следующее:

  • добавить его в список прекомпиляции config.assets.precompile += %w(your_file_name.js)
  • убедитесь, что он не упоминается в application.js (непосредственно или через require_tree)
  • symlink переваренный файл при развертывании
    • номер manifest.yml для получения фактического filename
    • ln -s digested-filename.js actual-filename.js

, поскольку рельсы 4, генерация не-переваривается активов была удалена (по понятным причинам), и это представляет собой простой и прямой способ реализации желаемого поведения.

+0

есть способ сделать это без символической ссылки? Поскольку я развертываю в heroku –

+0

, я думаю, что это в значительной степени суммирует его: https://github.com/rails/sprockets-rails/issues/49#issuecomment-26020304 – phoet

0

Просто хотел добавить собственное решение, основанное на ответе Кена.

Я создал 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

Смежные вопросы