рджреГрд╢реНрдп рдкреНрд░рддрд┐рдЧрдорди рдкрд░реАрдХреНрд╖рдгред рд░рд┐рдмреВрдЯ

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

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

рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди


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

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

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЙрдирдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдХрд░ рдкрд░реАрдХреНрд╖рдг-рд╕реВрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░ рджреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рдХрд╣рд╛рдиреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдордиреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ "рд╕реНрдХреНрд░реАрди" рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЦреЛ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдорд┐рдереБрди рдЖрдкрдХреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рджреГрд╢реНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрдиреАред рдЬрдмрдХрд┐ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдереЗ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рдереАред рд╣рд╛рдВ, рдФрд░ UI рдмрд╣реБрдд рдмрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛ рд╕рдХрд╛ - рдХреНрд╖рд┐рддрд┐рдЬ рдкрд░ рдПрдХ рдирдпрд╛ рд╕реНрд╡рд░реВрдкред

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

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

// visual-regression.stories.js import React from 'react'; import StoryProvider from './story-provider'; const stories = storiesOf('visual-regression', module); [ { name: 'Contract', loadData: import('./snapshots/contract.testdata') }, { name: 'ExecutionTask', loadData: import('./snapshots/execution-task.testdata') }, { name: 'ExecutionAssignment', loadData: import('./snapshots/execution-assignment.testdata') }, { name: 'DocumentTemplate', loadData: import('./snapshots/document-template.testdata') }, { name: 'Explorer', loadData: import('./snapshots/explorer.testdata') }, { name: 'Inbox', loadData: import('./snapshots/inbox.testdata') }, ] .map(story => { stories .add(story.name, () => <StoryProvider loadSnapshot={story.loadData} />) .add(`${story.name}Dark`, () => <StoryProvider loadSnapshot={story.loadData} theme='night' />); }); 

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

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╖рдп рдХрд╣рд╛рдиреА


рдбрд╛рд░реНрдХ рдереАрдо рдХрд╣рд╛рдиреА


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

рдХрд╣рд╛рдиреА-provider.js
 // story-provider.js const propsStub = { // -,      . . . }; type Props = { loadSnapshot: () => Object, theme: ?string }; const StoryProvider = (props: Props) => { const [ snapshotState, setsnapshotState ] = React.useState(null); React.useEffect(() => { //    (async() => setsnapshotState((await props.loadSnapshot).default))(); }); if (!snapshotState) //     ,     return <div className={'loading-stub'}>Loading...</div>; //    snapshotState.metadata = require('./snapshots/metadata'); //  redux-   const store = createMockStore(snapshotState); //   applyTheme(props.theme); return ( <Provider store={store}> <MemoryRouter> <App {...propsStub} /> </MemoryRouter> </Provider> ); }; export default StoryProvider; 


рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдмрдВрдбрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрдВрдбрд▓ рдореЗрдВ рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдХрд╣рд╛рдиреА рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП (рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреНрдпрд╛ рд╣реИ), рд╣рдо рдЗрд╕ рд╢рд░реНрдд рдХреЗ рддрд╣рдд рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

.storybook / webpack.config.js
 // .storybook/webpack.config.js ... module.exports = { ... devtool: process.env.NODE_ENV === 'vr-test' ? '(none)' : 'eval-source-map' }; 


package.json
 // package.json { ... "scripts": { ... "storybook": "start-storybook", "build-storybook": "cross-env NODE_ENV=vr-test build-storybook -o ./storybook-static", ... }, 


рдПрдирдкреАрдПрдо рд░рди рдмрд┐рд▓реНрдб-рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреЛрд░реАрдореИрдк-рд╕реНрдЯреЗрдЯрд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реЛрд░реНрд╕рдореИрдк рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ npm рд░рди рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреГрд╢реНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдЙрдиреНрдореВрд▓рди


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

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

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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╣рд╛рдиреА рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 //    describe('Visual regression', function() { it('Contract card should equal to etalon', function() { return this.browser //  story   .url('http://localhost:8080/iframe.html?selectedKind=visual-regression&selectedStory=ContractDark') // ,      story .waitForVisible('.loading-stub', true) //          .assertView('layout', '.form'); }) }); 

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

рдпрджрд┐ рдЖрдк рд╣рд░рдорд╛рдЗрдиреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд╛рдлрд╝рдлрд╝реЛрд░рд╡рд┐рдЬрд╝рди () рд╡рд┐рдзрд┐ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ WaitForV рдЕрджреГрд╢реНрдп () рд╡рд┐рдзрд┐ рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ IO API рд╡рд┐рдзрд┐ рд╣реИ ред Url () рд╡рд┐рдзрд┐, рдХреНрд░рдорд╢рдГ, рднреАред Url () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХрд╣рд╛рдиреА рдХреЗ рдлрд╝реНрд░реЗрдо рдПрдбреНрд░реЗрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдкреВрд░реА рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЛред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рди рд╣реЛ - рд╣рдореЗрдВ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдлреНрд░реЗрдо рдХреЗ рдЕрдВрджрд░ DOM рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ (webdriverIO рддрд░реАрдХреЗ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ)ред

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдореЛрдЪрд╛-рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЕрдкрдирд╛ рдЖрд╡рд░рдг рдмрдирд╛ рд▓рд┐рдпрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдЧрдорди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИред рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╕рдорд╛рди рд╣реИрдВ - 'рдПрдЯрд▓реЙрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП'ред рдЦреИрд░, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рднреА "рдмрдВрджрд░" рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХрд╛рдо рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЦреБрдж рдХреЛ рдШреЛрд╖рдгрд╛рдкрддреНрд░ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рд▓рдЧрднрдЧ) рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдкрд╛рда рд╣реИ:

