Webpacker на Rails для создания widget.js со статическим URL

Я работаю над созданием JS-виджета для веб-сайтов, и этот виджет должен иметь статический URL-адрес - например, https://myproduct.com/widget.js и я хочу использовать в нем мощность ES6 .. (Я бы хотел как-то добавить скомпилированный JS в public/widget.js )

Webpacker компилирует код в что-то вроде http://localhost:3000/packs/js/widget-94e8fa5b2be40540f2fb.js что не очень хорошо в моем случае.

Каков наилучший способ сделать это?

Всего 1 ответ


После компиляции webpacker создает public/packs/manifest.json с информацией о том, как точные имена файлов.

В контроллере вы можете получить информацию из манифеста и перенаправления:

# get 'widget', to: 'some_controller#widget'
def widget 
  path = helpers.current_webpacker_instance.manifest.lookup!('widget', type: :javascript) # => "/packs/js/widget-94e8fa5b2be40540f2fb.js"
  redirect_to path
  # also here you can calculate path and use send_data
end

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

task 'copy_my_widget' => :environment do
  manifest = JSON.parse(File.read(Rails.root.join('public/packs/manifest.json')))
  pack_path = Rails.root.join('public', '.' + manifest['widget.js'])
  FileUtils.cp(pack_path, Rails.root.join('public', 'widget.js'))
end

Rake::Task["webpacker:compile"].enhance do
  Rake::Task["copy_my_widget"].invoke
end

Есть идеи?

10000