рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢реБрд░реВ рдХрд░рдирд╛


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


TL / DR: рд░реЗрдбреА-рдЯреВ-рд╕реНрдЯрд╛рд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЛ рдкрдХреНрд╖реЛрдВ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  1. рд░реЗрдбреА-рдореЗрдб рд╕реНрдЯрд╛рд░реНрдЯрд░-рдХрд┐рдЯ, рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдпрд╛ рдХреНрд▓реА рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
  2. рд╕рдм рдХреБрдЫ рдЦреБрдж рд╣реА рдЗрдХрдЯреНрдард╛ рдХрд░реЛ

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


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


рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдПрдБ


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


CRL, CRA рдХреА рддрд░рд╣, рдПрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕реАрдПрд▓рдЖрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛:


  • CJs рдФрд░ рддреЛрдВ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЛрд▓рдЕрдк рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ css рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд░реЛрдд рдХрд╛ рдирдХреНрд╢рд╛
  • ES5 рдореЗрдВ рд╡рд╛рд╖реНрдкреЛрддреНрд╕рд░реНрдЬрди рдХреЗ рд▓рд┐рдП рдмреИрдмрд▓
  • рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ
  • рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЯреАрдПрд╕) рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( npx рд╣рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ):


npx create-react-library 

рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВред

рд╕реАрдПрд▓рдЖрд░ рдкреНрд░рд╢реНрди


рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдПрдХ рдЙрддреНрдкрдиреНрди рдФрд░ рддреИрдпрд╛рд░-рдЯреВ-рд╡рд░реНрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд┐рд▓рддреА рд╣реИред


рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде

рдХреНрд▓рд░ рдЯреНрд░реА


рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ ...

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


 npx npm-check -u 

рдПрдХ рдФрд░ рджреБрдЦрдж рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ example рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЗрдПрд╕ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ tsconfig.json рдФрд░ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, typescript рд╕реНрд╡рдпрдВ рдФрд░ рдореВрд▓ @types ) рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ react-scripts-ts рдкреИрдХреЗрдЬ рдХреЛ deprecated рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ deprecated рдФрд░ рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ react-scripts рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдм рд╕реАрдЖрд░рдП (рдЬрд┐рд╕рдХрд╛ рдкреИрдХреЗрдЬ react-scripts ) рдмреЙрдХреНрд╕ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдмреИрдмреЗрд▓ 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред


рдирддреАрдЬрддрди, рдореИрдВрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ react-scripts рдХреЛ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ react-scripts рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХреАред рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдЬреЗрд╕реНрдЯ рдХреЛ d.ts рдХрдореНрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ d.ts рдХреЛ рдЬрдирд░реЗрдЯ рдФрд░ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЧрдпрд╛ рдерд╛ (рдпрд╣ рд╕рдм рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ d.ts 7 рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреАрдПрд╕ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдФрд░ react-scripts рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред )ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ react-scripts рд▓рд┐рдП рдПрдХ eject рджрд┐рдпрд╛, рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рднреБрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред


tsdx


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдЯреЗрдирдПрдЧреЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдХреНрд░рд┐рдПрдХреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА - tsdx рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдпрд╣ рдХреНрд▓реА-рдпреВрдЯрд┐рд▓рд┐рдЯреА рднреА CRA рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдПрдХ рдХрдорд╛рдВрдб рдореЗрдВ рдЖрдкрдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд░реЛрд▓рдЕрдк, TS, Prettier, husky, Jest рдФрд░ React рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рдмрдирд╛рдПрдЧрд╛ред рдФрд░ рд░рд┐рдПрдХреНрдЯ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд░рд▓:


 npx tsdx create mytslib 

рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рдВрдХреБрд▓ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреАред CRL рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред CRL рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░ рд╢реВрдиреНрдп-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рдпрд╣реА рд╣реИ, рд░реЛрд▓рдЕрдк рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╣рдорд╕реЗ tsdx рдореЗрдВ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ (рдЬреИрд╕реЗ CRA рдХрд░рддрд╛ рд╣реИ)ред


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


рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрдирд╛


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ? рддреЛ, рдЪрд▓реЛ рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред npm init рдЪрд▓рд╛рдПрдВ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП package.json рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рд╡рд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо engines рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдиреЛрдб рдФрд░ рдПрдирдкреАрдПрдо рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдПрдХрддреНрд░рд┐рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ dist рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕реЗ files рдлреАрд▓реНрдб рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╣реЛрдВрдЧреЗ - рд╣рдо peerDependencies react-dom peerDependencies рдХреНрд╖реЗрддреНрд░ рдореЗрдВ react рдФрд░ react-dom peerDependencies рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг peerDependencies ред


рдЕрдм react рдФрд░ react-dom рдкреИрдХреЗрдЬ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ (рдЪреВрдВрдХрд┐ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдШрдЯрдХ рджреЗрдЦ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ) рдХреЛ devD dependencies (рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреА рддрд░рд╣) рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


 npm install --save-dev react react-dom @types/react @types/react-dom 

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


 npm install --save-dev typescript 

рдореБрдЦреНрдп рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ: tsconfig.json рдФрд░ tsconfig.test.json ред рд╣рдорд╛рд░рд╛ target es5 рдореЗрдВ рд╣реЛрдЧрд╛, рд╣рдо sourceMap рдЖрджрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЕрд░реНрдереЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╕реНрд░реЛрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ include рдХрд░рдиреЗ include рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдФрд░ node_modules рдФрд░ node_modules рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ exclude ред typings рдореЗрдВ package.json рд╣рдо typings рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ - dist/index ред


рд▓рд╛рдпрдмреНрд░реЗрд░реА рдХреЗ рд╕реНрд░реЛрдд рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП src рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЫреЛрдЯреА рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕реЗ .editorconfig , .editorconfig , рдПрдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓ рдФрд░ README.md ред


рд░реЛрд▓рдЕрдк


