有没有办法缩小 Rails UJS 响应?

Posted

技术标签:

【中文标题】有没有办法缩小 Rails UJS 响应?【英文标题】:Is there a way to minify Rails UJS responses? 【发布时间】:2013-01-11 02:32:04 【问题描述】:

sprockets 对 js 资产做了所有的缩小,但是很多 javascript 是写在 respond_to :js UJS 响应中的。

在编程时使 javascript 具有可读性也会使其变得臃肿,其中充斥着浏览器在处理它们时不需要的无用数据(例如可读的变量名和空格)

有没有办法自动缩小/丑化 UJS 响应,以便它们在编程时保持可读,但在发送到浏览器时会被缩小? (缩小来源不是一种选择)

【问题讨论】:

***.com/questions/3805951/… 谢谢,这个答案是一种手动完成的方法。有没有办法自动完成? 【参考方案1】:

首先,您所说的不一定是 UJS,而是 RJS or Ruby JavaScript,或者从 ruby​​ 模板动态生成的 javascript。

UJS,非常(大多数?)通常不是通过动态 javascript 完成的,而是通过返回动态数据,然后由静态 javascript 操作。这有很多优点;与这种情况相关:这意味着您的 javascript 已经在客户端进行了缩小(并且可能已缓存),而您只是通过网络发送序列化数据。

如果可以,您可能想考虑使用这种方法。

如果您不能,您可以使用中间件自动缩小您的 RJS 操作,如下所示(原始伪代码版本)。但要小心。您还需要考虑缩小的好处是否值得付出代价,例如缩小每个请求的时间/成本与向客户端发送较大文件的时间/成本。

有关中间件的更多信息,refer to the docs

module RJSMinifier
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)

    # pseudocode: if this is not an RJS request or the request did not
    # complete successfully, return without doing anything further
    if (this request is not RJS or status is not ok)
      return [status, headers, response]
    end

    # otherwise minify the response and set the new content-length
    response = minify(response)
    headers['Content-Length'] = response.length.to_s

    [status, headers, response]
  end

  def minify(js)
    # replace this with the real minifier you end up using
    YourMinifier.minify(js)
  end
end

【讨论】:

以上是关于有没有办法缩小 Rails UJS 响应?的主要内容,如果未能解决你的问题,请参考以下文章

rails :: 如何评估 js 响应

让引导程序的按钮收音机与 Rails UJS(数据远程)配合得很好?

jquery_ujs 和 rails-ujs 问题 ajax 页面的问题

在 JS 模块中使用 Rails-UJS(带有 webpacker 的 Rails 6)

Rails 5.1 中是不是还需要`require jquery_ujs`?

ajaxSetup 不适用于 Rails / jquery-ujs