构建Rails和Angular应用程序

时间:2015-09-08 08:32:08

标签: angularjs ruby-on-rails-4 amazon-s3 gruntjs bower

我希望使用 Rails 4 Angular 以及 Capistrano 构建新的单页应用,以进行部署。 我希望所有前端都是 Amazon S3 上的静态应用程序,但我还是开放了其他建议。 对我来说重要的是一个快速发展的过程,能够轻松扩展。

我想知道我应该使用的最佳结构是什么:

  1. 将所有资源保留在app / assets中,并将 Bower 路径设置为vender目录。 这样我可以使用rails预编译方法并享受index.html的Rails html标签,但我确信将它上传到S3并将其分开是很容易的。

  2. 将所有资产(包括 Bower 组件)保存在公共/应用目录中,这会将其保留为完整的单独应用程序,但之后我需要使用 Grunt 或用于预编译资产的任何其他服务。

  3. 还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

根据我的经验,我发现这种方法非常有效:

  1. API app(Rails / Sinatra / Grape / Node / whatever)仅提供JSON API。部署到服务器,比如api.yourapp.com。提供访问控制标头。
  2. 静态网络应用程序:通过与yeoman一起生成AngularJS,Gulp,Bower应用程序。使用gulp aws部署模块部署到S3。
  3. 没有真正的理由在同一个应用程序中同时使用视图和api,或者使用相同的技术构建(如在Rails中)。

    现在有问题:

    1. S3不支持Angular的HTML5模式URL。所以纯粹的S3网站不是一个选择。
    2. Facebook不会读取不在页面源中的OpenGraph标记。
    3. 无法弄清楚Google / SEO和Angular应用的状态。我没有在搜索结果中看到内容。
    4. 作为解决方案,我介绍了另一个Web服务器应用程序。可以基于任何东西 - 纯机架,节点等。我选择机架。

      问题的解决方案:

      1. Web服务器应用程序托管在www.yourapp.com上,代理(和缓存)请求到S3。它支持所有URL(html5Mode) - 仅代理index.html。
      2. OpenGraph元标记 - API具有获取对象的URL或ID并返回元标记信息的端点。 Web服务器每个URL向API发出一次请求(缓存响应)并将其注入服务的index.html。
      3. 搜索引擎优化 - 作为中间件,使用预渲染机架在服务器上呈现页面。
      4. 作为奖励 -

        今天的大多数应用都有一个目标网页/营销网站和实际应用。有时最好分开维护这些。 Web服务器根据cookie知道www.yourapp.com上显示的应用程序 - 实际的应用程序或营销网站。登录时 - 在客户端设置cookie并瞧。

答案 1 :(得分:3)

首先,我认为这里有点混乱,让我试着清理它。

有几种方法可以实现这个目标

  1. 纯客户端 - > API
  2. 当您拥有静态应用程序时,无需通过Rails资产管道,当您使用工具进行客户端应用程序时,有更好的方法来管理资产。

    例如,您的客户端应用程序将是一个Angular应用程序,您将使用bower(依赖项)和grunt(构建和分发)的组合来管理资产。

    使用Capistrano部署到S3是没有意义的,如果它是一个纯静态应用程序,您可以使用aws CLI来上传您的内容。

    我也会通过CDN。像Fastly这样的东西在Amazon S3上运行得非常好。

    我有一个上传到S3的Rake任务,然后在Fastly上清除缓存(如果需要的话)。

    至于你的Rails应用程序,它将作为API,它不应该有任何资产

    1. 结合
    2. 如果你有一个组合的应用程序,一些操作由服务器(Rails)提供,只调用一些客户端代码(Angular)。

      如果是这种情况,我会通过Rails资产管道,并将所有内容保留为Rails最佳实践,并进行编译预部署等...

      这是其中一个问题,“它依赖”是真正的答案,这完全取决于你想要实现的目标。

      当我有一个客户端应用程序时,我尝试拥有一个纯客户端,并且只将服务器作为API,没有任何资产,这样,我将问题分开。

      编辑9/9/15

      我必须说,只要你能,我会将这些应用分开。 它并不总是可能的,特别是对于更复杂的应用程序。

      我在最近几个月看到的大多数应用程序都将客户端和服务器端代码分开,我已经看到少用铁路和更多使用rails-api因为这一点(有些甚至是丢弃的导轨完全用于更薄的解决方案) )。