Ограничить компоненты / модели Hyperstack только теми, которые необходимы для работы определенной страницы? - PullRequest
1 голос
/ 08 июля 2019

При доступе к какой-либо странице в Hyperstack каждая модель из каталога app / hyperstack / models включается и отправляется в браузер. Ради безопасности и производительности можно ли загружать (автоматически или по какой-либо директиве) только необходимый код для моделей, а не тот, который используется из компонентов?

Может быть, это можно сделать аналогично тому, как политики работают с данными? Поэтому я спрашиваю, существует ли в Hyperstack какая-то политика, ограничивающая код, отправляемый в браузер?

1 Ответ

1 голос
/ 09 июля 2019

Нет хорошего автоматического способа сделать это, но это не слишком много работы для достижения этого. Вам нужно будет создать общий 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

Надеюсь, это поможет!

...