📌  相关文章
📜  Rails 公用文件夹项目在生产中不可用 (1)

📅  最后修改于: 2023-12-03 15:34:36.749000             🧑  作者: Mango

Rails 公用文件夹项目在生产中不可用

当我们在Rails项目中进行开发时,经常会使用到一些公共资源,例如前端框架、图片、视频等。为了方便管理这些资源,我们可能会将它们放在一个公用的文件夹中,供整个项目使用。但是,在生产环境中,这样做是有风险的,下面我们来分析一下为什么不可取,并给出解决方案。

问题原因

在Rails项目中,所有的资源文件都会被预编译成为一个或多个静态资源文件,这些文件在生产环境中被压缩、加密,并缓存在浏览器中,以提高页面加载速度。如果我们使用公共文件夹,那么这些资源就会被放到同一个文件夹下,这样的话,所有的资源就只能按同样的方式被压缩和加密,最终合并成一个静态资源文件,如果其中有一个资源文件被修改了,那么整个静态资源文件都会被重新生成,这会影响页面加载速度,并且增加服务器的负担。

解决方案

有两种解决方案可以解决这个问题:

1. 在每个子应用中使用单独的文件夹

首先,我们可以在每个子应用中都使用一个单独的文件夹来存放当前应用所需要的公共资源,这样就可以保证每个子应用的公共资源都是相对独立的,不会相互影响。例如,我们可以在每个子应用中分别创建一个public文件夹,用于存放公共资源,然后在config/environments/production.rb中指定每个子应用的asset_path

config.assets.paths << Rails.root.join('public')
config.assets.paths << Rails.root.join('public', 'subapp1')
config.assets.paths << Rails.root.join('public', 'subapp2')

这样做的好处是,每个子应用的公共资源都是相对独立的,不会发生冲突,而且在部署时也比较容易管理。缺点是,如果一个子应用需要使用另一个子应用中的公共资源,就需要手动复制到当前子应用中,比较繁琐。

2. 使用Rails Engine引擎

另外一个解决方案是,使用Rails Engine引擎,将每个子应用都封装成为一个独立的Gem,并提供组件化的功能。每个子应用的公共资源可以放在该Gem中,以实现公共文件夹的效果。这样做的好处是非常明显的,可以将每个子应用进行分离,更容易进行管理和维护。同时,Rails Engine还支持引用其他引擎的资源,这就使得跨应用访问其他资源变得非常简单。不过,这种方案的缺点就是它需要额外的配置和部署,相对来说比较复杂。关于Rails Engine的具体使用教程,可以参考官方文档。

结论

综上所述,我们不应该在生产环境中使用公共文件夹来存放公共资源,因为这样会导致整个静态资源文件都需要重新生成,增加服务器负担,并且影响页面加载速度。在实际开发中,我们可以通过在每个子应用中使用单独的文件夹或者使用Rails Engine来管理公共资源。这样不仅可以保证独立性,还可以提高开发效率和可维护性。