mne*_*eri 5 javascript gzip middleware node.js express
我正在使用Express来构建一个Web应用程序.我想合并,缩小和提供.js文件.我写了一个中间件,这是我的代码:
var fs = require('fs'),
path = require('path'),
uglify = require('uglify-js'),
cache = '',
scriptsDir = path.join(__dirname, '../scripts'),
files = fs.readdirSync(scriptsDir);
// Sync read is not a problem since the following code is executed on startup
files.forEach(function(fname) {
if (/^.*\.js$/.test(fname)) {
cache += fs.readFileSync(path.join(scriptsDir, fname), 'utf8').toString();
}
});
cache = uglify.minify(cache, { fromString: true }).code;
module.exports = function(req, res, next) {
if (req.url === '/js/all.js')
res.end(cache);
else
next();
};
Run Code Online (Sandbox Code Playgroud)
中间件以这种方式使用:
app.use(compress());
[...]
app.use(app.router);
app.use(jsMerger); // Here is my middleware
app.use(express.static(path.join(__dirname, '../public')));
Run Code Online (Sandbox Code Playgroud)
问题是响应不是gzip压缩.此外,响应中有"无标题"(我的意思是,没有缓存标头,没有标签; static中间件提供的其他资源都有这些标头).这是回应:
X-Powered-By: Express
Transfer-Encoding: chunked
Date: Wed, 12 Mar 2014 14:04:19 GMT
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?如何压缩响应?
添加行后,res.set('Content-Type', 'text/javascript')Express 正在压缩响应。代码是
module.exports = function(req, res, next) {
if (req.url === '/js/all.js') {
res.set('Content-Type', 'text/javascript');
res.end(cache);
} else {
next();
}
};
Run Code Online (Sandbox Code Playgroud)
现在响应的标题是:
X-Powered-By: Express
Vary: Accept-Encoding
Transfer-Encoding: chunked
Date: Wed, 12 Mar 2014 14:45:45 GMT
Content-Type: text/javascript
Content-Encoding: gzip
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
其原因在于compress中间件的设计方式。您可以提供一个filter选项compress:
app.use(express.compress({
filter : function(req, res) {
return /json|text|javascript/.test(res.getHeader('Content-Type'));
}
});
Run Code Online (Sandbox Code Playgroud)
压缩仅应用于与过滤器匹配的请求。默认的过滤器是:
function(req, res){
return /json|text|javascript|dart|image\/svg\+xml|application\/x-font-ttf|application\/vnd\.ms-opentype|application\/vnd\.ms-fontobject/.test(res.getHeader('Content-Type'));
};
Run Code Online (Sandbox Code Playgroud)
如果您不提供Content-Type标头,请求将不会通过过滤器,并且 Express 不会对响应进行 gzip。
| 归档时间: |
|
| 查看次数: |
1724 次 |
| 最近记录: |