是否将Hyperstack组件/模型限制为仅某些特定页面才能工作所需的组件/模型?

时间:2019-07-08 06:20:30

标签: ruby hyperstack

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

也许可以通过类似于数据策略的方式来做到这一点?所以我要问Hyperstack中是否存在某种策略来限制发送到浏览器的代码?

1 个答案:

答案 0 :(得分:1)

没有很好的自动方法可以做到这一点,但要实现这一目标并不需要太多工作。您将必须创建一个共享的JS文件,该文件包含每个页面上使用的所有内容(蛋白石,超级堆栈,反应等),然后为每个页面/单页面应用程序创建一个单独的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'

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') %>

Todo列表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

希望这会有所帮助!