1

为了提高页面加载速度,我通过 AJAX 实现了创建注释。它很简单而不是重量级。在控制器操作中,我有:

def create
    @comment = @commentable.comments.new(params_comment)
    respond_to do |format|
      if @comment.save
        flash.now[:notice] = "Your comment added."
        @response = {comment: @comment, model: @commentable}
        format.js { @response }
        format.html { redirect_to @commentable  }
      else
        format.js { render nothing: :true, status: :not_acceptable }
        format.html { redirect_to @commentable, status: :not_acceptable  }
      end
    end
  end 

和.js文件:

$("<%= escape_javascript( render 'comments/comment', @response)%>").appendTo(".comments").hide().fadeIn(500)
$('.notice-wrapper').html("<%= j(render partial: 'shared/notice') %>")
$('.alert').fadeOut(3000)

if $(".no-comments").css("display") is 'block'
  $(".no-comments").hide()
$(".new_answer").hide()
$(".open").show()

但我得到了相反的效果,而不是提高性能。通过 JavaScript 的响应时间增加了 100-200 毫秒(总共约 300 毫秒)。这是正常行为还是我做错了什么?有什么办法可以稍微提高速度吗?

我的性能测试:

在此处输入图像描述

UPD: 我只用 JS 文件进行性能测试。

在此处输入图像描述

4

3 回答 3

5

让我们暂时搁置我的观点,即在 CoffeeScript 中嵌入 ERB 看起来非常恶心且无法维护。无可争辩的是,在每个请求上生成和编译 CoffeeScript 都会对性能产生巨大影响。

您也失去了 HTTP 缓存的任何机会。

我的第一个建议是将 CoffeeScript 与 ERB 分开。用您需要的数据填充 ERB 中的隐藏字段,然后在 CoffeeScript 中挖掘这些字段。

但是,如果您必须将 ERB 嵌入到静态文件中,请将 ERB 标签嵌入到纯 JavaScript 中,并让编译后的 CoffeeScript 使用这些标签。

于 2013-11-05T02:24:05.400 回答
1

您编写的代码实际上不会加速请求,因为 Rails 仍然需要处理所有 ERB 等。您仍然返回呈现的 HTML 并将其发送到浏览器,然后将其添加到 DOM。

如果您想让它“更快”,您可以简单地将其呈现@response为 json 并使用 jQuery 或前端框架在客户端上处理它。

但是,该代码确实使用户感觉更好,因为它不会刷新整个页面。

于 2013-11-05T02:22:52.877 回答
0

我的建议是挂钩表单请求,并在成功时呈现新评论,否则重新呈现有错误的表单。一个例子:

# app/javascripts/comments.coffee

$('#comment-form').bind 'ajax:complete', (data, status, xhr) ->
  // psuedo code
  1. if status is success
       append comment -- $('#comments').append(data.comment)
  2. else
       re-render form with errors -- $('#comment-form').html(data.form)
  1. 返回评论模板(comments/comment)并追加到评论
  2. 如果 not_acceptable,请更新您的控制器以返回带有 JS 响应的表单。
  3. 请注意,该文件位于 app/javascripts/comments.coffee
于 2013-11-05T07:17:54.460 回答