我有一个简单的实用程序,我用它来通过url params动态调整图像大小。 有一些红宝石图像库的麻烦(cmyk到rvb是,怎么说......"不可用"),我通过nodejs给它一个镜头,这解决了这个问题。
基本上,如果图像不存在,节点或ruby会对其进行转换。否则,当图像已经被请求/转换时,红宝石或节点处理没有被触摸,图像被静态返回
ruby工作得很好,如果一次请求很多变换有点慢,但非常稳定,它总是经历任何数量(我看到图像一个接一个到达页面)
使用节点,它也可以完美地工作,但是当请求大量图像时,对于单个页面加载,第一个图像被转换,然后所有其他请求返回相同的图像(最后一个转换的图像)。如果我刷新页面,第一个图像(已经变换)立即返回,第二个图像返回正确变换,但然后返回的所有其他图像与刚刚转换的图像相同。每次刷新都会一样。不是最优的,基本上这些请求是"合并"在某些时候,都返回相同的图像。因为我不明白
(使用'大量',我的意思是超过1)
红宝石版本:
get "/:commands/*" do |commands,remote_path|
path = "./public/#{commands}/#{remote_path}"
root_domain = request.host.split(/\./).last(2).join(".")
url = "https://storage.googleapis.com/thebucket/store/#{remote_path}"
img = Dragonfly.app.fetch_url(url)
resized_img = img.thumb(commands).to_response(env)
return resized_img
end
节点js版本:
app.get('/:transform/:id', function(req,res,next){
parser.parse(req.params,function(resized_img){
// the transform are done via lovell/sharp
// parser.parse parse the params, write the file,
// return the file path
// then :
fs.readFileSync(resized_img, function(error,data){
res.write(data)
res.end()
})
})
})
感觉我在这里错过了节点中的一个关键点。我期望与节点和ruby有相同的行为,但显然在节点区域中转换的相同模式不能按预期工作。节点不是在等待处理请求,而是按照我不清楚的顺序处理那些
我也明白,我没有用正确的词语来描述这个问题,希望它可以与一些有经验的用户说话,让他们提供澄清,以便更好地了解节点场景背后发生的事情