请教一下关于express浏览器缓存的问题
发布于 3个月前 作者 dulante 502 次浏览 来自 问答

var options = { dotfiles: 'ignore’, etag: false, extensions: [‘htm’,’html’,’css’,’png’,’gif’,’jpg’,’js’,’tpl’], index: true, maxAge: '3600000’, redirect: true, setHeaders: function (res, path, stat) { res.set('x-timestamp’, Date.now()) } }; app.use(express.static(path.join(__dirname, ‘public’),options));

如上,想把public目录下的一些静态资源放到浏览器缓存,减小服务器负担,提高加载速度,options里面的setHeaders这个属性是怎么使用的, 我想把Expires加到headers里 还有headers Expires 是否与max-age冲突,max-age会覆盖Expires?headers中还会不会有Expires? 这是respone的headers: Accept-Ranges:bytes Cache-Control:public, max-age=3600 Connection:keep-alive Date:Wed, 19 Nov 2014 06:28:24 GMT ETag:"3329-1416377484000" Last-Modified:Wed, 19 Nov 2014 06:11:24 GMT X-Powered-By:Express

如果把http gzip传输,动态压缩支持在nodejs,express中如何实现 ,借助插件?

9 回复

ETag:"3329-1416377484000" 有了这个就已经被缓存了。并且EXPRESS会自动返回304。

nodejs有个模块,叫zlib,gzip可以靠它。

@MiguelValentine 3Q,我想知道里面的setHeaders,这个属性要怎么才能生效,关于gzip我想知道的是关于动态http压缩(这玩意是啥)的相关实现 o(╯□╰)o

@MiguelValentine:倒不用zlib,express启用gzip的话,用这个npm install compression,记得也是TJ写的。

@dulante:理论上开启gzip用来压缩服务器响应的文件流:文本,图片(不建议)都可以的。详情还是请自行科普吧。正所谓:努力学习靠自我,提问之前先搜索,哈哈。

@dulante 这个是NODEJS的原生方法 ,详见request.setHeader() api.

setHeader(k,v) => 会自动注册进某个requset内的数组或OBJ。 当writeHeader(),或者end()事件触发时(自动触发writeHeader()),这个数组将会被编码成响应头。 所以在writeHeader之后不能再次setHeader. req在EXPRESS中就是被修饰过的request.

@dulante HTTP gzip 的动态实现。

1.res.render();不能再用了需要自己手动实现。

==>模块思路 声明最终写法。

function(req,res){
  gzip(req,res,file);
};

gzip 就是我们需要写的模块 //首先file是语言引擎处理完毕的数据流 例子:file=jade.renderFile(filepath,config);

///gzip模块实例/部分伪代码

function gzip(req,res,file){
  if(req.headers['accept-encoding'] && req.headers['accept-encoding'].indexof('gzip')!=-1){
    var file = zip(file);
    res.setHeader({'Content-Encoding':'gzip'});
    res.setHeader({'Vary':'Accept-Encoding');
    res.end(file);
  }else{
    res.end(file);
  };
}

function zip(file){
  return gzip.createGzip(file);
};

//可能实际运行中要改动,思路是这样。
回到顶部