рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ
Express /Node.JS рдкрд░ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдЗрдЯ рд▓рд┐рдЦреА рдереАред рдЬрд╡рд╛рдмреЛрдВ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереАред рдореБрдЭреЗ рдХрдИ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рд╕рднреА рдХреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА - html рдХреЗ рдмрд╛рдж рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдирддреАрдЬрддрди, рдореИрдВрдиреЗ рдЕрдкрдиреА рдЦреБрдж рдХреА рдЫреЛрдЯреА рдФрд░ рджреЗрд╢реА рд╕рд╛рдЗрдХрд┐рд▓ -
рд╡реЗрдм-рдорд┐рдирд┐рдЗрдЬрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╣реБрдХ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛
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; } } ]));
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "рд╕реАрдПрд╕рдПрд╕" рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реА рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд░реАрд░ рдХреЛ
csso ,
postcss ,
precss ,
autoprefixer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рд╛рдордЧреНрд░реАрдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ String.prototype.indexOf ()) рдпрд╛ RegExp (RegExp.prototyp.test ()) рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреА рдЬрд╛рдПрдЧреАред рдорд┐рдирд┐рдлрд╛рдИ рдкреИрд░рд╛рдореАрдЯрд░ - рдлрд╝рдВрдХреНрд╢рди (рдбреЗрдЯрд╛: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд░реАрдХ: рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ, рд░реЗрд╕: рд░рд┐рд╕реНрдкрд╛рдВрд╕) рдлрд╝рдВрдХреНрд╢рди, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рдирдП рд╢рд░реАрд░ рдпрд╛ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкрд╡рд╛рдж рди рдкрдХрдбрд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХ рдХреЛ 500 рдХрд╛ рдЬрд╡рд╛рдм рдорд┐рд▓реЗрдЧрд╛
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореМрдЬреВрджрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ HTML) рдХрд╛ рдорд┐рдирд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд╕рднреА рдЕрд╡рд░реЛрдзрди, рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдВрдд рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╡реЗрдм-рдорд┐рдирд┐рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕реЗ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ рдпрд╣ рдореЗрдореЛрд░реА рдореЗрдВ рдЬрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ 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 рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдФрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕реА рдХреЛрдб
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) });
рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд
рдЬреАрдЖрдИрдЯреАрдмреА рдФрд░
рдПрдирдкреАрдПрдо рдкрд░
рд╡реЗрдм-рдорд┐рдирд┐рдлрд╛рдЗ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЖрд▓реЛрдЪрдирд╛, рд╕реБрдЭрд╛рд╡ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!