рд╡реЗрдмрдкреИрдХ рдФрд░ рдЙрдиреНрдирдд рд╡реЗрдм рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓, рдЖрдзреБрдирд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рдирд╛

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреА рдЕрдЧрд▓реА рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рд╕рд░рд▓ рдореМрдЬреВрджрд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╕рд╛рдордЧреНрд░реА, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

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

рдЫрд╡рд┐

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

рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рдЙрддрд░реЗрдВ, рд╣рдо рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

тЦН рдПрдкреНрд▓реАрдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдкреНрд░рдпреЛрдЬреНрдп рдХреА рдЙрдЪреНрдЪ рдЧрддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

  • рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдРрдк рд╢реЗрд▓ред
  • PRPL рдкреИрдЯрд░реНрди (рдкреБрд╢, рд░реЗрдВрдбрд░, рдкреНрд░реА-рдХреИрд╢, рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ)ред

System рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо


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

  • ES6 рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрд╕рд╛рдзрди рдЖрдпрд╛рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
  • рдПрд╕рдПрдПрд╕рдПрд╕ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
  • рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред
  • рд╕реЗрд╡рд╛ рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред

тЦН рдЙрдиреНрдирдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рд╣рдо рдЖрдзреБрдирд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рд╡рд╣ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕рд╡рд╛рд▓ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:

  • рдореЙрдбреНрдпреВрд▓ред
  • рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ (рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ, рдХрдХреНрд╖рд╛рдПрдВ)ред
  • рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рддред
  • рддреАрд░ рдХрд╛рд░реНрдпред
  • рдЦрд╛рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХред

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ (PWA) рдХреЗ рдЖрдЧрдорди рдиреЗ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдирдП рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдЖрдЧрдорди рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рд╣реИред рдЗрд╕рдиреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдРрдк рд╢реЗрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдкреАрдЖрд░рдкреАрдПрд▓ рдкреИрдЯрд░реНрди рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рдпрдорд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рдорд╛рди рддреЗрдЬ рдФрд░ рдЙрддреНрддрд░рджрд╛рдпреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

тЦН App Shell рдФрд░ PRPL рдХреНрдпрд╛ рд╣реИ?


рдРрдк рд╢реЗрд▓ рдПрдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреАрдбрдмреНрд▓реНрдпреВрдП рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдЗрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдПрдХ рдиреНрдпреВрдирддрдо рд░рд╛рд╢рд┐ рд╕рд╛рдЗрдЯ рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред рдЗрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЖрд╡реЗрджрди рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рд╕рдВрд╕рд╛рдзрди рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рднреА рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо PRPL рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

  • рдкреБрд╢ - рд╕реНрд░реЛрдд рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╕рд╛рдзрди рднреЗрдЬрдирд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, HTTP / 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
  • рд░реЗрдВрдбрд░ - рдореВрд▓ рдорд╛рд░реНрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
  • рдкреНрд░реА-рдХреИрд╢ - рд╢реЗрд╖ рдорд╛рд░реНрдЧреЛрдВ рдпрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдХреИрд╢рд┐рдВрдЧред
  • рдЖрд▓рд╕реА рд▓реЛрдб - "рдЖрд▓рд╕реА" рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░)ред

рдХреЛрдб рдореЗрдВ рдРрдк рд╢реИрд▓ рдФрд░ PRPL рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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