рд╣рдо рд╕реАрдЖрд░рдПрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рд░реЛрд▓рдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдХреБрд▓ рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕, рдореИрдВрдиреЗ CRL рдкрд░ рднреА рдЬрд╛рд╕реВрд╕реА рдХреАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рд░рд╛рдп рд╕реБрдиреА рдХрд┐ рд░реЛрд▓рдЕрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ (рдореЗрд░реЗ рд▓рд┐рдП CRA рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд░реЛрд▓рдЕрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛, рд╕рд░рд▓ рдФрд░ рд╕реБрдВрджрд░ рд╣реИред


рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛:


 npm install --save-dev rollup rollup-plugin-babel rollup-plugin-commonjs rollup-plugin-node-resolve rollup-plugin-peer-deps-external rollup-plugin-postcss rollup-plugin-typescript2 rollup-plugin-url @svgr/rollup 

Package.json рдореЗрдВ , рд╕рдВрдЧреНрд░рд╣рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдВрдбрд▓реЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдЦреЗрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ rollup рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ - pkgandode :


  "main": "dist/index.js", "module": "dist/index.es.js", "jsnext:main": "dist/index.es.js" 

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд░реЛрд▓рдЕрдк рдХрд░реЗрдВ редconfig.js
 import typescript from 'rollup-plugin-typescript2'; import commonjs from 'rollup-plugin-commonjs'; import external from 'rollup-plugin-peer-deps-external'; import postcss from 'rollup-plugin-postcss'; import resolve from 'rollup-plugin-node-resolve'; import url from 'rollup-plugin-url'; import svgr from '@svgr/rollup'; import pkg from './package.json'; export default { input: 'src/index.tsx', output: [ { file: pkg.main, format: 'cjs', exports: 'named', sourcemap: true }, { file: pkg.module, format: 'es', exports: 'named', sourcemap: true } ], plugins: [ external(), postcss({ modules: false, extract: true, minimize: true, sourceMap: true }), url(), svgr(), resolve(), typescript({ rollupCommonJSResolveHack: true, clean: true }), commonjs() ] }; 

Config рдПрдХ js рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдпрд╛ рдПрдХ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рд╡рд╕реНрддреБ рд╣реИред input рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдпрд╛рдд рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред output - output рдкрд░ рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ - рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрд┐рд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред


рдЗрд╕рдХреЗ рдмрд╛рдж рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рд╕реВрдЪреА рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рдЖрддрд╛ рд╣реИ
  • рд░реЛрд▓рдЕрдк-рдкреНрд▓рдЧ-рдкреАрдпрд░-рдбрд┐рдкреНрд╕-рдПрдХреНрд╕рдЯрд░реНрдирд▓ - рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП bundle рд╕реЗ peerDependencies рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ peerDependencies рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА peerDependencies рд╣реИред
  • рд░реЛрд▓рдЕрдк-рдкреНрд▓рдЧрдЗрди-рдкреЛрд╕реНрдЯрд╕реНрдХреИрд╕ - рдкреЛрд╕реНрдЯрд╕реАрдПрд╕ рдФрд░ рд░реЛрд▓рдЕрдк рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдВ рд╣рдо рд╕реАрдПрд╕рдПрд╕-рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реАрдПрд╕рдПрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рднреА рд╕реАрдПрд╕рдПрд╕ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ extract рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдШрдЯрдХреЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реАрдПрд╕рдПрд╕ рдЕрдВрдд рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреГрд╖реНрда рдкрд░ рд╣реЗрдб рдЯреИрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдПрд╕рдПрд╕ (рдЧреНрд░рд┐рдб, рд░рдВрдЧ, рдЖрджрд┐) рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реАрдПрд╕рдПрд╕-рдмрдВрдбрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЦреБрдж рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  • рд░реЛрд▓рдЕрдк-рдкреНрд▓рдЧрдЗрди-рдпреВрдЖрд░рдПрд▓ - рдЖрдкрдХреЛ рдЪрд┐рддреНрд░реЛрдВ рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • svgr - svg рдХреЛ React рдШрдЯрдХреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
  • рд░реЛрд▓рдЕрдк-рдкреНрд▓рдЧ-рдиреЛрдб- рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди - рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • рд░реЛрд▓рдЕрдк-рдкреНрд▓рдЧ-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2 - рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
  • рд░реЛрд▓рдЕрдк-рдкреНрд▓рдЧрдЗрди-рдХреЙрдордирдЬ - рдХреЙрдорди рдореЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрдордирд┐рдВрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдореЙрдбреНрдпреВрд▓реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ

scripts package.json рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ package.json рдирд┐рд░реНрдорд╛рдг ( "build": "rollup -c" ) рдХреЗ рд▓рд┐рдП рдлреАрд▓реНрдб рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╡реЙрдЪ-рдореЛрдб рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд╢реБрд░реВ рдХрд░реЗрдВ ( "start": "rollup -c -w && npm run prettier-watch" ) ред


рдкрд╣рд▓рд╛ рдШрдЯрдХ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рд╛рдЗрд▓


рдЕрдм рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рд▓рд┐рдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ - src/components/ExampleComponent ред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдШрдЯрдХ рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА - test.tsx , css , test.tsx рдЗрддреНрдпрд╛рджрд┐ред
рдЪрд▓реЛ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢реИрд▓рд┐рдпреЛрдВ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдШрдЯрдХ рдХреА tsx рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред


ExampleComponent.tsx
 /** * @class ExampleComponent */ import * as React from 'react'; import './ExampleComponent.css'; export interface Props { /** * Simple text prop **/ text: string; } /** My First component */ export class ExampleComponent extends React.Component<Props> { render() { const { text } = this.props; return ( <div className="test"> Example Component: {text} <p>Coool!</p> </div> ); } } export default ExampleComponent; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ src рдЖрдкрдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реАрдПрд╕рдПрд╕ рдФрд░ рдПрд╕рд╡реАрдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╕реАрдЖрд░рдПрд▓ рдореЗрдВ рдЭрд╛рдБрдХрд╛)ред


