Rails 上的 Webpacker 用于使用静态 URL 生成 widget.js
Webpacker on Rails for producing widget.js with static URL
我正在为网站构建一个 JS 小部件,这个小部件应该是静态的 url - 例如https://myproduct.com/widget.js
并且我想在其中使用 ES6 功能..(我想以某种方式将编译后的 JS 放入 public/widget.js
)
Webpacker 将代码编译成类似 http://localhost:3000/packs/js/widget-94e8fa5b2be40540f2fb.js
的代码,这在我的情况下效果不佳。
最好的方法是什么?
编译后 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
如果您不关心缓存破坏(或采用其他方法),不想要额外的重定向,希望通过网络服务器提供小部件而不点击 rails 等,您可以在之后复制包编译,定义一个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
我正在为网站构建一个 JS 小部件,这个小部件应该是静态的 url - 例如https://myproduct.com/widget.js
并且我想在其中使用 ES6 功能..(我想以某种方式将编译后的 JS 放入 public/widget.js
)
Webpacker 将代码编译成类似 http://localhost:3000/packs/js/widget-94e8fa5b2be40540f2fb.js
的代码,这在我的情况下效果不佳。
最好的方法是什么?
编译后 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
如果您不关心缓存破坏(或采用其他方法),不想要额外的重定向,希望通过网络服务器提供小部件而不点击 rails 等,您可以在之后复制包编译,定义一个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