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