typings.d.ts
 /** * Default CSS definition for typescript, * will be overridden with file-specific definitions by rollup */ declare module '*.css' { const content: { [className: string]: string }; export default content; } interface SvgrComponent extends React.FunctionComponent<React.SVGAttributes<SVGElement>> {} declare module '*.svg' { const svgUrl: string; const svgComponent: SvgrComponent; export default svgUrl; export { svgComponent as ReactComponent }; } 

рд╕рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ - src/index.tsx ред рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рд╕реАрдПрд╕рдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ src/index.tsx рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдареАрдХ рд╣реИред


src / index.tsx
 import { ExampleComponent, Props } from './ExampleComponent'; import './export.css'; export { ExampleComponent, Props }; 

рдЕрдм рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - npm run build ред рдирддреАрдЬрддрди, rollup рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдмрдВрдбрд▓реЛрдВ рдореЗрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо dist рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдПрдВрдЧреЗред


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


Prettier рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг рдХреЛ рднреВрд▓ рдЬрд╛рдирд╛


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


 npm install --save-dev prettier 

рд╕реНрд╡рд░реВрдкрдг рдирд┐рдпрдореЛрдВ рдХреЗ рдереЛрдбрд╝рд╛ рд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝реЗрдВред


.prettierrc.json
 { "tabWidth": 3, "singleQuote": true, "jsxBracketSameLine": true, "arrowParens": "always", "printWidth": 100, "semi": true, "bracketSpacing": true } 

рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд┐рдпрдореЛрдВ рдХрд╛ рдЕрд░реНрде рджреЗрдЦреЗрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж WebStrom рдЦреБрдж рдХреЛ IDE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд░реВрдкрдг рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдкреНрд░реАрдЯрд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ред рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, /node_modules рдФрд░ /node_modules рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ .prettierignore рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ .prettierignore (рдкреНрд░рд╛рд░реВрдк .prettierignore рд╕рдорд╛рди рд╣реИ)ред рдЕрдм рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рдХреЗ prettier рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 prettier --write "**/*" 

