рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд░рд┐рдЪрд┐рдд рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ
рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЗ рдмрд╛рдж
, рдпрд╣ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдЖрдЬ рд╣рдо рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд PWA тАЬрд╣реЗрд▓реЛ рд╣реИрдмрд░тАЭ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред

рдЖрд╡реЗрджрди
https://altrusl.imtqy.com/habr-pwa/hello-habr/ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЬрдм рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реЛрдо рд╕реНрдХреНрд░реАрди рдкрд░ рд╢реЙрд░реНрдЯрдХрдЯ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреНрд░рд╢реНрди рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдХреНрд░реЛрдо рдЖрдкрдХреЛ рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рддреГрддреАрдп-рдкрдХреНрд╖ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд░рд▓ PWA рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ "рд╣реЗрд▓реЛ рд╣реИрдмрд░" рдЪрд▓рд╛рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рдЖрдкрдХреЛ рдЗрд╕реЗ рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ Chrome рд╡реЗрдм рд╕реНрдЯреЛрд░ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИред PHP рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛, рдмрд┐рд▓реНрдХреБрд▓ред

рд╣реИрд▓реЛ рд╣рдмрд░ рдХреА рдлрд╛рдЗрд▓реЗрдВ GitHub-a -
https://github.com/altrusl/habr-pwa/tree/master/hello-habr рд╕реЗ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ
рд╕рдм рдХреБрдЫ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред
"рд╣реЗрд▓реЛ рд╣реИрдмрд░" рдореЗрдВ рдПрдХ рдкреЗрдЬ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣ рдЗрд╕ рдкрд░ рдПрдХ рдЪрд┐рддреНрд░ (рд▓реЛрдЧреЛ) рдФрд░ рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рд╢рд┐рд▓рд╛рд▓реЗрдЦ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
"рд╣реЗрд▓реЛ рд╣реИрдмрд░" рдХреЛрдбindex.html
<html> <head> <title>Hello Habr</title> <script src="hh.js"></script> <link rel="stylesheet" href="hh.css" /> <script type="text/javascript"> if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(function(registration) { console.log('Registration successful, scope is:', registration.scope); }) .catch(function(error) { console.log('Service worker registration failed, error:', error); }); } </script> </head> <body> <div class="center"> <p id="text"></p> </div> <div id="logo"></div> </body> </html>
hh.css
@font-face { font-family: Zaplyv-Heavy; src: url(Zaplyv-Heavy.otf); } body { display: flex; align-items: center; align-content: center; justify-content: center; overflow: auto; } .center { font-family: Zaplyv-Heavy; font-size: 8vmax; } #logo { background-image: url(logo.jpg); background-size: 100%; width: 100px; height: 100px; position: absolute; top: 0; right: 0; margin: 10px; }
hh.js
window.onload = function() { fetch("hh.txt?mode=nocache").then(data => data.text()).then(data => { animateText(data) }); } function animateText(data) { var ele = document.getElementById("text"), txt = data.split(""); var interval = setInterval(function(){ if(!txt[0]){ return clearInterval(interval); }; ele.innerHTML += txt.shift(); }, 150); }
hh.txt
Hello Hubr
рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рднреА рдореМрдЬреВрдж рд╣реИред рдХреБрд▓ - рдПрдХ рдФрд╕рдд рд╡реЗрдм рд╕рд╛рдЗрдЯ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рдкреВрд░рд╛ рд╕реЗрдЯред рдпрджрд┐ рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ index.html рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЪрд┐рддреНрд░ рдФрд░ рдПрдХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд┐рд▓рд╛рд▓реЗрдЦ jhascript рджреНрд╡рд╛рд░рд╛ hh.txt рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдПрдХ рд╕рд╛рдорд╛рдиреНрдп PWA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдореЙрдбрд▓ред
рдпрджрд┐ рдЖрдк sw.js рдХреЗ рдмрд┐рдирд╛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡реЗрдм рд╕рд╛рдЗрдЯ рд╣реЛрдЧреАред рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЬреЛрдбрд╝реЗрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдкрд╛рдБрдЪ рдХреИрд╢ рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рд╛рдЗрдЯ рдХреИрд╢ html рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рд╕рднреА рд╕рдВрд╕рд╛рдзрди рдХреИрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ GET рдХреНрд╡реЗрд░реА рдореЗрдВ "рдореЛрдб = nocache" рд╣реИ - рдФрд░ рдпрд╣ рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде hh.txt рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рд╣реИред
рдХрднреА-рдХрднреА рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрд╕рд╛рдзрди рдбрд┐рд╕реНрдХ рдХреИрд╢ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбрд┐рд╕реНрдХ рдХреИрд╢ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреИрд╢) рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдФрд░ рдореЗрд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдкрд░ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдВ.htaccess # Cache-Control Headers <ifModule mod_headers.c> <FilesMatch (\.css|\.js|sprites\.png)$> Header unset ETag Header unset Expires Header set Cache-Control "no-cache" </FilesMatch> </IfModule>
Sw.js рдХреЗ рдкреАрдЫреЗ рддрд░реНрдХ рд╕рд░рд▓ рд╣реИ - "рдХреИрд╢ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╡рд╛рдкрд╕ рдЧрд┐рд░ рд░рд╣рд╛ рд╣реИ"ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдиреБрд░реЛрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдХреЛ рдХреИрд╢ рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд╕рд╛рдзрди рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреИрд╢ рдХреА рдЬрд╛рддреА рд╣реИред
рдХреНрд░реЛрдо-рдПрдХ рдХрдВрд╕реЛрд▓ рдореЗрдВ index.html рдкреГрд╖реНрда рдХреЗ рдкрд╣рд▓реЗ рдЙрджреНрдШрд╛рдЯрди рдХреЗ рдмрд╛рдж, рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдЙрджреНрдШрд╛рдЯрди рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдХреИрд╢ рдХреЛ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЙрдирдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рдХреЗ рдЙрджреНрдШрд╛рдЯрди рдХреЗ рджреМрд░рд╛рди, рдХреЗрд╡рд▓ hh.txt рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рд╕рдВрд╕рд╛рдзрди рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛-рдП рд╕реЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд index.html, hh.css, hh.js, hh.otf, logo.jpg - рдпрд╣ рдмрд╣реБрдд рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реЗрд▓, рд╕реНрдерд┐рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╢реЗрд▓ рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдЗрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбрд╛рдпрдирд╛рдорд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдРрдк рд╢реЗрд▓-рдИ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ text.txt рдХрд╛ рдЕрдиреБрд░реЛрдз рд╣реИред
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ PWA рдХрд╣рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, "рд╣реИрд▓реЛ рд╣реИрдмрд░" рдореЗрдВ рдПрдХ рдЪреАрдЬрд╝ рдХреА рдХрдореА рд╣реИ - рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рд╣реЛрдо рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдЗрдХрди рдФрд░ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рд▓реЙрдиреНрдЪред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ index.html рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
manifest.json { "short_name": "Hello Habr", "name": "Hello Habr - PWA example", "icons": [ { "src": "logo3.jpg", "type": "image/jpg", "sizes": "192x192" }, { "src": "logo2.jpg", "type": "image/jpg", "sizes": "512x512" } ], "start_url": "index.html", "background_color": "#3367D6", "display": "standalone", "scope": "/habr-pwa/hello-habr/", "theme_color": "#3367D6" }
рдЗрд╕реЗ index.html рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:
<link rel="manifest" href="manifest.json">
рдЙрд╕рдХреЗ рдмрд╛рдж, рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ) рд╣реЛрдо рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рдмрдирд╛рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред рд╢реЙрд░реНрдЯрдХрдЯ рджреНрд╡рд╛рд░рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди
рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдореЛрдб рдореЗрдВ рдЦреБрд▓ рдЬрд╛рдПрдЧрд╛ - рдмрд┐рдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗред рдкреНрд░рдХрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг
Google рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рд╣реИрдВ ред
рд╣реИрд▓реЛ рд╣рдмрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ PWA рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд╣реИ рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдпрд╣ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд╛рдЗрдЯ рдХреЛ PWA рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдФрд░ рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░ рдлрд╝рд╛рдЗрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреА рд╣реЛрдЧреАред Sw.js рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд╛рдлреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИред
рдЕрдЧрд▓реА рдмрд╛рд░ рд╣рдо рддреИрдпрд╛рд░ рд╕рд╛рдЗрдЯ рдХреЛ PWA рдХреЛ CMS рдЬреБрдорд▓рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ (рд╕рд╛рдЗрдЯ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, sw.js рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░рд╣реЗрдВрдЧреЗред