рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдЯреАрдо рдХреА Node.js рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЫрдард╛ рд▓реЗрдЦ рд╣реИ, рдЬреЛ рдкрд░реНрд╕реЛрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рднреА рд▓реЗрдЦ:
рдЖрдк рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдиреЗрдХреНрдЯ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдкрд░
ETag- s рдбрд╛рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрддрд┐рд╢реАрд▓ рдирд╣реАрдВ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрджрд┐ рдЖрдк рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕реНрдереИрддрд┐рдХ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрди рд╕рднреА рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдЪрд░рдг рдореЗрдВ рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рд▓реЗрдЦ
etagify рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдХрдиреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд┐рд▓рд╡реЗрдпрд░ рдореЙрдбреНрдпреВрд▓ рдЬреЛ MD5 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИрд╢ рдкрд░ рдЖрдзрд╛рд░рд┐рдд ETag-on-the-fly рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрди рд╣реИрд╢ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред Etagify рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЕрдирд╛рд╡рд╢реНрдпрдХ рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рдж рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧреА (рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдкреГрд╖реНрда рд▓реЛрдбрд┐рдВрдЧ рддреНрд╡рд░рдг 9% рддрдХ рдорд┐рд▓рд╛ рд╣реИ):
myapp = require('express').createServer(); myapp.use(require('etagify')()); ... app.get('/about', function(req, res) { res.etagify(); var body = ejs.render(template, options); res.send(body); });
рдЖрдЗрдП рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ etagify рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрдм рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╕реЗ рдорд╛рдкрдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ Etag рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдореИрдВрдиреЗ рдПрдХ
рдЫреЛрдЯреА рд╕реА рдЪреАрдЯ рд╢реАрдЯ рд▓рд┐рдЦреАред
рдХреИрд╕реЗ etagify рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдХреНрдпреЛрдВрдХрд┐ etagify рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдЫреЛрдЯреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рд╕реМ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдЖрдЗрдП рдкреНрд░рдореБрдЦ рдкрдВрджреНрд░рд╣ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рд╡реИрд░реА рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛ рдорд╛рдорд▓реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИрдВред
Etagify рджреЛ рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╢рд░реНрдд GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣реИрд╢ рдПрд░реЗ рдХреИрд╕реЗ рдмрдирддрд╛ рд╣реИ:
рдФрд░ рдпрд╣рд╛рдБ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ:
return function(req, res, next) { var cached = etags[req.path]['md5'];
рдХрдм рдФрд░ рдХрдм etagify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
Etagify рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ,
рдЬреИрд╕реЗ рдХрд┐ рдмрд╣реБрднрд╛рд╖реА рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реАред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, etagify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
- рдпрджрд┐ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдЕрднреА рднреА рдмрджрд▓рддреА рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреИрд╢ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
- рд╡реИрдпрдХреНрддрд┐рдХреГрдд рдкреГрд╖реНрдареЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡реИрд░реА рд╣реИрдбрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред
- рдпрджрд┐
Vary:cookie
рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Vary:cookie
рд╣реИ, рддреЛ etagify рд╣реИрд╢ рдХреА рд╕рд░рдгреА рдЬрд▓реНрджреА рд╕реЗ рд╡рд┐рд╢рд╛рд▓ рдЖрдХрд╛рд░ рдореЗрдВ рдмрдврд╝ рдЬрд╛рдПрдЧреАред - рдпрджрд┐
Vary:cookie
рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рддреЛ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкрд╣рд▓реЗ рдХреИрд╢ рдХреЛ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИред
рдорд╛рдк рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░
рд╣рдордиреЗ etagify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЧрддрд┐ рдореЗрдВ рдЧрдВрднреАрд░ рд╡реГрджреНрдзрд┐ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХреА рдереА, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рд╢рд░реНрдд GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд▓рд╛рдЧрдд рдкреНрд░рддрд┐ рдкреГрд╖реНрда рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╣реИред рдлрд┐рд░ рднреА, etagify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡реГрджреНрдзрд┐ рднреА рдкреНрд░рдпрд╛рд╕ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдПрдЧреАред

рд╣рдордиреЗ
awsbox рдкрд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ (рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдореЗрдВ awsbox рдкрд░), рдлрд╝рд╛рдпрд░рдмрдЧ рдХреЛ рдЦреЛрд▓рд╛ рдФрд░ etagify рдХреЗ рд╕рд╛рде рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ "рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ" рдкреГрд╖реНрда рдХреА рд▓реЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЗ 50 рдорд╛рдк рдХрд┐рдП (рдкреГрд╖реНрда рд▓реЛрдбрд┐рдВрдЧ рд╕рдордп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡ рдХрд╛ рдерд╛ред рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рд╡реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡рд╣ рд╕рдордп рдЬрдм рддрдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдпрд╛ рдЬрдм рддрдХ рдкрд╣рд▓рд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЖрджрд┐)ред
рд╣рдордиреЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ - рджреЛрдиреЛрдВ рдбреЗрдЯрд╛ рд╕реЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдорд╛рди рдФрд░ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдХреА рдЧрдгрдирд╛ рдХреА, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ etagify рдкреГрд╖реНрда рд▓реЛрдб рд╕рдордп рдХреЛ 9% рдШрдЯрд╛рдХрд░ 1.65 (0.19 рдХреЗ рд╡рд┐рдЪрд▓рди рдХреЗ рд╕рд╛рде) рд╕реЗ 1.50 (0.13 рдХреЗ рд╡рд┐рдЪрд▓рди рдХреЗ рд╕рд╛рде) рд╕реЗрдХрдВрдб рдХрд░ рджреЗрддрд╛ рд╣реИред рдмреБрд░рд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЙрд╕реЗ рдХрд┐рддрдиреЗ рдХрдо рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдлрд┐рд░ рд╣рдордиреЗ
рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рдЯреА-рдЯреЗрд╕реНрдЯ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд┐рдирд╛ etagify рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреА-рдореВрд▓реНрдп 0.01 рд╕реЗ рдХрдо рд╣реЛ рдЧрдпрд╛, рдпрд╛рдиреА рд╕рдорд╛рди рд╡рд┐рддрд░рдг рдХреА рдЖрдХрд╕реНрдорд┐рдХ рдШрдЯрдирд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 1% рд╕реЗ рдХрдо рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдорд╛рдкрд╛ рд╕реБрдзрд╛рд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрд╣рд╛рдВ рдЪрд╛рд░реНрдЯ рдкрд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

etagify рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдореЙрдбреНрдпреВрд▓ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╡реЗрджрди рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдФрд░ рдЙрдирдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорди рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рднреЛрдЬрди рдорд┐рд▓реЗрдЧрд╛ред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рднреА рд▓реЗрдЦ: