Webpacker на Rails для создания виджета. js с stati c URL - PullRequest
2 голосов
/ 10 февраля 2020

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

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

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

1 Ответ

1 голос
/ 10 февраля 2020

После компиляции веб-упаковщик создает 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

Если вам все равно о кеш-очистке (или использовании другого метода), не хотите дополнительного перенаправления, хотите обслуживать виджет через веб-сервер, не нажимая rails et c., вы можете скопировать пакет после компиляции, определить задачу 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
...