Node.JS:用于修改http响应的库

前一段时间,我在Express /Node.JS上编写了一个带有后端的网站。 最小化答案存在问题。 我发现了许多现成的软件包,但每个人都有一个问题-模板未缩小后的html。 结果,我决定编写自己的小型本地自行车-web-minify库 ,该使您可以在将钩子发送给客户端之前嵌入一个钩子并修改响应。

软件包安装


npm i @dmitriym09/web-minify --save 

我认为对开发人员而言,最好的库描述是代码示例=)

例子


web-minify-中间件功能:

 const htmlminify = require('html-minifier').minify; const csso = require('csso').minify; const postcss = require('postcss'); const precss = require('precss'); const autoprefixer = require('autoprefixer'); const minify = require('web-minify'); app.use(minify([ { contentType: /css/, minify: async (data, req, res) => { let resData = (await postcss([precss, autoprefixer]).process(data, { from: undefined })).css; resData = csso(resData).css; return resData; } } ])); 

在此示例中,所有Content-Type包含子字符串“ css”的响应都将被拦截。 使用cssopostcssprecssautoprefixer处理响应正文。 字符串在contentType参数中传递(将在条目中搜索String.prototype.indexOf())或RegExp(RegExp.prototype.test())。 minify参数-Function(数据(字符串:req:请求,res:response))函数应返回带有新主体或Promise的String,而后者又由String解析。 在未捕获异常的情况下,客户端将收到500的响应。

如前所述,大多数现有的具有类似功能的流行库都能很好地缩小静态文件。 但是,最小化代码中生成的响应(例如,模板引擎生成的html)。 问题之一是答案可以分部分发送,通常需要完整的数据进行处理。 因此,您需要拦截所有发送给用户的邮件,收集并处理并在最后发送。 使用web-minify时应考虑到这一点:要发送到客户端且位于contentType下的TB级文件将在内存中累积。

例子


使用单元测试中的html-minifier进行HTML压缩


 const htmlminify = require('html-minifier').minify; it('HTML', (done) => { const app = createServer([minify([ { contentType: 'html', minify: (data) => { let res = htmlminify(data, { removeAttributeQuotes: true, collapseWhitespace: true, conservativeCollapse: false, decodeEntities: true, keepClosingSlash: false, preserveLineBreaks: false, preventAttributesEscapin, processConditionalComments: true, removeAttributeQuotes: true, removeComments: true, trimCustomFragments: true, useShortDoctype: true }); return res; } } ])], function(req, res) { res.setHeader('Content-Type', 'text/html; charset=utf-8'); res.end(`<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> </head> <body> <h1>Test</h1> <p>Test</p> </body>`); }); request(app) .get('/') .set('Accept', 'text/html; charset=utf-8') .expect('Content-Type', 'text/html; charset=utf-8') .expect('<!doctype html><html lang=en><head><meta charset=utf-8></head><body><h1>Test</h1><p>Test</p></body></html>') .expect(200) .end(done) }); 

修改JSON和单元测试的Promise返回代码


 it('JSON', (done) => { const app = createServer([minify([ { contentType: /json/, minify: (data, req, res) => { return new Promise(function(resolve, reject) { try { res.statusCode = 456; let o = JSON.parse(data); o.dt = new Date('2018-09-28T11:05:13.492Z') resolve(JSON.stringify(o)) } catch(exc) { reject(exc) } }) } } ])], function(req, res) { res.setHeader('Content-Type', 'application/json; charset=utf-8'); res.end(JSON.stringify({a: 12})); }); request(app) .get('/') .set('Accept', 'applicatio3n/json; charset=utf-8') .expect('Content-Type', 'application/json; charset=utf-8') .expect('{"a":12,"dt":"2018-09-28T11:05:13.492Z"}') .expect(456) .end(done) }); 

Web- minify在麻省理工学院(MIT)许可下可在githubnpm中获得。

感谢您的关注! 欢迎批评,建议和评论!

Source: https://habr.com/ru/post/zh-CN425371/


All Articles