当您访问Hyperstack中的某个页面时,app / hyperstack / models目录中的每个模型都将包括在内并发送到浏览器。为了安全和性能起见,是否可以(自动或通过某些指令)仅加载模型所需的代码,而不加载组件中使用的代码?
也许可以通过类似于数据策略的方式来做到这一点?所以我要问Hyperstack中是否存在某种策略来限制发送到浏览器的代码?
答案 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
希望这会有所帮助!