<!DOCTYPE html> <html lang="en"> <head>    <meta charset="utf-8" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <meta http-equiv="X-UA-Compatible" content="ie=edge" />    <!-- Critical Styles -->    <!--   тДЦ1 -->    <style>        html {            box-sizing: border-box;        }        *,        *:after,        *:before {            box-sizing: inherit;        }        body {            margin: 0;            padding: 0;            font: 18px 'Oxygen', Helvetica;            background: #ececec;        }        header {            height: 60px;            background: #512DA8;            color: #fff;            display: flex;            align-items: center;            padding: 0 40px;            box-shadow: 1px 2px 6px 0px #777;        }        h1 {            margin: 0;        }        .banner {            text-decoration: none;            color: #fff;            cursor: pointer;        }        main {            display: flex;            justify-content: center;            height: calc(100vh - 140px);            padding: 20px 40px;            overflow-y: auto;        }        button {            background: #512DA8;            border: 2px solid #512DA8;            cursor: pointer;            box-shadow: 1px 1px 3px 0px #777;            color: #fff;            padding: 10px 15px;            border-radius: 20px;        }        .button {            display: flex;            justify-content: center;        }        button:hover {            box-shadow: none;        }        footer {            height: 40px;            background: #2d3850;            color: #fff;            display: flex;            align-items: center;            padding: 40px;        }    </style>    <!--   тДЦ1 -->    <title>Vanilla Todos PWA</title> </head> <body>    <body>        <!-- Main Application Section -->        <!--   тДЦ2 -->        <header>            <h3><font color="#3AC1EF">тЦН<a class="banner"> Vanilla Todos PWA </a></font></h3>        </header>        <main id="app"></main>        <footer>            <span>┬й 2019 Anurag Majumdar - Vanilla Todos SPA</span>        </footer>        <!--   тДЦ2 -->             <!-- Critical Scripts -->        <!--   тДЦ3 -->        <script async src="<%= htmlWebpackPlugin.files.chunks.main.entry %>"></script>        <!--   тДЦ3 -->        <noscript>            This site uses JavaScript. Please enable JavaScript in your browser.        </noscript>    </body> </body> </html> 

рдЗрд╕ рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрдк рд╢реЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ "рд╢реЗрд▓" рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрд╕рдХрд╛ "рдХрдВрдХрд╛рд▓" рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдиреНрдпреВрдирддрдо рдорд╛рд░реНрдХрдЕрдк рд╣реИред рд╣рдо рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ (рдмрд╛рдж рдореЗрдВ, рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЬреЛ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ, рдЬреИрд╕реЗ <!-- тДЦ1 --> )ред

  • рдЯреБрдХрдбрд╝рд╛ рдирдВред резред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ HTML рдкреЗрдЬ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп CSS рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
  • рдЯреБрдХрдбрд╝рд╛ рдирдВрдмрд░ реиред рдпрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ "рд╢реЗрд▓" рд╣реИред рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрд╛рдж рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ app ( <main id="app"></main> ) рдХреЗ рд╕рд╛рде main рдЯреИрдЧ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИред
  • рдЯреБрдХрдбрд╝рд╛ рдирдВрдмрд░ рейред рдпрд╣рд╛рдВ рдкрдЯрдХрдерд╛рдПрдВ рдЖрддреА рд╣реИрдВред async рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкрд╛рд░реНрд╕рд░ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддреА рд╣реИред

рдЖрд╡реЗрджрди рдХреЗ рдКрдкрд░ "рдХрдВрдХрд╛рд▓" PRPL рдкреИрдЯрд░реНрди рдХреЗ рдкреБрд╢ рдФрд░ рд░реЗрдВрдбрд░ рдЪрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреГрд╖реНрда рдХрд╛ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTML рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬрд▓реНрджреА рд╕реЗ рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦреЛрдЬ рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рдкреГрд╖реНрда рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИрдВ (рдЦрдВрдб рд╕рдВрдЦреНрдпрд╛ 3), рдЬреЛ рдбреЛрдо (рд░реЗрдВрдбрд░ рдХрджрдо рдкрд░) рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдХреЗ рдореВрд▓ рдорд╛рд░реНрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ "рд╢реЗрд▓" рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреЗрдЬ рдХреЛ рд░реАрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдХрдВрдХрд╛рд▓ рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рд╕реНрдерд┐рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

 var staticAssetsCacheName = 'todo-assets-v3'; var dynamicCacheName = 'todo-dynamic-v3'; //   тДЦ1 self.addEventListener('install', function (event) {   self.skipWaiting();   event.waitUntil(     caches.open(staticAssetsCacheName).then(function (cache) {       cache.addAll([           '/',           "chunks/todo.d41d8cd98f00b204e980.js","index.html","main.d41d8cd98f00b204e980.js"       ]       );     }).catch((error) => {       console.log('Error caching static assets:', error);     })   ); }); //   тДЦ1 //   тДЦ2 self.addEventListener('activate', function (event) {   if (self.clients && clients.claim) {     clients.claim();   }   event.waitUntil(     caches.keys().then(function (cacheNames) {       return Promise.all(         cacheNames.filter(function (cacheName) {           return (cacheName.startsWith('todo-')) && cacheName !== staticAssetsCacheName;         })         .map(function (cacheName) {           return caches.delete(cacheName);         })       ).catch((error) => {           console.log('Some error occurred while removing existing cache:', error);       });     }).catch((error) => {       console.log('Some error occurred while removing existing cache:', error);   })); }); //   тДЦ2 //   тДЦ3 self.addEventListener('fetch', (event) => {   event.respondWith(     caches.match(event.request).then((response) => {       return response || fetch(event.request)         .then((fetchResponse) => {             return cacheDynamicRequestData(dynamicCacheName, event.request.url, fetchResponse.clone());         }).catch((error) => {           console.log(error);         });     }).catch((error) => {       console.log(error);     })   ); }); //   тДЦ3 function cacheDynamicRequestData(dynamicCacheName, url, fetchResponse) {   return caches.open(dynamicCacheName)     .then((cache) => {       cache.put(url, fetchResponse.clone());       return fetchResponse;     }).catch((error) => {       console.log(error);     }); } 

рдЖрдЗрдП рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред

  • рдЯреБрдХрдбрд╝рд╛ рдирдВред резред рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреА install рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╕реЗ рд╕реНрдереИрддрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдпрд╣рд╛рдВ рдЖрдк рдкрд╣рд▓реЗ рдорд╛рд░реНрдЧ ("рдХрдВрдХрд╛рд▓" рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди (рд╕реАрдПрд╕рдПрд╕, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЪрд┐рддреНрд░, рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреЗ "рдХрдВрдХрд╛рд▓" рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдмрди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдХрд╛рдо рдХрд░ рд╕рдХреЗред рд╕рдВрд╕рд╛рдзрди рдХреИрд╢рд┐рдВрдЧ, рдХрдВрдХрд╛рд▓ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, PRPL рдкреИрдЯрд░реНрди рдХреЗ рдкреНрд░реА-рдХреИрд╢ рдХрджрдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
  • рдЯреБрдХрдбрд╝рд╛ рдирдВрдмрд░ реиред рдПрдХ activate рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдкреНрд░рдпреБрдХреНрдд рдХреИрд╢ activate ред
  • рдЯреБрдХрдбрд╝рд╛ рдирдВрдмрд░ рейред рдХреЛрдб рдХреА рдпреЗ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдХреИрд╢ рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрд╕рд╛рдзрди рдЕрднреА рддрдХ рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдХреЛ рдирдП рдЕрд▓рдЧ рдХреИрд╢ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╢ рдбрд╛рдпрдиреЗрдорд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ рдорджрдж рдХрд░рддреА рд╣реИред

рдЖрдЬ рддрдХ, рд╣рдордиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдЕрднреА рддрдХ рдмрд╛рдд рдирд╣реАрдВ рдХреА рд╣реИ рд╡рд╣ рд╣реИ PRPL рдкреИрдЯрд░реНрди рдХрд╛ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдЪрд░рдгред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА


рдПрдХ рдЕрдЪреНрдЫрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЕрдХреЗрд▓реЗ, рдПрдХ рд╕рднреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛, рдПрдХ рдЧреБрдгрд╡рддреНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ Webpack рдХрд╛рдо рдореЗрдВ рдЖрддрд╛ рд╣реИред рдирд┐рд░реНрдорд╛рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ (рдмрдВрдбрд▓рд░реНрд╕) рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдкрд╛рд░реНрд╕рд▓ рдФрд░ рд░реЛрд▓рдЕрдкред рд▓реЗрдХрд┐рди рд╡реЗрдмрдкреИрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдЬреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рдЕрдиреНрдп рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

тЦНSupport ES6 рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрд╕рд╛рдзрди рдЖрдпрд╛рдд рдХреНрд╖рдорддрд╛рдПрдВ


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

  • @babel/core
  • @babel/plugin-syntax-dynamic-import
  • @babel/preset-env
  • babel-core
  • babel-loader
  • babel-preset-env

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред .babelrc рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП .babelrc рдлрд╝рд╛рдЗрд▓:

 {   "presets": ["@babel/preset-env"],   "plugins": ["@babel/plugin-syntax-dynamic-import"] } 

рдмрд╛рдмреЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА presets рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ ES6 рдХреЛ ES5 рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдмрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ plugins рд▓рд╛рдЗрди рддрд╛рдХрд┐ рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЗрд╕ рддрд░рд╣ рд╕реЗ webpack.config.js рд╕рд╛рде рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ webpack.config.js рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ - webpack.config.js ):

 module.exports = {   entry: {       //     },   output: {       //     },   module: {       rules: [           {               test: /\.js$/,               exclude: /node_modules/,               use: {                   loader: 'babel-loader'               }           }       ]   },   plugins: [       //    ] }; 

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ rules рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд┐рд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдмрд▓ babel-loader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

тЦНSASS рдФрд░ рд╕реАрдПрд╕рдПрд╕ рд╕рдорд░реНрдерди


рд╣рдорд╛рд░реЗ SASS рдФрд░ CSS рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓реА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • sass-loader
  • css-loader
  • style-loader
  • MiniCssExtractPlugin

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрди рдкреНрд▓рдЧ рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 module.exports = {   entry: {       //     },   output: {       //     },   module: {       rules: [           {               test: /\.js$/,               exclude: /node_modules/,               use: {                   loader: 'babel-loader'               }           },           {               test: /\.scss$/,               use: [                   'style-loader',                   MiniCssExtractPlugin.loader,                   'css-loader',                   'sass-loader'               ]           }       ]   },   plugins: [       new MiniCssExtractPlugin({           filename: '[name].css'       }),   ] }; 

рд▓реЛрдбрд░ rules рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдо CSS рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП plugins рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИред

And рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рдЕрд╕рд▓реА рдХрд╛рдо рдХреА рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧ


рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рдЙрддреНрдкрд╛рджрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдХрд╛рдо рдЖрддреЗ рд╣реИрдВ:

  • clean-webpack-plugin : dist рдлреЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  • compression-webpack-plugin : dist рдлреЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  • copy-webpack-plugin : рд╕реНрдереИрддрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓реЗрдВ, рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рддрдХред
  • html-webpack-plugin : dist рдлреЛрд▓реНрдбрд░ рдореЗрдВ index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
  • webpack-md5-hash : dist рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрд╢рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдПред
  • webpack-dev-server : рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдореА webpack.config.js рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:

 const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const WebpackMd5Hash = require('webpack-md5-hash'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const CompressionPlugin = require('compression-webpack-plugin'); module.exports = (env, argv) => ({   entry: {       main: './src/main.js'   },   devtool: argv.mode === 'production' ? false : 'source-map',   output: {       path: path.resolve(__dirname, 'dist'),       chunkFilename:           argv.mode === 'production'               ? 'chunks/[name].[chunkhash].js'               : 'chunks/[name].js',       filename:           argv.mode === 'production' ? '[name].[chunkhash].js' : '[name].js'   },   module: {       rules: [           {               test: /\.js$/,               exclude: /node_modules/,               use: {                   loader: 'babel-loader'               }           },           {               test: /\.scss$/,               use: [                   'style-loader',                   MiniCssExtractPlugin.loader,                   'css-loader',                   'sass-loader'               ]           }       ]   },   plugins: [       new CleanWebpackPlugin('dist', {}),       new MiniCssExtractPlugin({           filename:               argv.mode === 'production'                   ? '[name].[contenthash].css'                   : '[name].css'       }),       new HtmlWebpackPlugin({           inject: false,           hash: true,           template: './index.html',           filename: 'index.html'       }),       new WebpackMd5Hash(),       new CopyWebpackPlugin([           // {           // from: './src/assets',           // to: './assets'           // },           // {           // from: 'manifest.json',           // to: 'manifest.json'           // }       ]),       new CompressionPlugin({           algorithm: 'gzip'       })   ],   devServer: {       contentBase: 'dist',       watchContentBase: true,       port: 1000   } }); 

рдкреВрд░реЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ argv рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрдм webpack рдпрд╛ webpack-dev-server рдХрдорд╛рдВрдб webpack рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ package.json рдореЗрдВ рдЗрди рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ package.json рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓:

 "scripts": {   "build": "webpack --mode production && node build-sw",   "serve": "webpack-dev-server --mode=development --hot", }, 

рдирддреАрдЬрддрди, рдЕрдЧрд░ рд╣рдо npm run build рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк npm run serve рдХрдорд╛рдВрдб npm run serve , рддреЛ рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред

рдЙрдкрд░реЛрдХреНрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ plugins рдФрд░ devServer рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

new CopyWebpackPlugin рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдк рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд░реЛрдд рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

ред рд╕реЗрд╡рд╛ рдХрд░реНрдореА рдХрд╛ рдЪрдпрди рдХрд░рдирд╛


рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЙрдмрд╛рдК рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ dist рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдвреВрдВрдврддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреИрд╢ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рддреА рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░ рдлрд╛рдЗрд▓ рдХреЛ dist рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдмрд╛рдд рдХреА рдереА рдЬрдм рд╕реЗрд╡рд╛ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ build-sw.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реИ:

 const glob = require('glob'); const fs = require('fs'); const dest = 'dist/sw.js'; const staticAssetsCacheName = 'todo-assets-v1'; const dynamicCacheName = 'todo-dynamic-v1'; //   тДЦ1 let staticAssetsCacheFiles = glob   .sync('dist/**/*')   .map((path) => {       return path.slice(5);   })   .filter((file) => {       if (/\.gz$/.test(file)) return false;       if (/sw\.js$/.test(file)) return false;       if (!/\.+/.test(file)) return false;       return true;   }); //   тДЦ1 const stringFileCachesArray = JSON.stringify(staticAssetsCacheFiles); //   тДЦ2 const serviceWorkerScript = `var staticAssetsCacheName = '${staticAssetsCacheName}'; var dynamicCacheName = '${dynamicCacheName}'; self.addEventListener('install', function (event) {   self.skipWaiting();   event.waitUntil(     caches.open(staticAssetsCacheName).then(function (cache) {       cache.addAll([           '/',           ${stringFileCachesArray.slice(1, stringFileCachesArray.length - 1)}       ]       );     }).catch((error) => {       console.log('Error caching static assets:', error);     })   ); }); self.addEventListener('activate', function (event) {   if (self.clients && clients.claim) {     clients.claim();   }   event.waitUntil(     caches.keys().then(function (cacheNames) {       return Promise.all(         cacheNames.filter(function (cacheName) {           return (cacheName.startsWith('todo-')) && cacheName !== staticAssetsCacheName;         })         .map(function (cacheName) {           return caches.delete(cacheName);         })       ).catch((error) => {           console.log('Some error occurred while removing existing cache:', error);       });     }).catch((error) => {       console.log('Some error occurred while removing existing cache:', error);   })); }); self.addEventListener('fetch', (event) => {   event.respondWith(     caches.match(event.request).then((response) => {       return response || fetch(event.request)         .then((fetchResponse) => {             return cacheDynamicRequestData(dynamicCacheName, event.request.url, fetchResponse.clone());         }).catch((error) => {           console.log(error);         });     }).catch((error) => {       console.log(error);     })   ); }); function cacheDynamicRequestData(dynamicCacheName, url, fetchResponse) {   return caches.open(dynamicCacheName)     .then((cache) => {       cache.put(url, fetchResponse.clone());       return fetchResponse;     }).catch((error) => {       console.log(error);     }); } `; //   тДЦ2 //   тДЦ3 fs.writeFile(dest, serviceWorkerScript, function(error) {   if (error) return;   console.log('Service Worker Write success'); }); //   тДЦ3 

рдЖрдЗрдП рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред

  • рдЯреБрдХрдбрд╝рд╛ рдирдВред резред рдпрд╣рд╛рдВ staticAssetsCacheFiles рдлреЛрд▓реНрдбрд░ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА staticAssetsCacheFiles рдРрд░реЗ рдореЗрдВ рд░рдЦреА рдЧрдИ рд╣реИред
  • рдЯреБрдХрдбрд╝рд╛ рдирдВрдмрд░ реиред рдпрд╣ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдмрд╛рдд рдХреА рд╣реИред рддреИрдпрд╛рд░ рдХреЛрдб рдмрдирд╛рддреЗ рд╕рдордп, рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо dist рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЙрд╕рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдирд┐рд░рдВрддрд░ stringFileCachesArray ред
  • рдЯреБрдХрдбрд╝рд╛ рдирдВрдмрд░ рейред рдпрд╣рд╛рдВ, serviceWorkerScript рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╡рдирд┐рд░реНрдорд┐рдд рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛрдб рдХреЛ dist/sw.js рдкрд░ рд╕реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, node build-sw рдХрдорд╛рдВрдб node build-sw рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред webpack --mode production рдХрдорд╛рдВрдб рдХреЗ webpack --mode production рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкрдЯрдХрдерд╛ рдлрд╝рд╛рдЗрд▓ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╡реЗрджрди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдСрдлрд╝рд▓рд╛рдЗрди рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╡рд░реНрдХрдмреЙрдХреНрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ред рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдЕрдиреБрдХреВрд▓рди рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реИрдВред

Used рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди


рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ package.json рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 { "name": "vanilla-todos-pwa", "version": "1.0.0", "description": "A simple todo application using ES6 and Webpack", "main": "src/main.js", "scripts": {   "build": "webpack --mode production && node build-sw",   "serve": "webpack-dev-server --mode=development --hot" }, "keywords": [], "author": "Anurag Majumdar", "license": "MIT", "devDependencies": {   "@babel/core": "^7.2.2",   "@babel/plugin-syntax-dynamic-import": "^7.2.0",   "@babel/preset-env": "^7.2.3",   "autoprefixer": "^9.4.5",   "babel-core": "^6.26.3",   "babel-loader": "^8.0.4",   "babel-preset-env": "^1.7.0",   "clean-webpack-plugin": "^1.0.0",   "compression-webpack-plugin": "^2.0.0",   "copy-webpack-plugin": "^4.6.0",   "css-loader": "^2.1.0",   "html-webpack-plugin": "^3.2.0",   "mini-css-extract-plugin": "^0.5.0",   "node-sass": "^4.11.0",   "sass-loader": "^7.1.0",   "style-loader": "^0.23.1",   "terser": "^3.14.1",   "webpack": "^4.28.4",   "webpack-cli": "^3.2.1",   "webpack-dev-server": "^3.1.14",   "webpack-md5-hash": "0.0.6" } } 

рдЕрдЧрд░ рд╣рдо рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗрдмрдкреИрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдЙрдкрдХрд░рдг рдЕрдХреНрд╕рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬрдм рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдирдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рди рдХрд┐ рд╕реНрд╡рдпрдВ рдкреИрдХреЗрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рд▓реЗрдХрд┐рди рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рддрдереНрдп рдХреА рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдКрдкрд░ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдпрд╛ рд╡рд╣ рдкреИрдХреЗрдЬ рдирд┐рднрд╛рддрд╛ рд╣реИред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдзреБрдирд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ - рдЪрд╛рд╣реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рд░реВрдЯрд┐рдВрдЧ, рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рдореМрдЬреВрджрд╛ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛред

рдЕрдм рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореМрдЬреВрджрд╛ рдЪреМрдЦрдЯреЗ рдпрд╛ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

тЦН рдореЙрдбреНрдпреВрд▓


рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ ES6 рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реБрдП, рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ES6 рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдХреНрд╕рд░ рд▓реЛрдХрдкреНрд░рд┐рдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдгреАрдп рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рд╡реЗрдмрдкреИрдХ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдпрд╣ app.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 import { appTemplate } from './app.template'; import { AppModel } from './app.model'; export const AppComponent = { //   App... }; 

рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ


рдШрдЯрдХ рдирд┐рд░реНрдорд╛рдг рд╣рдорд╛рд░реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣рд╛рдВ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдЬреИрд╕реЗ рдХреБрдЫ рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдпрд╛ рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рд╡рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ ES6 рдорд╛рдирдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ ред

рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВред рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрддреА рд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ app.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЙрдирдХрд╛ рдЖрд╡реЗрджрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

 import { appTemplate } from './app.template'; import { AppModel } from './app.model'; export const AppComponent = {   init() {       this.appElement = document.querySelector('#app');       this.initEvents();       this.render();   },   initEvents() {       this.appElement.addEventListener('click', event => {           if (event.target.className === 'btn-todo') {               import( /* webpackChunkName: "todo" */ './todo/todo.module')                   .then(lazyModule => {                       lazyModule.TodoModule.init();                   })                   .catch(error => 'An error occurred while loading Module');           }       });       document.querySelector('.banner').addEventListener('click', event => {           event.preventDefault();           this.render();       });   },   render() {       this.appElement.innerHTML = appTemplate(AppModel);   } }; 

рдпрд╣рд╛рдВ рд╣рдо AppComponent рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рддреБрд░рдВрдд рдЖрд╡реЗрджрди рдХреЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдИрдПрд╕ 6 рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рд╢реИрд▓реА рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХреЗ рдХрд░реАрдм рд╣реИред рдпрд╣рд╛рдВ, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

тЦН рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд


рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐, PRPL рдкреИрдЯрд░реНрди рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рдЙрд╕ рднрд╛рдЧ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдП рд╣реИрдВ, рдЬреЛ L (рд▓реЗрдЯрд░ рд▓реЛрдбрд┐рдВрдЧ) рдЕрдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдШрдЯрдХреЛрдВ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реЗрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ PRPL рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЙрд╕рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ "рдХрдВрдХрд╛рд▓" рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд╛рдпрдиреЗрдорд┐рдХ рдЖрдпрд╛рдд рдХреЗ рджреМрд░рд╛рди, рд╕рдВрд╕рд╛рдзрди рдХреИрд╢ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдирд╣реАрдВред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдРрдк рд╢реЗрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╢реЗрд╖ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕рд╛рдзрди, рдЕрд░реНрдерд╛рдд, chunks рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдбрд╛рдпрдирд╛рдорд┐рдХ рд░рд┐рд╕реЛрд░реНрд╕ рдЖрдпрд╛рдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ AppComponent рдШрдЯрдХ рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рдо initEvents() рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ btn-todo рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ btn-todo рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдП рдЧрдП рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред

рддреАрд░ рдХрд╛рд░реНрдп рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ


рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдм рдЖрдкрдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреАрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЖрдкрдХреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 export const appTemplate = model => `   <section class="app">       <h3><font color="#3AC1EF">тЦН ${model.title} </font></h3>       <section class="button">           <button class="btn-todo"> Todo Module </button>       </section>   </section> `; 

appTemplate рдлрд╝рдВрдХреНрд╢рди appTemplate рдПрдХ рдореЙрдбрд▓ ( model рдкреИрд░рд╛рдореАрдЯрд░) рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ HTML рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИредрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЧрдарди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рдмрд╣реБрд╕реНрддрд░реАрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣рд╛рдВ рдШрдЯрдХреЛрдВ рдХрд╛ рдЦрд╛рдХрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдПрдХ рддреНрд╡рд░рд┐рдд рдЯрд┐рдк рджреА рдЧрдИ рд╣реИред рдЗрд╕рдореЗрдВ reduce()HTML рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ :

 const WorkModel = [   {       id: 1,       src: '',       alt: '',       designation: '',       period: '',       description: ''   },   {       id: 2,       src: '',       alt: '',       designation: '',       period: '',       description: ''   },   //... ]; const workCardTemplate = (cardModel) => ` <section id="${cardModel.id}" class="work-card">   <section class="work__image">       <img class="work__image-content" type="image/svg+xml" src="${           cardModel.src       }" alt="${cardModel.alt}" />   </section>   <section class="work__designation">${cardModel.designation}</section>   <section class="work__period">${cardModel.period}</section>   <section class="work__content">       <section class="work__content-text">           ${cardModel.description}       </section>   </section> </section> `; export const workTemplate = (model) => ` <section class="work__section">   <section class="work-text">       <header class="header-text">           <span class="work-text__header"> Work </span>       </header>       <section class="work-text__content content-text">           <p class="work-text__content-para">               This area signifies work experience           </p>       </section>   </section>   <section class="work-cards">       ${model.reduce((html, card) => html + workCardTemplate(card), '')}   </section> </section> `; 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдХреЛрдб рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЗрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣рд╛рдВ рдЙрдиреНрд╣реАрдВ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдзреБрдирд┐рдХ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИрдВред

рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:

  • model . тАФ , reduce() , .
  • model.reduce , HTML-, , . , , , тАФ .

. , , тАФ .


Todo-, . .




. . , , , .

-


-, , -, . , , . , JavaScript -, .

, .


-

. Lighthouse.




рдкрд░рд┐рдгрд╛рдо


, , JavaScript, . , , , .

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! -, ?

Source: https://habr.com/ru/post/hi444342/


All Articles