
рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо, рдореИрдВ рдмреИрдХрдПрдВрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рджрд┐рди рд░рд┐рдПрдХреНрдЯ рдкрд░ рдШрдЯрдХреЛрдВ рдХреЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдерд╛ред рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЬрдм рд░рд┐рдПрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдореЗрдВ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рдерд╛, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд┐рдпрд╛ рдФрд░ рдпрд╣ рдЕрдирд╛рдбрд╝реА рдФрд░ рдЕрдирд╛рдбрд╝реА рдирд┐рдХрд▓рд╛ред рд╡рд░реНрддрдорд╛рди рд░рд┐рдПрдХреНрдЯ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреА рдкрд░рд┐рдкрдХреНрд╡рддрд╛ рдФрд░ рдореЗрд░реЗ рдмрдврд╝рддреЗ рдЕрдиреБрднрд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдирддреАрдЬрддрди, рдореЗрд░реЗ рдкрд╛рд╕ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдерд╛, рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рднреВрд▓рдиреЗ рдФрд░ рдПрдХ рдЬрдЧрд╣ рдкрд░ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдзреЛрдЦрд╛ рдкрддреНрд░ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рднреА рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ред
TL / DR: рд░реЗрдбреА-рдЯреВ-рд╕реНрдЯрд╛рд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЛ рдкрдХреНрд╖реЛрдВ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рд░реЗрдбреА-рдореЗрдб рд╕реНрдЯрд╛рд░реНрдЯрд░-рдХрд┐рдЯ, рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдпрд╛ рдХреНрд▓реА рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
- рд╕рдм рдХреБрдЫ рдЦреБрдж рд╣реА рдЗрдХрдЯреНрдард╛ рдХрд░реЛ
рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдПрдХ рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрдм рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдХреБрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬреЛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдирд┐рдпрдорд┐рдд рдЖрд╡реЗрджрди рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдкрд╣рд▓реЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкреИрдХреЗрдЬ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреА рдмрд╛рд░рд┐рд╢ рд╣реБрдИред рдирддреАрдЬрддрди, рдЙрд╕рдиреЗ рдЕрдкрдиреА рдЖрд╕реНрддреАрдиреЗрдВ рдЙрддрд╛рд░реАрдВ рдФрд░ рдЦреБрдж рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдПрдБ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдЪрд┐рдд рдЪреВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдХреНрд░рд┐рдПрдЯ рд░рд┐рдПрдХреНрдЯ рдРрдк (рд╕реАрдЖрд░рдП)ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( рд╣реИрдмреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рд╣реИ )ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреВрдЖрдИ-рдХрд┐рдЯ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╛рдорд╛рдиреНрдп рдПрд╕рдкреАрдП рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред рд╣рдореЗрдВ рдШрдЯрдХ рд╕реНрд░реЛрддреЛрдВ (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 import * as React from 'react'; import './ExampleComponent.css'; export interface Props { text: string; } 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 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
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдПрдВрдЧреЗред
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреА рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдХрд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдореИрдВ рдПрдХ рдХреЛрдб-рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдШреГрдгрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд▓рд╛рдкрд░рд╡рд╛рд╣ рдпрд╛ рдЧреИрд░-рдорд╛рдирдХ рд╕реНрд╡рд░реВрдкрдг рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдмрд╣рд╕ рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдЦрд╛рдорд┐рдпрд╛рдВ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рддрдп рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпреЗ рд╕реБрдзрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рдкреИрдХреЗрдЬ рд╣реИ - рдкреНрд░реЗрдЯрд┐рдпрд░ ред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
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') },
рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рд╕рднреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдРрдб-рдСрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП 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';
рд╣рдо рдЕрдкрдиреА рдкрд╣рд▓реА 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 рдХреЗ рдордзреНрдп рдореЗрдВ, рдЖрдк рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдХрд╛рд╕ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдШрдЯрдХреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛, рдФрд░ рдореИрдиреБрдЕрд▓ рдореЛрдб рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдкреИрдХреЗрдЬ рдФрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рдЦреЛрджрдирд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдорджрдж рд╕реЗ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЖрдк рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдХрдкреАрд╕ рднреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдкрд░рдо рд╕рддреНрдп рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдЧреЗ рдХреЗ рдЕрдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╕реНрдд рд░рд╣рддрд╛ рд╣реВрдВред рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрдХреЗрдЬ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдореЗрдВ рднреА рд╕рдлрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреА рд░реЗрд╕рд┐рдкреА рдХрдореЗрдВрдЯ рдореЗрдВ рд╢реЗрдпрд░ рдХрд░реЗрдВрдЧреЗред рд╣реИрдкреНрдкреА рдХреЛрдбрд┐рдВрдЧ!