React 组件将被认为是全局的,因为所有.js将被压缩到一个大的.js文件中。因此,您将不得不考虑一些因素。
首先,在你的 sprockets 文件(通常是application.js)中,你需要告诉 Rails 提供你想要的React 组件。简单的方法是要求组件文件夹中的所有文件夹和文件,因为您的所有组件都将在那里,但组织在子文件夹中。这是添加下一行:
// File: app/assets/javascripts/application.js
//= require_tree ./components
其次,如果你想使用名为Images的React 组件,它可以定义在 中,你可以像往常一样在Rails View中使用帮助器。../components/folder/images.js
react_component('Images')
如果 Images 组件与您在某些服务的.js中定义的Images 组件匹配,React 将找到该组件(但理智的人会期望您在某些images.js中定义了Image 组件),因为这个名称Images是全局的(还记得吗?一个很大的 .js 文件)。 js 文件将被提供)。
使用这种方法,客户端将只下载一个包含所有 React 组件的大 .js 文件。对下载速度不利,但可以缓存。
因此,在这里,您必须小心为所有组件命名,每个组件都使用不同的名称。
现在,例如,如果您有一个名为Foo的组件内部../components/folder/doesnt_matter.js
和另一个具有相同名称的组件Foo,但 inside ../components/another_folder/this_neither.js
,您将必须告诉 Rails 您要为要渲染的特定视图提供哪个文件以规避冲突名称问题.
这意味着,您可以让客户端只下载渲染页面所需的 js 代码(和所需的 React 组件)。它将为每个页面下载 .js 文件,失去缓存的可能性。
一种中间方法是为同一控制器中的所有视图提供一个中等大小的 .js 文件。
为此,您可以组织您的 js(或 jsx,或...),以便为公共组件(用于两个或多个控制器)提供一个位置,并为每个具有特定 React 的控制器提供一个特定文件夹里面的组件。
首先,您必须将之前添加//require_tree ./components
的application.js替换//require ./components/common/
为只为所有视图提供常见的 React 组件。
其次,在您的布局中,您可以提供两个js 文件;一个application.js和一个#{controller_name}.js
(这意味着每个控制器一个特定的 .js 文件)。
第三,对于每个控制器,您将拥有一个同名的.js文件。因此,假设您有一个名为home_controller的控制器,那么您将需要一个home.js(布局视图中的控制器名称助手将使 rails 来查找此文件)并在其中再次使用 sprockets,您将提供特定的 React 组件和//require ./components/home/
通过这种方式,您将不得不照顾您的组织,并且 React 组件名称需要与内部的不同.../components/common/
。
如果您还想更具体一点,您可以在布局中结合使用相同的技术controller_name
和action_name
助手。或者,您可以使用content_for
请求具有视图所需的 React 组件的特定 .js 文件。
但是,您需要小心,因为我不知道资产管道会对您不利。专门使用content_for
.