构建 Rails 和 Angular 应用程序
Structuring a Rails and Angular app
我想使用 Rails 4 和 Angular 和Capistrano 用于部署过程。
我希望所有前端都成为 Amazon S3 上的静态应用程序,但我对其他建议持开放态度。
对我来说重要的是一个能够轻松扩展的快速开发过程。
我想知道我应该使用什么是最好的结构:
将所有资产保留在 app/assets 中并将 Bower 路径设置为供应商目录。
这样我就可以使用 rails 预编译方法并享受 index.html 的 Rails html 标签,但我相信将它上传到 S3 并保持分离会很容易.
将包括 Bower 组件在内的所有资产保留在 public/app 目录中,这将使它成为一个完整的独立应用程序,但我需要使用Grunt 或任何其他用于预编译资产的服务。
还有其他想法吗?
首先,我觉得这里有点混乱,让我试着把它弄清楚。
有几种方法可以实现这一点
- 纯客户端 -> API
当您拥有静态应用程序时,无需通过 Rails 资产管道,当您使用客户端应用程序工具时,有更好的方法来管理资产。
例如,您的客户端应用程序将是一个 Angular 应用程序,您将结合使用 bower(依赖项)和 grunt(构建和分发)来管理资产。
没有必要使用 Capistrano 部署到 S3,如果它是纯静态应用程序,您可以使用 aws CLI 以便仅上传您的内容。
我也会通过 CDN。 Fastly 之类的东西在 Amazon S3 上运行得非常好。
我有一个上传到 S3 的 Rake 任务,然后在 Fastly 上清除缓存(如果我需要的话)。
至于您的 Rails 应用程序,它将充当 API,它不应该有任何资产
- 合并
如果您有一个组合应用程序,一些操作由服务器提供 (Rails),并且只调用一些客户端代码 (Angular)。
如果是这种情况,我会通过 Rails 资产管道,并将所有内容都保持为 Rails 编译预部署等的最佳实践...
这是 "it depends" 确实是答案的问题之一,这完全取决于您想要实现的目标。
当我有一个客户端应用程序时,我尝试拥有一个纯客户端,而服务器仅作为一个 API,根本没有任何资产,这样,我就把关注点分开了。
编辑 2015 年 9 月 9 日
我不得不说,只要您可以,我都会将应用程序分开。
这并不总是可行的,尤其是对于更复杂的应用程序。
最近几个月我看到的大多数应用程序都将客户端和服务器端代码分开,我看到较少使用 rails 而更多使用 rails-api 正因为如此(有些人甚至完全放弃 rails 以获得更薄的解决方案)。
根据我的经验,我发现这种方法非常有效:
- API 应用程序 (Rails/Sinatra/Grape/Node/whatever) 仅提供 JSON APIs。部署到服务器,比如 api.yourapp.com。服务 Access-Control headers.
- 静态网络应用程序:首先使用 yeoman 生成 AngularJS、Gulp、Bower 应用程序。使用 gulp aws deploy 模块部署到 S3。
没有真正的理由在同一个应用程序中同时拥有视图和 API 或使用相同的技术构建(如 Rails)。
现在有问题:
- S3 不能很好地支持 Angular 的 HTML5 模式 URLs。所以纯 S3 网站不是一个选项。
- Facebook 不会读取不在页面源中的 OpenGraph 标签。
- 无法确定 Google/SEO 和 Angular 应用程序的状态。我没有看到搜索结果中的内容。
因此,作为解决方案,我引入了另一个网络服务器应用程序。可以基于任何东西——纯机架、节点等。我选择了机架。
问题解决方案:
- Web 服务器应用托管在 www.yourapp.com 上并代理(和缓存)对 S3 的请求。它支持所有 URLs (html5Mode) - 只是代理到 index.html.
- OpenGraph 元标记 - API 有一个端点获取 URL 或 object 和 returns 元标记信息的 ID。 Web 服务器每 URL 向 API 发出一次请求(缓存响应)并将其注入所服务的 index.html.
- SEO - 作为中间件,用于在服务器上呈现页面的机架的预渲染。
作为奖励 -
如今大多数应用程序都有着陆 page/marketing 站点和实际应用程序。有时最好将它们分开维护。 Web 服务器根据 cookie 知道要在 www.yourapp.com 上显示哪个应用程序 - 实际应用程序或营销网站。登录时 - 在客户端设置一个 cookie 瞧。
我想使用 Rails 4 和 Angular 和Capistrano 用于部署过程。 我希望所有前端都成为 Amazon S3 上的静态应用程序,但我对其他建议持开放态度。 对我来说重要的是一个能够轻松扩展的快速开发过程。
我想知道我应该使用什么是最好的结构:
将所有资产保留在 app/assets 中并将 Bower 路径设置为供应商目录。 这样我就可以使用 rails 预编译方法并享受 index.html 的 Rails html 标签,但我相信将它上传到 S3 并保持分离会很容易.
将包括 Bower 组件在内的所有资产保留在 public/app 目录中,这将使它成为一个完整的独立应用程序,但我需要使用Grunt 或任何其他用于预编译资产的服务。
还有其他想法吗?
首先,我觉得这里有点混乱,让我试着把它弄清楚。
有几种方法可以实现这一点
- 纯客户端 -> API
当您拥有静态应用程序时,无需通过 Rails 资产管道,当您使用客户端应用程序工具时,有更好的方法来管理资产。
例如,您的客户端应用程序将是一个 Angular 应用程序,您将结合使用 bower(依赖项)和 grunt(构建和分发)来管理资产。
没有必要使用 Capistrano 部署到 S3,如果它是纯静态应用程序,您可以使用 aws CLI 以便仅上传您的内容。
我也会通过 CDN。 Fastly 之类的东西在 Amazon S3 上运行得非常好。
我有一个上传到 S3 的 Rake 任务,然后在 Fastly 上清除缓存(如果我需要的话)。
至于您的 Rails 应用程序,它将充当 API,它不应该有任何资产
- 合并
如果您有一个组合应用程序,一些操作由服务器提供 (Rails),并且只调用一些客户端代码 (Angular)。
如果是这种情况,我会通过 Rails 资产管道,并将所有内容都保持为 Rails 编译预部署等的最佳实践...
这是 "it depends" 确实是答案的问题之一,这完全取决于您想要实现的目标。
当我有一个客户端应用程序时,我尝试拥有一个纯客户端,而服务器仅作为一个 API,根本没有任何资产,这样,我就把关注点分开了。
编辑 2015 年 9 月 9 日
我不得不说,只要您可以,我都会将应用程序分开。 这并不总是可行的,尤其是对于更复杂的应用程序。
最近几个月我看到的大多数应用程序都将客户端和服务器端代码分开,我看到较少使用 rails 而更多使用 rails-api 正因为如此(有些人甚至完全放弃 rails 以获得更薄的解决方案)。
根据我的经验,我发现这种方法非常有效:
- API 应用程序 (Rails/Sinatra/Grape/Node/whatever) 仅提供 JSON APIs。部署到服务器,比如 api.yourapp.com。服务 Access-Control headers.
- 静态网络应用程序:首先使用 yeoman 生成 AngularJS、Gulp、Bower 应用程序。使用 gulp aws deploy 模块部署到 S3。
没有真正的理由在同一个应用程序中同时拥有视图和 API 或使用相同的技术构建(如 Rails)。
现在有问题:
- S3 不能很好地支持 Angular 的 HTML5 模式 URLs。所以纯 S3 网站不是一个选项。
- Facebook 不会读取不在页面源中的 OpenGraph 标签。
- 无法确定 Google/SEO 和 Angular 应用程序的状态。我没有看到搜索结果中的内容。
因此,作为解决方案,我引入了另一个网络服务器应用程序。可以基于任何东西——纯机架、节点等。我选择了机架。
问题解决方案:
- Web 服务器应用托管在 www.yourapp.com 上并代理(和缓存)对 S3 的请求。它支持所有 URLs (html5Mode) - 只是代理到 index.html.
- OpenGraph 元标记 - API 有一个端点获取 URL 或 object 和 returns 元标记信息的 ID。 Web 服务器每 URL 向 API 发出一次请求(缓存响应)并将其注入所服务的 index.html.
- SEO - 作为中间件,用于在服务器上呈现页面的机架的预渲染。
作为奖励 -
如今大多数应用程序都有着陆 page/marketing 站点和实际应用程序。有时最好将它们分开维护。 Web 服务器根据 cookie 知道要在 www.yourapp.com 上显示哪个应用程序 - 实际应用程序或营销网站。登录时 - 在客户端设置一个 cookie 瞧。