рдмрдирд╛рдиреЗ рдХреЗ рдкрд░реАрдХреНрд╖рдг-suite.js
 const themes = [ 'default', 'dark' ]; const rootClassName = '.explorer'; const loadingStubClassName = '.loading-stub'; const timeout = 2000; function createTestSuite(testSuite) { const { name, storyName, browsers, testCases, selector } = testSuite; //  ,       browsers && hermione.only.in(browsers); //      themes.forEach(theme => { describe(`${name}_${theme}`, () => it('should equal to etalon', function() { let browser = this.browser //   story .url(`${storybookUrl}/iframe.html?selectedKind=visual-regression&selectedStory=${storyName}-${theme}`) //     .waitForVisible(loadingStubClassName, timeout, true) .waitForVisible(rootClassName); //    (  ) if (testCases && testCases.length > 0) { testCases.forEach(testCase => { if (testCase.before) browser = testCase.before(browser); browser = browser.assertView(`${name}__${testCase.name}_${theme}`, testCase.selector || selector || rootClassName, testCase.options); }); return browser; } //    ,    return browser.assertView(`${name}_${theme}`, selector || rootClassName); })); }); } 


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

рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░-suite.js
 // explorer-suite.js //         module.exports = { //  story,    storyName: 'explorer', //    name: 'explorer', //  ,       browsers: [ 'chrome-1920x1080', 'ie-1920x1080' ], //   testCases: [ { //    name: 'layout' }, { //    name: 'notification-area', selector: '.notification-area__popup', before: b => b .click('.notification-area__popup-button') .waitForVisible('.notification-area__popup') .execute(function() { //       document.querySelectorAll('.expandable-item__content')[2].click(); }) }, //... ] }; 


tests.js
 // tests.js [ require('./suites/explorer-suite'), //... ] .forEach(suite => createTestSuite(suite)); 


рдХрд╡рд░реЗрдЬ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг


рддреЛ, рд╣рдордиреЗ рдЧрддрд┐ рдФрд░ рдЕрддрд┐рд░реЗрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреА рдХрд╡рд░реЗрдЬ рдХреА рдбрд┐рдЧреНрд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ (рдпрд╣рд╛рдВ рдХреЛрдб рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╕реАрдПрд╕рдПрд╕ рд╢реИрд▓реА рдкрддреНрд░рдХ) рд╣реИред

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

Chrome DevTools рдореЗрдВ рдХрд╡рд░реЗрдЬ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдХрд╡рд░реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ:



рдХрд╡рд░реЗрдЬ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреМрди рд╕реА рд╢реИрд▓реА рдпрд╛ рдХреМрди рд╕реА js рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд░реЗ рд░рдВрдЧ рдХреА рдзрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓рд╛рд▓ - рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╣реИрд▓реЛ, рд╡рд┐рд╢реНрд╡" рд╕реНрддрд░ рдХрд╛ рдПрдХ рдЖрд╡реЗрджрди рдерд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдХреА рд╣рдЬрд╛рд░реЛрдВ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ? рдХрд╡рд░реЗрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдореИрдиреНрдпреБрдЕрд▓ рдореЛрдб рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ json рдлрд╛рдЗрд▓ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ css, js, ts, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВред рдлрд╝рд╛рдЗрд▓ рдЗрд╕рдХреЗ рдкрд╛рда (рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ) рдФрд░ рдЗрд╕ рдкрд╛рда рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдХреЛрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ (рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рдЪрд░рд┐рддреНрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред рдиреАрдЪреЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

coverage.json
 [ { "url": "http://localhost:6006/theme-default.css", "ranges": [ { "start": 0, "end": 8127 } ], "text": "... --theme_primary-accent: #5b9bd5;\r\n --theme_primary-light: #ffffff;\r\n --theme_primary: #f4f4f4;\r\n ..." }, { "url": "http://localhost:6006/main.css", "ranges": [ { "start": 0, "end": 610 }, { "start": 728, "end": 754 } ] "text": "... \r\n line-height:1;\r\n}\r\n\r\nol, ul{\r\n list-style:none;\r\n}\r\n\r\nblockquote, q..." ] 


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

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

coverage.js
 const modules = require('./coverage.json').filter(e => e.url.endsWith('.css')); function processRange(module, rangeStart, rangeEnd, isUsed) { const rules = module.text.slice(rangeStart, rangeEnd); if (rules) { const regex = /^\.([^\d{:,)_ ]+-?)+/gm; const classNames = rules.match(regex); classNames && classNames.forEach(name => selectors[name] = selectors[name] || isUsed); } } let previousEnd, selectors = {}; modules.forEach(module => { previousEnd = 0; for (const range of module.ranges) { processRange(module, previousEnd, range.start, false); processRange(module, range.start, range.end, true); previousEnd = range.end; } processRange(module, previousEnd, module.length, false); }); console.log('className;isUsed'); Object.keys(selectors).sort().forEach(s => { console.log(`${s};${selectors[s]}`); }); 


рд╣рдо Chrome DevTools рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рдХрд╡рд░реЗрдЬ.json рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдбрд╛рд▓рдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдХрд╛рд╕ рдХреЛ .csv рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдиреЛрдб рдХрд╡рд░реЗрдЬред js> server.csv

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



рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ


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

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

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

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


All Articles