рдЖрджреЗрд╢ рдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╣рд░ рдмрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдХреЛрдб рднреА рдкреВрд░реНрд╡ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реЛрдЧрд╛, precommit-hook рдкрд░ precommit-hook рд░рди рдХреЛ staged ( precommit-hook git add рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП git add ред рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рджреЛ рд╕рд╛рдзрдиреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╣рд╕реНрдХреА рд╣реИ , рдЬреЛ рдХрд┐рд╕реА рднреА рдЖрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, рдзрдХреНрдХрд╛ рджреЗрдиреЗ, рдЖрджрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рд▓рд┐рдВрдЯ-рд╕реНрдЯреЗрдЬреНрдб рд╣реИ , рдЬреЛ staged рдлрд╛рдЗрд▓реНрд╕ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд┐рдВрдЯрд░ рдЪрд▓рд╛ рд╕рдХрддреА рд╣реИред рд╣рдореЗрдВ рдЗрди рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд▓реЙрдиреНрдЪ рдХрдорд╛рдВрдб рдХреЛ package.json рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 npx mrm lint-staged 

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


 npm install --save-dev --save-exact onchange 

рдлрд┐рд░ рд╣рдо package.json рдореЗрдВ scripts рдлрд╝реАрд▓реНрдб рдХрдорд╛рдВрдб рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред package.json :


 "prettier-watch": "onchange 'src/**/*' -- prettier --write {{changed}}" 

рдЗрд╕ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╡рд┐рд╡рд╛рджреЛрдВ рдХреЛ рдмрдВрдж рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


ESLint рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдирд╛


ESLint рдПрдХ рдорд╛рдирдХ рдмрди рдЧрдпрд╛ рд╣реИ рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА js рдФрд░ ts рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рд╣рдорд╛рд░реА рднреА рдорджрдж рдХрд░реЗрдЧрд╛ред ESLint рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ, рдореБрдЭреЗ CRA рдкрд░ рднрд░реЛрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╕ CRA рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд▓рдЧ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреАрдПрд╕ рдФрд░ ESLint рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝реЗрдВ ( ESLint рдФрд░ ESLint рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП):


 npm install --save-dev eslint eslint-config-react-app eslint-loader eslint-plugin-flowtype eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks @typescript-eslint/eslint-plugin @typescript-eslint/parser babel-eslint eslint-config-prettier eslint-plugin-prettier 

ESLint рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ESLint рдХрд░реЗрдВред


.eslintrc.json
 { "extends": [ "plugin:@typescript-eslint/recommended", "react-app", "prettier", "prettier/@typescript-eslint" ], "plugins": [ "@typescript-eslint", "react" ], "rules": { "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-member-accessibility": "off" } } 

рдХрдорд╛рдВрдб lint - eslint src/**/* --ext .ts,.tsx --fix рдХреЛ package.json рд╕реЗ scripts рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЕрдм рдЖрдк npm рд░рди рд▓рд┐рдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрд╕реНрд▓рд┐рдВрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред


рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдлреЗрд╕рдмреБрдХ рд╕реЗ рдЬреЗрд╕реНрдЯ , рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рддрдм рд╕реЗ рд╣рдо TS рдХреЛ рдмреЗрдмреЗрд▓ 7 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ tsc рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдореЗрдВ ts-jest рдкреИрдХреЗрдЬ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 npm install --save-dev jest ts-jest @types/jest 

рд╕реАрдПрд╕рдПрд╕ рдпрд╛ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдпрд╛рдд рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдореЛрдХрд╛рдореА рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред __mocks__ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВред
styleMock.ts :


 module.exports = {}; 

fileMock.ts :


 module.exports = 'test-file-stub'; 

рдЕрдм jest config рдмрдирд╛рдПрдВред


jest.config.js
 module.exports = { preset: 'ts-jest', testEnvironment: 'node', moduleNameMapper: { '\\.(css|less|sass|scss)$': '<rootDir>/__mocks__/styleMock.ts', '\\.(gif|ttf|eot|svg)$': '<rootDir>/__mocks__/fileMock.ts' } }; 

рд╣рдо рдЗрд╕рдХреЗ ExampleComponent рдореЗрдВ рд╣рдорд╛рд░реЗ ExampleComponent рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг ExampleComponent ред


ExampleComponent.test.tsx
 import { ExampleComponent } from './ExampleComponent'; describe('ExampleComponent', () => { it('is truthy', () => { expect(ExampleComponent).toBeTruthy(); }); }); 

package.json рдХреА scripts рдлрд╝реАрд▓реНрдб рдореЗрдВ test - npm run lint && jest рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВред рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдВрдЯрд░ рдХреЛ рднреА рдЪрд▓рд╛рдПрдВрдЧреЗред рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдкрд╛рд╕ рд╣реЛрдВ - npm run test ред рдФрд░ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди ['src/**/*.test.(tsx|ts)'] , Rollup рдХреЙрдиреНрдлрд┐рдЧ рдкреНрд▓рдЧрдЗрди рдореЗрдВ exclude рдлрд╝реАрд▓реНрдб рдХреЛ exclude рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ - ['src/**/*.test.(tsx|ts)'] ред lint-staged - "pre-commit": "npm run test && lint-staged" рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ husky pre-commit hook рдореЗрдВ рд░рдирд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ "pre-commit": "npm run test && lint-staged" ред


рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд╕рд╛рде рдШрдЯрдХреЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛, рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╣рд╛рд░рдирд╛


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


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


рдХрд╣рд╛рдиреА рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдБ:


 npx -p @storybook/cli sb init 

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


 npm install --save-dev awesome-typescript-loader @types/storybook__react @storybook/addon-info react-docgen-typescript-loader @storybook/addon-actions @storybook/addon-knobs @types/storybook__addon-info @types/storybook__addon-knobs webpack-blocks 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ storybook рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдИ - .storybook рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдмреЗрд░рд╣рдореА рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╣рдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди addons рдФрд░ config рдХреЛ ts рдмрджрд▓рддреЗ рд╣реИрдВред рд╣рдо addons.ts рдлрд╝рд╛рдЗрд▓ рдореЗрдВ addons рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


 import '@storybook/addon-actions/register'; import '@storybook/addon-links/register'; import '@storybook/addon-knobs/register'; 

рдЕрдм, рдЖрдкрдХреЛ .storybook рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ .storybook рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


webpack.config.js
 module.exports = ({ config }) => { config.module.rules.push({ test: /\.(ts|tsx)$/, use: [ { loader: require.resolve('awesome-typescript-loader') }, // Optional { loader: require.resolve('react-docgen-typescript-loader') } ] }); config.resolve.extensions.push('.ts', '.tsx'); return config; }; 

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рд╕рднреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдРрдб-рдСрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП config.ts рдереЛрдбрд╝рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред


config.ts
 import { configure } from '@storybook/react'; import { addDecorator } from '@storybook/react'; import { withInfo } from '@storybook/addon-info'; import { withKnobs } from '@storybook/addon-knobs'; // automatically import all files ending in *.stories.tsx const req = require.context('../src', true, /\.stories\.tsx$/); function loadStories() { req.keys().forEach(req); } configure(loadStories, module); addDecorator(withInfo); addDecorator(withKnobs); 

рд╣рдо рдЕрдкрдиреА рдкрд╣рд▓реА story рдШрдЯрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ ExampleComponent


ExampleComponent.stories.tsx
 import * as React from 'react'; import { storiesOf } from '@storybook/react'; import { ExampleComponent } from './ExampleComponent'; import { text } from '@storybook/addon-knobs/react'; const stories = storiesOf('ExampleComponent', module); stories.add('ExampleComponent', () => <ExampleComponent text={text('text', 'Some text')} />, { info: { inline: true }, text: ` ### Notes Simple example component ### Usage ~~~js <ExampleComponent text="Some text" /> ~~~ ` }); 

рд╣рдордиреЗ рдРрдбрдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


  • knobs - рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдШрдЯрдХ рдореЗрдВ рдкреНрд░реЙрдкрд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ
  • рдЬрд╛рдирдХрд╛рд░реА - рдЖрдкрдХреЛ рдХрд╣рд╛рдиреА рдкреГрд╖реНрда рдкрд░ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╡рд┐рд╡рд░рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдЕрдм рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрдорд╛рдВрдб рдХреЛ рд╣рдорд╛рд░реЗ package.json рдЬреЛрдбрд╝рд╛ рд╣реИред npm run storybook рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕реНрдЯреЛрд░реАрдмреБрдХ http://localhost:6006 рдкрд░ рдЗрдХрдЯреНрдард╛ рдФрд░ рдЪрд▓реЗрдЧреАред Rollup рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ typescript рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ - 'src/**/*.stories.tsx' ред


рд╣рдо рд╡рд┐рдХрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ


рдЗрд╕рд▓рд┐рдП, рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдШреЗрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╕реЗ, рдЖрдк рдирдП рдШрдЯрдХреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ src/components рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдореЗрдВ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА - css, рдШрдЯрдХ рд╣реА tsx рдлрд╛рдЗрд▓, рдкрд░реАрдХреНрд╖рдг, рдХрд╣рд╛рдирд┐рдпрд╛рдВред рд╣рдо рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╣рдо рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рддреЗ рд╣реИрдВред рддреИрдпрд╛рд░ рдШрдЯрдХ рдХрд╛ рдЖрдпрд╛рдд-рдирд┐рд░реНрдпрд╛рдд index.ts рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред


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


 npm i -s git+https://github.com/jmorozov/react-library-example.git 

рдЗрд╕рд▓рд┐рдП рдХрд┐ node_modules рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдВрдЬреНрдпреВрдорд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ node_modules рдореЗрдВ node_modules рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреА рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рд╣реЛрддреА рд╣реИ, рдЖрдкрдХреЛ scripts рдлрд╝реАрд▓реНрдб рдореЗрдВ "prepare": "npm run build" рдХрдорд╛рдВрдб "prepare": "npm run build" рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдИрдбреАрдИ рдореЗрдВ рдСрдЯреЛ-рдкреВрд░рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛


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


рдЖрдк рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдХрдкреАрд╕ рднреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ ред


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

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


All Articles