将 Hyperstack components/models 限制为仅某些特定页面工作所必需的那些?

Restrict Hyperstack components/models to only those necessary for some specific page to work?

当您访问 Hyperstack 中的某个页面时,app/hyperstack/models 目录中的每个模型都会被包含并发送到浏览器。为了安全和性能起见,是否可以(自动或通过某些指令)仅加载模型所需的代码,而不加载组件使用的代码?

也许这可以通过类似于策略适用于数据的方式来完成?所以我想问 Hyperstack 中是否有某种策略限制发送到浏览器的代码?

没有很好的自动方式来执行此操作,但实现此操作并不太费力。您必须为每个页面上使用的任何内容(opal、hyperstack、react 等)创建一个共享 JS 文件,然后为每个 Page/Single 页面应用程序创建一个单独的 JS 文件。


这是一个非常基本的例子:

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'

待办事项列表 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) %>

然后继承controller如果文件名与controller名称不匹配可以重新定义:

# app/controllers/foo_controller.rb

class FooController
  def spa_asset
    'todo_list'
  end
end

希望对您有所帮助!