(рдЗрди) рдкрд░рд┐рдорд┐рдд рдпреБрджреНрдз

рдпреБрджреНрдз рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛


рд╣рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ред рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛, рдФрд░ рдпрд╣ рдХрд╛рдлреА рдореМрд▓рд┐рдХ рд╣реИред рдпрд╣ unit testing рдФрд░ integration testing рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╣ рдЙрд╕ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг, рдЖрдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХрд╣рддреЗ рд╣реИрдВред


рдпрд╣ рдЦреБрдж рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдШрдЯрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХреЛрдВ , рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЕрдВрддрд┐рдо рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред


рд╣рд░ рдХреЛрдИ рд╕рд░рд▓ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИ (рд╡реЗ рд╕рд░рд▓ рд╣реИрдВ), рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди (рдИ 2 рдИ) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВред рдкрд░рд┐рдорд┐рдд рдФрд░ рдЕрдирдВрдд рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ ...


рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ


рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВ - shallow рдФрд░ рдмрд╛рдХреА рд╕рдм, рдЬрд┐рд╕рдореЗрдВ mount , react-testing-library , webdriver рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдХреЗрд╡рд▓ shallow рд╡рд┐рд╢реЗрд╖ рд╣реИ - рдмрд╛рдХреА рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред


рдФрд░ рдпрд╣ рдЕрдВрддрд░ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рдЧреБрдВрдЬрд╛рдЗрд╢ - WHAT рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ ред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - shallow рдХреЗрд╡рд▓ React.createElement рдХреЛ рдХреЙрд▓ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди DOM рддрддреНрд╡реЛрдВ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕рд╣рд┐рдд рдХреЛрдИ рднреА рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ - рдпрд╣ React.createElement рдХрд╛ рдПрдХ рдкрдХреНрд╖ (рдмреАрдЬреАрдп) рдкреНрд░рднрд╛рд╡ рд╣реИред


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


рдФрд░ рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ: you can NOT run each and every side effect ред


рдХреНрдпреЛрдВ рдирд╣реАрдВ?


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


  • рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ ... dumb components ред рд╡реЗ рдЧреВрдВрдЧреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░рдд рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди "рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕" рдирд╣реАрдВред


  • рд▓реЗрдХрд┐рди рдпрд╣ Containers рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм рддрдХ рд╡реЗ рдЧреВрдВрдЧреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╡реЗ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВред рд╡реЗ рд╕рдорд╕реНрдпрд╛ рд╣реИрдВ!



рд╢рд╛рдпрдж, рдЕрдЧрд░ рд╣рдо "рд╕рд╣реА рдШрдЯрдХ" рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╣рдорд╛рд░рд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░реЗрдЧрд╛, рдФрд░ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред


TRDL: рдкрд░рд┐рдорд┐рдд рдШрдЯрдХ

рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рдбрдВрдм рдШрдЯрдХ


рджрд╛рди Abramov рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдЪреНрдЫреЗрдж рдкреНрд░рд╕реНрддреБрддрд┐ рдШрдЯрдХ рд╣реИрдВ:


  • рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрддреА рд╣реИрдВ, рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ
  • рджреЛрдиреЛрдВ рдореЗрдВ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рдирд▓ рдФрд░ рдХрдВрдЯреЗрдирд░ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ** рдЕрдВрджрд░, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдбреЛрдо рдорд╛рд░реНрдХрдЕрдк рдФрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╢реИрд▓реА рд╣реЛрддреА рд╣реИред
  • рдЕрдХреНрд╕рд░ рдЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЛрдХрдерд╛рдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред
  • рдмрд╛рдХреА рдРрдк рдкрд░ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдлреНрд▓рдХреНрд╕ рдПрдХреНрд╢рди рдпрд╛ рд╕реНрдЯреЛрд░ред
  • рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░реЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд▓реЛрдб рдпрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред
  • рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдФрд░ рдХреЙрд▓рдмреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  • рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЕрдкрдирд╛ рд░рд╛рдЬреНрдп рд╣реЛрддрд╛ рд╣реИ (рдЬрдм рд╡реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп UI рд╕реНрдерд┐рддрд┐ рд╣реИ)ред
  • рдЬрдм рддрдХ рдЙрдиреНрд╣реЗрдВ рд░рд╛рдЬреНрдп, рдЬреАрд╡рди рдЪрдХреНрд░ рд╣реБрдХ, рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрдм рддрдХ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЙрджрд╛рд╣рд░рдг: рдкреЗрдЬ, рд╕рд╛рдЗрдбрдмрд╛рд░, рд╕реНрдЯреЛрд░реА, рдпреВрдЬрд░рдЗрдиреНрдлреЛ, рд╕реВрдЪреАред
  • ....
  • рдФрд░ рдХрдВрдЯреЗрдирд░ рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ / рдкреНрд░реЙрдкрд░ рдкреНрд░рджрд╛рддрд╛ рд╣реИрдВред

рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░: рдЖрджрд░реНрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ ...
рдХрдВрдЯреЗрдирд░ рдЯреНрд░реА рд╣реИрдВред рдШрдЯрдХ рдЯреНрд░реА рд▓реАрдлреНрд╕ рд╣реИрдВред


рдЕрдВрдзреЗрд░реЗ рдХрдорд░реЗ рдореЗрдВ рдХрд╛рд▓реА рдмрд┐рд▓реНрд▓реА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ


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


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

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╕реНрддреБрддрд┐ рдШрдЯрдХ рдЗрдХрд╛рдИ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ - "рдмрд╛рдХреА рдРрдк рдкрд░ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ" ?


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


рд╕рдВрднрд╡рддрдГ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХрд░ рд░рд╣реЗ рдереЗред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреВрдВрдЧрд╛ рдШрдЯрдХ рдХреЛ рдкрд░рд┐рдорд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:


рдкреНрд░рд╕реНрддреБрддрд┐ рдШрдЯрдХ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдкреНрд░рд╕реНрддреБрддрд┐ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП


рдФрд░ рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓, рдЖрдкрдХреЛ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП): рдХреИрд╕реЗ? : рдЯреЗрдмрд▓рдлреНрд▓рд┐рдк:!


рдЖрдЬ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдФрд░ рдХрдВрдЯреЗрдирд░реНрд╕ рд╕рд┐рд░реНрдл рдЙрд▓рдЭрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрднреА-рдХрднреА рд╕рд┐рд░реНрдл "рдкреНрдпреЛрд░" рдПрдВрдЯрд┐рдЯреАрдЬрд╝ (рд╣реИрд▓реЛ рдЧреНрд░реЗрдлреНрд▓рдХреНрдпреВ) рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред


рд╕рдорд╛рдзрд╛рди 1 - DI


рд╕рдорд╛рдзрд╛рди 1 рд╕рд░рд▓ рд╣реИ - рдбрдВрдм рдШрдЯрдХ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ - рдЗрд╕рдореЗрдВ slots рд╣реЛрддреЗ slots ред рдмрд╕ "рд╕рд╛рдордЧреНрд░реА" (рдмрдЪреНрдЪреЛрдВ) рдХреЛ, рд╕рд╣рд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛрдЧреА:


  • рдЖрдк "рдЕрдкрдиреЗ рдРрдк рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ" рдХреЗ рдмрд┐рдирд╛ рдЧреВрдВрдЧреЗ рдШрдЯрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ
  • рдЖрдк рдзреБрдПрдВ / рдПрдХреАрдХрд░рдг / e2e рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВред

 // Test me with mount, with "slots emty". const PageChrome = ({children, aside}) => ( <section> <aside>{aside}</aside> {children} </section> ); // test me with shallow, or real integration test const PageChromeContainer = () => ( <PageChrome aside={<ASideContainer />}> <Page /> </PageChrome> ); 

рд╕реНрд╡рдпрдВ рджрд╛рди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХреГрдд:
{% рдЯреНрд╡рд┐рдЯрд░ 1021850499618955272%}


DI (рдбрд┐рдкреЗрдВрдбреЗрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдирд╡рд░реНрд╕рди рджреЛрдиреЛрдВ), рд╢рд╛рдпрдж, рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рддрдХрдиреАрдХ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред


рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ - рдЧреВрдВрдЧреЗ рдШрдЯрдХ рдЧреВрдВрдЧреЗ рд╣реИрдВ!

рд╕рдорд╛рдзрд╛рди 2 - рд╕реАрдорд╛рдПрдБ


рдпрд╣ рдПрдХ рдХрд╛рдлреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ Solution 1 рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдмрд╕ рд╕рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ ред рдмрд╕ рдЙрдирдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯреЛ ... Boundary


 const Boundary = ({children}) => ( process.env.NODE_ENV === 'test' ? null : children // or `jest.mock` ); const PageChrome = () => ( <section> <aside><Boundary><ASideContainer /></Boundary></aside> <Boundary><Page /></Boundary> </section> ); 

рддрдм - рдЖрдк рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реНрдХреЛрдк рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реВрдиреНрдп, Boundary рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдкрд░рд┐рдорд┐рдд рдмрдирд╛рддреЗ рд╣реИрдВред


рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ - рдбрдореНрдм рдШрдЯрдХ рд╕реНрддрд░ рдкрд░ рд╕реАрдорд╛ рд╣реИред рдЧреВрдВрдЧрд╛ рдШрдЯрдХ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЧреВрдВрдЧрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди 3 - рдЯреАрдпрд░


рд╕рдорд╛рдзрд╛рди 2 рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реНрдорд╛рд░реНрдЯ рдмрд╛рдЙрдВрдбреНрд░реА рдХреЗ рд╕рд╛рде, рдкрд░рдд рдпрд╛ рдЯреАрдпрд░ , рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рдордЬрд╝рд╛рдХ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ:


 const checkTier = tier => tier === currentTier; const withTier = tier => WrapperComponent => (props) => ( (process.env.NODE_ENV !== 'test' || checkTier(tier)) && <WrapperComponent{...props} /> ); const PageChrome = () => ( <section> <aside><ASideContainer /></aside> <Page /> </section> ); const ASideContainer = withTier('UI')(...) const Page = withTier('Page')(...) const PageChromeContainer = withTier('UI')(PageChrome); 

рднрд▓реЗ рд╣реА рдпрд╣ рд▓рдЧрднрдЧ рд╕реАрдорд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ - рдбрдВрдм рдШрдЯрдХ рдбрдВрдм рд╣реИ, рдФрд░ рдХрдВрдЯреЗрдирд░ рдЕрдиреНрдп рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдорд╛рдзрд╛рди 4 - рдЕрд▓рдЧ рдЪрд┐рдВрддрд╛рдПрдВ


рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╕рд┐рд░реНрдл рдЪрд┐рдВрддрд╛рдПрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ! рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ - рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред


Redux рдпрд╛ GQL connect рдЖрдИрдПрдирдЬреА рдШрдЯрдХ connect рдХрд░рдХреЗ рдЖрдк рдкреНрд░рд╕рд┐рджреНрдз рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ - рдкреНрд░рд╕рд┐рджреНрдз рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде - Container(WrapperComponent) ред рдЖрдк рдЙрдирдХреЗ рдирд╛рдо рд╕реЗ рдЙрдирдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ

 const PageChrome = () => ( <section> <aside><ASideContainer /></aside> <Page /> </section> ); // remove all components matching react-redux pattern reactRemock.mock(/Connect\(\w\)/) // all any other container reactRemock.mock(/Container/) 

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


 import {createElement, remock} from 'react-remock'; // initially "open" const ContainerCondition = React.createContext(true); reactRemock.mock(/Connect\(\w\)/, (type, props, children) => ( <ContainerCondition.Consumer> { opened => ( opened ? ( // "close" and render real component <ContainerCondition.Provider value={false}> {createElement(type, props, ...children)} <ContainerCondition.Provider> ) // it's "closed" : null )} </ContainerCondition.Consumer> ) 

рдпрд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ: рди рддреЛ рдХреЛрдИ рддрд░реНрдХ рдЕрдВрджрд░ рд╣реИ рдФрд░ рди рд╣реА рдкреНрд░рд╕реНрддреБрддрд┐, рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ - рд╕рднреА рддрд░реНрдХ рдмрд╛рд╣рд░ рд╣реИред

рдмреЛрдирд╕ рд╕реЙрд▓реНрдпреВрд╢рди - рдЕрд▓рдЧ рдЪрд┐рдВрддрд╛рдПрдВ


рдЖрдк defaultProps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрдВрдЧ рдпреБрдЧреНрдорди рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрди рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ defaultProps рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...


 const PageChrome = ({Content = Page, Aside = ASideContainer}) => ( <section> <aside><Aside/></aside> <Content/> </section> ); 

рддреЛ?


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


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


рддреБрдореНрд╣реЗрдВ рдкрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рджрд╛рди рдиреЗ рдЕрдкрдиреЗ рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ:


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рдмрдЯрди 5 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ (рд╕рд╛рдорд╛рдиреНрдп, рд╕рдХреНрд░рд┐рдп, рд╣реЛрд╡рд░, рдЦрддрд░реЗ, рдЕрдХреНрд╖рдо) рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдмрдЯрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб 5 ├Ч 4 = 20 рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдХреНрд░рдордгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдордирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рджрд╣рдирд╢реАрд▓ рд╡рд┐рд╕реНрдлреЛрдЯ рдХреЛ рдХреИрд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреГрд╢реНрдп рдЙрддреНрдкрд╛рджрди рдХреЛ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБ


  1. рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рдирд▓ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рдирд▓ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
  2. рдХрдВрдЯреЗрдирд░ рдЯреНрд░реА рд╣реИрдВред рдШрдЯрдХ рдЯреНрд░реА рд▓реАрдлреНрд╕ рд╣реИрдВред
  3. рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рдирд▓ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП , рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдЖрдк рдордзреНрдпрдо рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдХрд░ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдбреБрдмрдХреА рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рд╕рднреА рдЪреАрдиреА рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

PS: рдпрд╣ ru-habr рд▓реЗрдЦ habr рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред

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


All Articles