Нет хорошего автоматического способа сделать это, но это не слишком много работы для достижения этого. Вам нужно будет создать общий JS-файл из всего, что используется на каждой странице (опал, гиперстек, реакция и т. Д.), А затем создать отдельный JS-файл для каждого приложения Page / Single Page.
Вот очень простой пример:
application.js
# app/assets/javascripts/application.rb
require 'webpack/client_only'
require 'components/shared'
Общий JS-файл
# app/hyperstack/components/shared.rb
require 'opal'
require 'webpack/client_and_server'
require 'hyperstack-config'
# etc...
Пользовательская панель SPA:
# app/hyperstack/components/user_dashboard.rb
# Require shared models
require './models/user'
# Require shared components
require_tree './components/user_dashboard'
Todo List SPA:
# app/hyperstack/components/todo_list.rb
# Require shared models
require './models/todo'
require './models/user'
# Require shared components
require_tree './components/todo_list'
Макет HTML панели пользователя
# app/views/layouts/user_dashboard.html.erb
<%= javascript_include_tag('application.js') %>
<%= javascript_include_tag('components/todo_list.js') %>
HTML-макет списка задач
# app/views/layouts/todo_list.html.erb
<%= javascript_include_tag('application.js') %>
<%= javascript_include_tag('components/todo_list.js') %>
То, что я также сделал, чтобы сделать его более динамичным, - это создать вспомогательный метод в контроллере, чтобы определить имя отдельного файла JS для использования на основе контроллера. Это также позволяет при желании использовать только один файл макета:
# app/controllers/application_controller.rb
class ApplicationController
helper_method :spa_asset
def spa_asset
params[:controller]
end
end
# app/views/layouts/application.html.erb
<%= javascript_include_tag('application.js') %>
<%= javascript_include_tag(spa_asset) %>
И тогда наследующий контроллер может переопределить его, если имя файла не совпадает с именем контроллера:
# app/controllers/foo_controller.rb
class FooController
def spa_asset
'todo_list'
end
end
Надеюсь, это поможет!