我有一个web应用程序(
ruby on rails),它发送一些YAML作为一个隐藏的输入域的值.
现在我想减少发送到浏览器的文本的大小.无损压缩的最有效形式是什么是最少的数据发送?我可以在服务器端承担额外的压缩和解压缩成本.
解决方法
您可以使用ruby内核中的zlib实现来进行数据删除:
require "zlib" data = "some long yaml string" * 100 compressed_data = Zlib::Deflate.deflate(data) #=> "x\x9C+\xCE\xCFMU\xC8\xC9\xCFKW\xA8L\xCC\xCDQ(.)\xCA\xCCK/\x1E\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15D\x15\x04\x00\xB3G%\xA6"
您应该对压缩数据进行base64编码,使其可打印:
require 'base64' encoded_data = Base64.encode64 compressed_data #=> "eJwrzs9NVcjJz0tXqEzMzVEoLinKzEsvHhUcFRwVHBUcFRwVHBUcFUQVBACz\nRyWm\n"
后来,在客户端,您可以使用pako(zlib端口到javascript)来获取您的数据. This answer可能有助于您实现JS部分.
为了让您了解这是多么有效,以下是示例字符串的大小:
data.size # 2100 compressed_data.size # 48 encoded_data.size # 66
在客户端压缩并在服务器上充气时,反之亦然.
Zlib::Inflate.inflate(Base64.decode64(encoded_data)) #=> "some long yaml stringsome long yaml str ... (shortened,as the string is long :)
免责声明:
> ruby zlib的实现应该与pako实现兼容.但我没有尝试过.>关于字符串大小的数字有点被骗. Zlib在这里真的很有效,因为字符串重复了很多.现实生活中的数据通常不会重复.