React: рд╣реБрдХ + рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЕрдХреНрддреВре░ 2018  ┬╖  285рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдЦреЛрдЬ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП: рдХреГрдкрдпрд╛ рдкрд╣рд▓реЗ рдЗрд╕ рдкреЗрдЬ рдХреЛ рдкрдврд╝реЗрдВ ред рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ!

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рд╡реГрджреНрдзрд┐

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ рдЧрд▓рддреА рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдереЗред

рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:
hooks can only be called inside the body of a function component

рдЬреЛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрд╕рд▓реА рдХрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ред

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рд╕рд╣реА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдПрдВред рд╢рд╛рдпрдж рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдРрдк рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдФрд░ рдХрд╣реЗрдВ рдХрд┐ рдпрд╣ рдмрдЧ рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 alias: {
        react: path.resolve('./node_modules/react')
      }

рдореЗрд░реЗ рдореБрдЦреНрдп рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ resolve рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЧрд▓рддреА рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд╣реИ: https://github.com/facebook/react/issues/2402

рд╕рднреА 285 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рддреЛ рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП: рдЖрдк рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдПрдХ рд╕реЗ рдЕрд▓рдЧ react рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдПрдХ рд╣реБрдХ (рдЬреИрд╕реЗ useState ) рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ?

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

рдЕрдиреНрдпрдерд╛ рд╣рдо рд╢рд╛рдпрдж рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИред

рд╣рд╛рдВ, рдореИрдВрдиреЗ React1 === React2 рдХреА рддреБрд▓рдирд╛ рдХреА рдФрд░ рдпрд╣ false рдерд╛ (React1 index.js рд╕реЗ рд╣реИ рдФрд░ React2 рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣реИ)ред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╣реБрдХ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

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

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

Lerna monorepos рднреА рдЗрд╕рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдХреЛ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдореНрд▓рд┐рдВрдХреНрдб рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдордп npm-link-shared рдФрд░ рдПрдХ prestart npm рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ (рд╣реИрдХреА) рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреИрдХреЗрдЬ рдХреА react рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдгред

"prestart": "npm-link-shared ./node_modules/<other package>/node_modules . react"

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 alias: {
        react: path.resolve('./node_modules/react')
      }

рдореЗрд░реЗ рдореБрдЦреНрдп рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ resolve рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЧрд▓рддреА рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд╣реИ: https://github.com/facebook/react/issues/2402

@mpeyper рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

@apieceofbart рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдпреЗ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рд╣реА рдмрдВрдбрд▓ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЕрдЧрд░ рд░рд┐рдПрдХреНрдЯ рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдВрдбрд▓ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЛрдо рддрддреНрд╡реЛрдВ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд┐рдПрдХреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ: https://medium.jonasbandi.net/hosting-multiple-react-applications-on- рд╡рд╣реА-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-c887df1a1fcd

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдПрдХ рд╕рд╛рдорд╛рдиреНрдп "рдПрдХреАрдХрд░рдг" рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓-рд╕реНрдкрд╛ рдореЗрдЯрд╛-рдлреНрд░реЗрдорд╡рд░реНрдХ (https://github.com/CanopyTax/single-spa) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдареАрдХ рдЙрд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, npm-link рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкрдиреЗ рджрдо рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реБрдХ рдХреЛ рддреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣реА рдЕрдиреБрдкрдпреЛрдЧреА hooks can only be called inside the body of a function component рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред @apieceofbart рдХреЗ рдЙрдкрдирд╛рдо рд╕рдорд╛рдзрд╛рди рдиреЗ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣рд╛рдВ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП npm link рдПрдХ рдкреИрдХреЗрдЬ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ babel-plugin-module-resolver рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ:
Could not find module './node_module/react'
рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ "react": "^16.7.0-alpha.2" . рдореЗрдВ рдХреИрд░реЗрдЯ рд╣рдЯрд╛рдХрд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛
рдпрд╣рд╛рдБ рдкреВрд░реА рдЯрд┐рдкреНрдкрдгреА рд╣реИ: https://github.com/facebook/react/issues/14454#issuecomment -449585005

рдореИрдВ рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ package.json рдореЗрдВ рд╕рдВрдХрд▓реНрдк рдХреЛ рдордЬрдмреВрд░ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ:

  "resolutions": {
    "**/react": "16.7.0-alpha.2",
    "**/react-dom": "16.7.0-alpha.2"
  },

рдореЗрд░рд╛ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ!!

рдмрд╕ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдЯ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛ред

рд╣рдо react-rails рд░рддреНрди рдХреЗ рд╕рд╛рде рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░реЗрд▓ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рд░реЗрд▓ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣рд░ рдмрд╛рд░ рдРрдк рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдзрдХреЗрд▓рдиреЗ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣реА рдереА, рдХреНрдпреЛрдВрдХрд┐ рдЯрд░реНрдмреЛрд▓рд┐рдВрдХреНрд╕ <head> рд╕реЗ рдирдП рдЬреЗрдПрд╕ рдмрдВрдбрд▓ рдХреЛ рд╣рдерд┐рдпрд╛ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдиреЗ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг рд▓реЛрдб рдХрд┐рдпрд╛ред рд╕рдорд╛рдзрд╛рди рдпрд╣ рдерд╛ рдХрд┐ рдЯрд░реНрдмреЛрд▓рд┐рдВрдХ рдПрдХ рдкреВрд░реНрдг рдкреГрд╖реНрда рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВ рдЬрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдмрдВрдбрд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ: https://github.com/turbolinks/turbolinks#reloading -when-assets-change

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

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

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

рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рджреЗрд╡ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдПрдХ рдкреВрд░реНрдг "рдлрд┐рдХреНрд╕" рдХреЗ рдмрджрд▓реЗ рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд░реЗрдЧрд╛ред

рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рд░рд┐рд▓реАрдЬ рдкрд░ рдмрдзрд╛рдИ! рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдЕрджреНрднреБрдд рд╕реЗрдЯ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдЦреБрд▓реЗ рдкреАрдЖрд░ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рдмрд╕ # 14690 рдорд┐рд▓рд╛ рдЬреЛ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж @threepointone!

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

@dotlouis рд╣рд╛рдБ, рдпрд╣ рдЕрднреА рддрдХ рдПрдХ рдЕрджреНрдпрддрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИ рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдПрдХ рджрд░реНрдж рд╣реИред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рднреА рдРрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ "react": "link:../my-library/node_modules/react" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

  • рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВ рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
  • рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрджрд░реНрдн рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрдЪрдУрд╕реА рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ
  • рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдЪрд╛рд▓ рдЪрд▓реА
  • рдореИрдВ рдХрд╛рд░рдг рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВ

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

<GoodOldContext iam={a class component}>
    <BrandNewHook>
             errors : Hooks can only be called inside the body of a function component #35
     </BrandnewHook>
</GooOldContext>
export withGoodOldContext.consumer(here component)

рдореИрдВ рдПрдХ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ example рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ рдЬреЛ create-react-app рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

package.json рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ:

{
    ...
    "dependencies": {
        "my-component": "link:..",
        "react": "link:../node_modules/react",
        "react-dom": "link:../node_modules/react-dom",
        "react-scripts": "2.1.3"
    },
    ...
}

@taylorham @DylanVann рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЕрднреА рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдореБрдЭреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЗрд╕ link: рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд" (рдПрдХ рдЕрдиреНрдп рдбреАрдкреА рдЬреЛ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) react-dom рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдореБрдЭреЗ "react": "link:../some/path" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП UI рдкреИрдХреЗрдЬ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдЖрдкрдХреЛ UI (рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ) рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реЗрдВрдбрд░рдЯреЙрд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдореЗрдВ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рд╣реИред

рдмреЗрд╣рддрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП - https://github.com/facebook/react/issues/14257

рдзрдиреНрдпрд╡рд╛рдж @theKasheyред @gaearon рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдХреЛ рджреЛ рдмрд╛рд░ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдореБрдЭреЗ Lerna рдХрд╛рд░реНрдпрд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдареАрдХ рд╕реЗ рд╕рд┐рдорд▓рд┐рдВрдХ рд╣реЛрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдБ рднреА рдереАрдВред рдпрд╣ рд╡рд╣ рддрд░рдХреАрдм рдереА рдЬрд┐рд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рдерд╛ред рдмрд╛рдж рдореЗрдВ npm install рдЪрд▓рд╛рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

"dependencies": {
    "react-dom": "file:../common/node_modules/react-dom",
    "react": "file:../common/node_modules/react"
}

рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рдпрд╛рд░реНрди рд╕рдВрдХрд▓реНрдк рдЖрдорддреМрд░ рдкрд░ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ "рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдЯреВрд▓" рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ

  • рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП aliases рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдмрд╕ "рд╣рд╛рд░реНрдб" рдЙрд░реНрдл тАЛтАЛтАЛтАЛрд╕рдм рдХреБрдЫ рдмрддрдЦ рдЬреИрд╕реЗ react рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
  resolve: {
    extensions: ['.ts', '.tsx', '.js', '.jsx'],
    alias: {
     react: path.resolve(path.join(__dirname, './node_modules/react')),
   }
  • рдкрд╛рд░реНрд╕рд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ package.json - https://parceljs.org/module_resolution.html#aliases рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
  • рдиреЛрдбрдЬ (рдиреЙрди рдЬреЗрд╕реНрдЯ) рдХреЗ рд▓рд┐рдП рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
import {setAliases} from 'require-control';
setAliases({
  'react': path.resolve(path.join(__dirname, './node_modules/react'))
});
  • рдордЬрд╛рдХ рдХреЗ рд▓рд┐рдП moduleNameMapper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
"jest": {
    "moduleNameMapper": {
      "^react$": "<rootDir>/node_modules/$1",
    },

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

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

Node.js рдЗрдВрдЯрд░реНрдирд▓ рдХрд╛рдлреА рд╕реАрдзреЗ рд╣реИрдВ - рд╕рднреА рдЬреНрдЮрд╛рдд рдЙрдкрд╕рд░реНрдЧреЛрдВ (рдЬреИрд╕реЗ node_modules ) рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдЬреИрд╕реЗ js , ts , json ) рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

yarn pnp рдРрд╕рд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред yarn workspaces , рдЬреЛ _hoist_ рдкреИрдХреЗрдЬ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдмрд┐рдирд╛ рдХрд┐рд╕реА "рдЬрд╛рджреВ" рдХреЗ рднреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

npm workspaces ? рдЕрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

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

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

рдпрд╣рд╛рдБ рдореЗрд░реА рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

рдкрд░рд┐рдпреЛрдЬрдирд╛
|
+-- рдиреЛрдб_рдореЙрдбреНрдпреВрд▓
|
+-- рдирд┐рд░реНрдорд╛рдг
| |
| +-- index.js
|
+-- рдЙрджрд╛рд╣рд░рдг (рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк)
| |
| +-- рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди

рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдЕрдкрдиреЗ package.json рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ @jmlivingston рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ 'рдореБрдЦреНрдп' рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЦреАрдВрдЪрдирд╛, рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

  "dependencies": {
    "react": "file:../node_modules/react",
    "react-dom": "file:../node_modules/react-dom",
    "react-scripts": "2.1.5"
  },

рдЕрдм рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВ npm install рднрд╛рдЧрд╛ рдФрд░ рдлрд┐рд░ рдореИрдВ npm link рднрд╛рдЧрд╛ , рдЗрд╕рдиреЗ рдЪрд╛рд▓ рдЪрд▓реАред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╕рдордп рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди? рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЬрд┐рддрдиреА рд╣реЛ рд╕рдХреЗ рдЙрддрдиреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд░рд┐рдПрдХреНрдЯ/рд░рд┐рдПрдХреНрд╢рди-рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ 16.8.3. рдпрд╣ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ 2 рджрд┐рди рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛, рдмрд╣реБрдд рд╕рд╛рджрд╛ред рдореИрдВ useSpring() рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб.div рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдзрдиреНрдпрд╡рд╛рдж

@ рдЧреБрд░реБ-рдлреНрд▓реЛрд░рд┐рдбрд╛ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рднреА рдореМрдХреЗ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рди рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк) рдФрд░ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ render рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рдеред рдЗрд╕реЗ component рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдЪрд╛рд▓ рдЪрд▓реАред

рдкрд╣рд▓реЗ:

<Route path="/signup" render={SignUp} />

рдмрд╛рдж рдореЗрдВ:

<Route path="/signup" component={SignUp} />

рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛..!

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

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдирдкреАрдПрдо рд▓рд┐рдВрдХ (рдкрд╛рд░реНрд╕рд▓ рдРрдк рдореЗрдВ) рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, npm link .../whatever/node_modules/react рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреИрд░-рд╣реБрдХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

@tj рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ ssr рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкреИрдХреЗрдЬ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди рд╣реИ

@ рд╕реАрдбреЗрди рдЖрд╣ рдореИрдВ рдПрд╕рдПрд╕рдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╕рд┐рд░реНрдл рдПрдХ рдПрд╕рдкреАрдП рдбрдмреНрд▓реНрдпреВ/рдкрд╛рд░реНрд╕рд▓ред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ ui pkg рд╣реИ рдФрд░ рдПрдХ рдРрдк рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рджреЛрдиреЛрдВ рдХрд╛ рдПрдХ рд╣реА react рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдкрд╛рд░реНрд╕рд▓ рдЪрд┐рдВрддрд╛ рд╣реИ

@tj рдУрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБред рдлрд┐рд░ рдЗрд╕ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рд╢реБрднрдХрд╛рдордирд╛рдПрдБред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдкреНрддрд╛рд╣ рдмрд┐рддрд╛рдпрд╛

рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди?

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

рдЬрдм рд▓реЛрдЧ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╡рд┐рд╢реЗрд╖ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рднреА "рдареАрдХ" рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ npm рд▓рд┐рдВрдХ (рдПрдХ рдкрд╛рд░реНрд╕рд▓ рдРрдк рдореЗрдВ) рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, npm рд▓рд┐рдВрдХ .../рдЬреЛ рднреА/рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреИрд░-рд╣реБрдХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрдХ рдЫреЛрдЯрд╛ рд░реЗрдкреНрд░реЛ рдХреЗрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рд╣реИ?

@gaearon рдХрд░реЗрдВрдЧреЗ, рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдЦреБрд╢реА рдХреА рдмрд╛рдд рд╣реИ, require-control рдиреЗ yarn link + SSR + рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ 4 рдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж @theKashey

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЕрд╕рдлрд▓ рд░рд╣рд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдерд╛ рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдпрд╛рдд рдХреА рдХреЗрд╕ рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдерд╛ ред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдерд╛:

import React from 'react'

рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ:

import React from 'React'

рдХреБрдЫ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо (рдпреВрдирд┐рдХреНрд╕, рдУрдПрд╕рдПрдХреНрд╕) рдкрд░ рдпрд╣ рд╡реЗрдмрдкреИрдХ рдХреЛ рд░рд┐рдПрдХреНрдЯ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдЗрд╕рдиреЗ рдЕрддреНрдпрдзрд┐рдХ рднреНрд░рдо рдкреИрджрд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИ; рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдкрд░реАрдХреНрд╖рдг рднреА рдареАрдХ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЙрдХреНрд╕ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдХрд╛рд░рдг рд╡реЗрдмрдкреИрдХ DllPlugin рдерд╛ред рдореЗрд░реЗ рд╡рд┐рдХреНрд░реЗрддрд╛ рдбреАрдПрд▓рдПрд▓ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реВрдЪреА рдореЗрдВ react рдФрд░ react-dom рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдереЗ рдЬрд┐рдирдХреЗ рд▓рд┐рдП react рдпрд╛ react-dom рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдбреАрдПрд▓рдПрд▓ рдореЗрдВ react рдФрд░ react-dom рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдЬреЗрд╕рди рдлрд╝рд╛рдЗрд▓ рдХреА рддреНрд╡рд░рд┐рдд рдЬрд╛рдВрдЪ рдЗрд╕реЗ рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдореИрдВ рдХреЛрдб рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдпрд╣ рдЗрд╕реЗ node_modules рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рдЙрдирдХреА рдбреАрдПрд▓рдПрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

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

рдореИрдВ react-hot-loader рд╕реЗ 4.6.0 . рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛

рдЗрд╕рдиреЗ рдкрд╛рд░реНрд╕рд▓ рдореЗрдВ npm link рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдЪрд╛рд▓ рдЪрд▓реА:

"alias": {
        "react": "../ui/node_modules/react",
        "react-dom": "../ui/node_modules/react-dom"
    }

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

@theKashey OMG рдпрд╛рд░, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдореИрдВрдиреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ: package.json deps рдХреЗ рд╕рд╛рде рдЙрд▓рдЭрди, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ "рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ" рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛, рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ * рд╣реБрдХ рдХрд╛ рдирд┐рдпрдо рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ (рдЬреЛ рдореИрдВ рд╣реВрдВ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рд╡рд┐рдХрд▓реНрдк :

alias: {
      react: path.resolve(path.join(__dirname, './node_modules/react')),
      'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
    }

рд╣рдореЗрдВ рдЕрдкрдиреЗ рдРрдк-рдП-рдП-рд▓рд┐рдм рдореЗрдВ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдЧрд▓реЗ рдПрд▓рд╡реАрдПрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдкрд░рд┐рдгрд╛рдореА webpack.config.js рд╣реИ

npm ls react

рд░рд┐рдЯрд░реНрди

[email protected] D:\code\project
`-- (empty)

рдореЗрд░реЗ рд▓рд┐рдП

console.log(window.React1 === window.React2) рд╕рдЪ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ SSR рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдЕрджреНрдпрддрдиред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ-рдЕрдкреЛрд▓реЛ рдХреЗ рдПрд╕рдПрд╕рдЖрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛ (https://github.com/apollographql/react-apollo/issues/2541)
2.3.1 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдирдорд╕реНрдХрд╛рд░ рджреЛрд╕реНрддреЛрдВ, рд╣рдорд╛рд░реА рдЯреАрдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рджрд┐рди рд▓рдЧреЗред

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди

рд╕рдорд╛рдзрд╛рди рдП: рдЬреИрд╕рд╛ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ

  alias: {
      react: path.resolve(path.join(__dirname, './node_modules/react')),
      'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
    }

рд╕рдорд╛рдзрд╛рди рдмреА: тАЛтАЛрдореЙрдбреНрдпреВрд▓ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рд╕рдВрдХрд▓реНрдк.рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХреЗрд╕ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдФрд░ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ

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

рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛:

-рдЧреИрд░ рдореЛрдиреЛрд░реЗрдкреЛ:

  • рд╕рд┐рдореНрд▓рд┐рдВрдХреНрдб рдкреИрдХреЗрдЬ рд╣реИрдВ
  • рд╕рд┐рдореНрд▓рд┐рдВрдХреНрдб рдкреИрдХреЗрдЬ рдиреЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШрдЯрдХ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкреЗрдЬ рдмрдирд╛рдирд╛

    • рдЕрдЧрд░ рдПрдХ monorepo . рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ

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

рдЙрджрд╛рд╣рд░рдг

рд╕рдВрд░рдЪрдирд╛

- mono repo root
  - packages
    - ComponentWithHooks (peerDependency: react@^16.8.1)
    - ProductA (dependency: ComponentWithHooks, dependency: react@^16.8.4)
    - ProductB (dependency: react@^16.8.1)

рдПрдХ рдмрд╛рд░ рдХрд╛рд░реНрдпрд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛

- mono repo root
  - node_modules
    - react(16.8.1)
  - packages
    - ComponentWithHooks
      - node_modules (empty)
    - ProductA
      - node_modules
        - react(16.8.4)
    - ProductB
      - node_modules (empty)

рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╡реЗрдмрдкреИрдХ рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде ProductA рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ 2 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдВрдЧреЗред

ProductA рдореЗрдВ рдХреЛрдб, ProductA/node_modules/react рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЖрдпрд╛рддрд┐рдд ComponentWithHooks mono repo root/node_modules/react рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред

рдХреНрдпреЛрдВ? npm рдХреЗ рд▓реБрдХрдЕрдк рдирд┐рдпрдо рдпрд╛рдж рд░рдЦреЗрдВ? рдпрджрд┐ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд╣реАрдВ рдвреВрдВрдв рдкрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ ...

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

рдореБрдЭреЗ рдпрд╛рд░реНрди рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдЬрдирди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ - https://github.com/mwarger/yarn-workspace-hooks-repro

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ component-library рд╣реИ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкрд╛рд░реНрд╕рд▓ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред example-demo рд╡рд╣ рд╣реИ рдЬреЛ рдЗрд╕ component-library рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдПрдХ рддрд╛рдЬрд╝рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ CRA рдРрдк рд╣реИред рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ рдпрд╛рд░реНрди рдХреЗ рд╕рд╛рде рдлрд╣рд░рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ index.tsx рдореЗрдВ рдЬреЛ React.useEffect рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЗрд╕ GitHub рдореБрджреНрджреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рд╣реБрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рддрдХ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, component-library/src/index.tsx . рдореЗрдВ 7-9 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рдореНрдмрджреНрдз рдХрд░реЗрдВ

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдХрд┐рд╕реА рднреА рдХрджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд▓рд╛рд╣ рджреЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╢реБрдХреНрд░рд┐рдпрд╛!

рдЕрдиреБрд╡рд░реНрддреА рд╕рдВрдкрд╛рджрди: рдиреАрдЪреЗ рд╕реБрдЭрд╛рдИ рдЧрдИ рдбреАрдмрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдореЗрд░реЗ рд▓рд┐рдП true рдкреНрд░рд┐рдВрдЯ рдХрд░рддреА рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред

// Add this in node_modules/react-dom/index.js
window.React1 = require('react');

// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);

рдореБрдЭреЗ рдХрдИ рдШрдВрдЯреЗ рд▓рдЧ рдЧрдП, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдиреЛрдЯ рд▓реЗрдирд╛ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдореЗрдВ <script defer src="./dist/bundle.js" /> рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реА рд╣реИ, рдЬреЛ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рднреА рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ window.React1 == window.React2 рдЪреЗрдХ true рд▓реМрдЯрд╛рддрд╛ рд╣реИред

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

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдРрдк рд╣реИ рдЬреЛ npm рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдерд╛ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрд┐рдиреНрд╣реЗрдВ react рдФрд░ react-dom рдХреЛ рджреЗрд╡ рдФрд░ рд╕рд╣рдХрд░реНрдореА рдбрд┐рдкреЛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

  1. рдРрдк рд╕реЗ: cd node_modules/react && npm link
  2. рдРрдк рд╕реЗ: cd node_modules/react-dom && npm link react
  3. рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рд╕реЗ: npm link react

рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рддреНрд░реБрдЯрд┐ рдЪреЗрддрд╛рд╡рдиреА рдкреГрд╖реНрда рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХрд┐ "рд╣реБрдХ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдпрд╛рдд рдХреЛ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдпрд╛рдд"ред

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрд╢рд┐рд╢реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдорд╛рдирдХ webpack4/babel рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, preset-env рдФрд░ preset-react рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рдеред рдореЗрд░реЗ рд░рд┐рдПрдХреНрдЯ/рд░рд┐рдПрдХреНрд╢рди-рдбреЛрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдпрд╛рд░реНрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 16.8.4 рдкрд░ рдкрд┐рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рдКрдкрд░ рд╕реЗ window.React1 === window.React2 рдЪреЗрдХ рднреА true рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред

рдпрд╣ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкрд░ рд╣реИ:

import React, { useState } from "react";

function MyComp() {
  const [hello] = useState(0);

  return <div>HELLO {hello}</div>;
}
export default MyComp;

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рджреВрд╕рд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЛ рдУрдкреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ react.development.js:88 Uncaught Invariant Violation: Hooks can only be called inside the body of a function component. рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдРрдк рд╣реИ рдЬреЛ npm рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдерд╛ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрд┐рдиреНрд╣реЗрдВ react рдФрд░ react-dom рдХреЛ рджреЗрд╡ рдФрд░ рд╕рд╣рдХрд░реНрдореА рдбрд┐рдкреЛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

  1. рдРрдк рд╕реЗ: cd node_modules/react && npm link
  2. рдРрдк рд╕реЗ: cd node_modules/react-dom && npm link react
  3. рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рд╕реЗ: npm link react

рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рддреНрд░реБрдЯрд┐ рдЪреЗрддрд╛рд╡рдиреА рдкреГрд╖реНрда рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХрд┐ "рд╣реБрдХ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдпрд╛рдд рдХреЛ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдпрд╛рдд"ред

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

рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИред

@inverherive рдХреА рдереЛрдбрд╝реА рд╕реА рдорджрдж рд╕реЗ рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ enzyme-adapter-react-16 рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдЬрдмрдХрд┐ рд╣рдордиреЗ react-test-renderer рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг (16.8.4) рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╣реБрдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рд╣реИ, рд╣рдордиреЗ npm ls react-test-renderer рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдпрд╛ рдХрд┐ enzyme-adapter-react-16 (1.11.2) рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг ) рдХреА [email protected] рдХреА рдЖрдВрддрд░рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдереА, рдЬреЛ рд╣реБрдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

тФЬтФАтФм [email protected]
тФВ тФФтФАтФА [email protected] 
тФФтФАтФА [email protected]

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА @chulanovskyi рдХреЗ рд╕реБрдзрд╛рд░реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ package.json рдореЗрдВ react-test-renderer рд╕рдВрдХрд▓реНрдк рдЬреЛрдбрд╝реЗред рдпрд╣ react-test-renderer рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ "16.8.4" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред

  "resolutions": {
    "react-test-renderer": "16.8.4"
  },

рдпрд╣ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдерд╛, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред @chulanovskyi рдФрд░ @theKashey рдХреЛ рднреА рдЙрдирдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

@ajcrews (рдореИрдВрдиреЗ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди) рдореИрдВ npm link рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдФрд░ рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ react peerDependencies рдФрд░ devDependencies рдореЗрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреНрд░реБрдЯрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдареАрдХ рдХрд░реЗрдВред рдЕрдЪреНрдЫрд╛ рдЦреЛрдЬ!

рдореИрдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реАрдЖрд░рдП рдРрдк рдХреЗ рдЕрдВрджрд░

CRA рдРрдк рдХреЗ package.json рдореЗрдВ рдореБрдЭреЗ рдореВрд▓ рдШрдЯрдХ рдХреЗ package.json рд╕реЗ "рдЙрдзрд╛рд░" рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

"dependencies": {
  "react": "link:../node_modules/react",
  "react-dom": "link:../node_modules/reac-dom",
}

рдпрд╣ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдерд╛, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред @chulanovskyi рдФрд░ @theKashey рдХреЛ рднреА рдЙрдирдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@ рдзрд╛рди-рд╣реИрдорд┐рд▓реНрдЯрди рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рдмрд╛рдж рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рд▓реЙрдХрдлрд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдореБрдЭреЗ рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрд╣рд╛рдВ yarn рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛ react-test-renderer ред рдЕрдкрдиреЗ рд▓реЙрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдереЛрдбрд╝реА рд╕реА рд╕рд░реНрдЬрд░реА рд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

yarn add -D react-test-renderer

-react-test-renderer@^16.0.0-0, react-test-renderer@^16.1.1:
+react-test-renderer@^16.0.0-0:
  version "16.8.4"
  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
  integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
  dependencies:
    object-assign "^4.1.1"
    prop-types "^15.6.2"
    react-is "^16.8.4"
    scheduler "^0.13.4"

+react-test-renderer@^16.8.5:
+  version "16.8.5"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.5.tgz#4cba7a8aad73f7e8a0bc4379a0fe21632886a563"
+  integrity sha512-/pFpHYQH4f35OqOae/DgOCXJDxBqD3K3akVfDhLgR0qYHoHjnICI/XS9QDwIhbrOFHWL7okVW9kKMaHuKvt2ng==
+  dependencies:
+    object-assign "^4.1.1"
+    prop-types "^15.6.2"
+    react-is "^16.8.5"
+    scheduler "^0.13.5"

рдПрдХ yarn check рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╣реА рдЪреЗрддрд╛рд╡рдиреА рджреЗ рджреЗрдЧрд╛

$ yarn check
warning "enzyme-adapter-react-16#react-test-renderer@^16.0.0-0" could be deduped from "16.8.5" to "[email protected]"

рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШрдЯрд╛рдПрдВ:

-react-test-renderer@^16.0.0-0:
-  version "16.8.4"
-  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
-  integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
-  dependencies:
-    object-assign "^4.1.1"
-    prop-types "^15.6.2"
-    react-is "^16.8.4"
-    scheduler "^0.13.4"
-
-react-test-renderer@^16.8.5:
+react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.5:

рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд┐рдирд╛ рдХрд┐рд╕реА resolutions рдпрд╛ webpack рдЙрд░реНрдл тАЛтАЛрд╢реАрдирд┐рдЧрдиреНрд╕ рдХреЗ react-test-renderer рдХрд╛ рдПрдХрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдФрд░ create-react-app рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП facebook/create-react-app#6207 рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ

рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рдпрд╛рд░реНрди рд╕рдВрдХрд▓реНрдк рдЖрдорддреМрд░ рдкрд░ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ "рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдЯреВрд▓" рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ

  • рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП aliases рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдмрд╕ "рд╣рд╛рд░реНрдб" рдЙрд░реНрдл тАЛтАЛтАЛтАЛрд╕рдм рдХреБрдЫ рдмрддрдЦ рдЬреИрд╕реЗ react рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
  resolve: {
    extensions: ['.ts', '.tsx', '.js', '.jsx'],
    alias: {
     react: path.resolve(path.join(__dirname, './node_modules/react')),
   }
  • рдкрд╛рд░реНрд╕рд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ package.json - https://parceljs.org/module_resolution.html#aliases рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
  • рдиреЛрдбрдЬ (рдиреЙрди рдЬреЗрд╕реНрдЯ) рдХреЗ рд▓рд┐рдП рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
import {setAliases} from 'require-control';
setAliases({
  'react': path.resolve(path.join(__dirname, './node_modules/react'))
});
  • рдордЬрд╛рдХ рдХреЗ рд▓рд┐рдП moduleNameMapper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
"jest": {
    "moduleNameMapper": {
      "^react$": "<rootDir>/node_modules/$1",
    },

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред

@ajcrews
рд╢реБрдХреНрд░рд┐рдпрд╛! рдореЗрд░реЗ рд▓рд┐рдП рд╢рд╛рдирджрд╛рд░ рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

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

https://github.com/PerfectionCSGO/reeee

рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ 3 рджрд┐рдиреЛрдВ рд╕реЗ рдЕрдкрдирд╛ рд╕рд┐рд░ рдХрд╛рдЯ рд░рд╣рд╛ рд╣реВрдВред рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрд░рдПрдЪрдПрд▓ рд╕рдорд╕реНрдпрд╛ рдереА рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

npm ls рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдлрд┐рдХреНрд╕ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ + рд╡реЗрдмрдкреИрдХ рдЙрдкрдирд╛рдо рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

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

  "dependencies": {
    "i18next": "^15.0.9",
    "i18next-browser-languagedetector": "^3.0.1",
    "react": "^16.8.6",
    "react-dom": "npm:@hot-loader/react-dom",
    "react-hot-loader": "^4.8.2",
    "react-i18next": "^10.6.1",
    "source-map-support": "^0.5.11",
    "tslint": "^5.15.0"
  },
  "devDependencies": {
    "@babel/core": "^7.4.3",
    "@babel/preset-react": "^7.0.0",
    "@babel/preset-typescript": "^7.3.3",
    "@types/react": "^16.8.12",
    "@types/react-dom": "^16.8.3",
    "electron": "^4.1.3",
    "electron-builder": "20.39.0",
    "electron-webpack": "^2.6.2",
    "electron-webpack-ts": "^3.1.1",
    "typescript": "^3.4.1",
    "webpack": "^4.29.6"
  }

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдореБрдЭреЗ рдПрдХ рд╕реВрдЪрдХ рджреЗ тАЛтАЛрд╕рдХрддрд╛ рд╣реИ ...

рдЬрдм рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-l18next рдХреЛ mobx-react-lite рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╡рд╣реА рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред

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

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

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЗрд╡рд▓ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рдкреГрд╖реНрда рдкреБрдирдГ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬрд╛рдВрдЪ рдХрд░ рддрдп рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╣реА рд▓реЛрдб рд╣реЛ рдЪреБрдХреА рд╣реИ рдпрд╛ рдирд╣реАрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреА 'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛:

output: {
    library: 'myLib',
    ...
}

рдФрд░ рдлрд┐рд░ рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ:

if(!window.myLib){
    var bz = document.createElement('script');
    bz.type = 'text/javascript'; 
    bz.async = true;
    bz.src = 'https://path/to/bundle.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(bz, s);
}

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рдмрдирд╛рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдорд╣рд╛рди рджреЗрд╡ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд░рд╣реА рд╣реИред рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣рд╛ рд╣реИ?

рд╣рд╛рдп @ рдПрдбреНрд░рд┐рдПрди-рдСрд░реЗрдВрдЬ, рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкреЛрд╕реНрдЯ https://github.com/facebook/react/issues/13991#issuecomment -472740798 рдорд┐рд▓ рд╕рдХрддреА рд╣реИред

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣рдо рдЖрдкрдХреЗ рдкреНрд░рд╡реЗрд╢ рдкреИрдХреЗрдЬ рдХреЗ рд╡реЗрдмрдкреИрдХ (рдпрд╛ рдЕрдиреНрдп рдЯреВрд▓) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ, рд╡реЗрдмрдкреИрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрдереЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрде рдФрд░ рдХреНрд░рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП resolve.modules рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИред Exp., resolve: { modules: [path.resolve(PACKAGE_ROOT, 'node_modules'), 'node_modules'] } , рд╡реЗрдмрдкреИрдХ рдХреЛ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдкреНрд░рд╡реЗрд╢ рдкреИрдХреЗрдЬ рд░реВрдЯ рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд░реВрдЯ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЦреЛрдЬреЗрдВ...

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

рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рдмрдирд╛рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдорд╣рд╛рди рджреЗрд╡ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд░рд╣реА рд╣реИред рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣рд╛ рд╣реИ?

рд╣рд╛рдп рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ

рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЙрд▓реНрд▓рдВрдШрди: рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрди рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
1. рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░реЗрдВрдбрд░рд░ рдХреЗ рдмреЗрдореЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо)
2. рдЖрдк рдХрд╛рдВрдЯреЛрдВ рдХреЗ рдирд┐рдпрдо рддреЛрдбрд╝ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ
3. рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдРрдк рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ
рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП https://fb.me/react-invalid-hook-call рджреЗрдЦреЗрдВред

   5 | 
   6 | const useApiHelper = (url, reducer) => {
>  7 |     const [state, dispatch] = useReducer(reducer, {});
     |                                                  ^
   8 | 
   9 |     useEffect(() => {
  10 |         fetch(url).then(res => res.json())

рдирдореВрдирд╛ рдХреЛрдб https://stackblitz.com/edit/react-mbze9q

рдЬрдм рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рд╕реЗ рдКрдкрд░ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ

@abhishekguru рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдпрд╣рд╛рдВ рдПрдХ рдШрдЯрдХ рдХреЗ рдмрд╛рд╣рд░ рд╣реБрдХ рдХреЛ рдмреБрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ:

test('API test', async () => {
  const newState = useAPIHelper( // <- Called outside of a component
    'https://jsonplaceholder.typicode.com/posts',
    reducer
  )
  console.log(newState, 'new');
  // expect(newState[samUrl].loading).toEqual(true);
});

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

рдмреЗрд╢рд░реНрдо рдкреНрд▓рдЧ

@abhishekguru рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк react-hooks-testing-library рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

import { renderHook } from 'react-hooks-testing-library'

test('API test', async () => {
  const { result } = renderHook(() => useAPIHelper( // <- now called within a component
    'https://jsonplaceholder.typicode.com/posts',
    reducer
  ))

  console.log(result.current, 'new');
  // expect(result.current[samUrl].loading).toEqual(true);
});

рдореИрдВ рдпрд╣рд╛рдВ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЗ рдереЗред рд╣рдо рдлрд╝рд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдиреЛрдб рдХреЗ require.cache рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред рд╕рдорд╛рд╢реЛрдзрди рдиреЛрдб рдХрд╛ require.cache рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:

Object.keys(require.cache)
  .filter(key => !isSingleton(key)) // This is needed here because react cannot be deleted without causing errors
  .forEach(key => {
    delete require.cache[key]
  })

рд╣рдорд╛рд░реЗ isSingleton рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ рдЬрд┐рдирдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдВрдЧреВрдареЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рдпрдо рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ peerDependencies . рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

https://yarnpkg.com/lang/hi/docs/dependency-types/#toc -peerdependencies

рднреА рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП

window.React1 = require('react');
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2); // true

true рднреА рд▓реМрдЯрд╛рдпрд╛, рджрд┐рдП рдЧрдП рд╕рднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрдВрдд рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐:

рд╡реЗрдмрдкреИрдХ bundle.js рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдХреЛ index.html рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЗрд╕рд▓рд┐рдП рдереА рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ bundle.js рдХреЛ index.html рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝ рд░рд╣рд╛ рдерд╛, рдЬреЛ рд╣реБрдХ рд╕реЗ рдкрд╣рд▓реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред

рдореЗрд░реЗ рд▓рд┐рдП рдореБрджреНрджрд╛ рдмреЗрдмреЗрд▓ 7 рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рдмрд╛рдж рдерд╛, рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдерд╛ред рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
.babelrc рд╕реЗ "react-hot-loader/babel" рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред
рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдкреИрдХреЗрдЬ why-did-you-update рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рд╣реИред рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рд╕реБрд░рд╛рдЧ рдПрдХ рд╕рдорд╛рди рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ react-native + Yarn Workspaces рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред


рдЬрдбрд╝ рдореЗрдВ package.json

{
  "private": true,
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "**/react-native",
      "**/react-native/!(react)/**"
    ]
  }
}

рдпрд╣ react-native рдХреЛрдб рдХреЛ рдлрд╣рд░рд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрд╢реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ), рдЬрдмрдХрд┐ рдЕрднреА рднреА react рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рднреА рд╕рд╛рдЭрд╛ рдореЙрдбреНрдпреВрд▓ рдПрдХ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


metro.config.js . рдореЗрдВ

module.exports = {
  watchFolders: [
    path.resolve(__dirname, '../', 'shared-module'), 
    // ...more modules
    path.resolve(__dirname, '../', '../') // to make sure the root `react` is also part of the haste module map
  ]
}

рдореЗрдЯреНрд░реЛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реЗ рдмрдВрдбрд▓рд░ рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╣рд╛рдВ рд╣реИред

рдореБрдЭреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ npm рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдРрдк рдореЗрдВ npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдХреЛ рд▓реЛрдб рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реБрдП, рдмрд┐рд▓реНрдб рд╕реЗ react рдФрд░ react-dom рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреЛрдиреЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдПрдХреНрд╕рдЯрд░реНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ред

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

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

"externals": {
  "react": "react",
  "react-dom": "react-dom"
}

рдореБрдЭреЗ react рдФрд░ react-dom рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдПрдк рдкреИрдХреЗрдЬ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╡реЗрдмрдкреИрдХ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдкрдиреЗ require рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡реЗрдмрдПрдк рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдг рд░рд┐рдПрдХреНрдЯ рд░рд╛рдЙрдЯрд░ рдХреЗ Route рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИ,

рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ :

<Route render={MyHookedComponent}/>

, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ:

<Route component={MyHookedComponent}/>

рдЙрджрд╛. рдЖрдкрдХреЛ component рдирд╣реАрдВ render рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рдЧрд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ render рдЖрдо рддреМрд░ рдкрд░ рд╡рд░реНрдЧ рдЖрдзрд╛рд░рд┐рдд рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдмрд╛рдпреЛрд▓рд░рдкреНрд▓реЗрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ npm рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ npm рд▓рд┐рдВрдХ рдХреА рдорджрдж рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдпрд╣ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рдмрд╛рдж рддреНрд░реБрдЯрд┐рдпрд╛рдБ рджреЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ Invalid Hook call warning ред
рдореИрдВрдиреЗ npm рд▓рд┐рдВрдХ ../myapp/node_modules/react рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ,
рдФрд░ React1 === React2 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рд╕рдЪ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА npm ls react рднреА рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреИрдХреЗрдЬ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

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

@hnagarkoti рдХреЗ рд╕рдорд╛рдиред

рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ (рдПрд╕рдПрд╕рдЖрд░) рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ react-apollo рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдЕрдЧрд▓реА рдЧрд░реАрдм рдЖрддреНрдорд╛ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

https://github.com/apolographql/react-apollo/issues/2541

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, getDataFromTree рд╕рдВрд╕реНрдХрд░рдг [email protected] рддрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 alias: {
        react: path.resolve('./node_modules/react')
      }

рдореЗрд░реЗ рдореБрдЦреНрдп рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ resolve рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЧрд▓рддреА рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд╣реИ: #2402

create-react-app рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрдЭрд╛рд╡?

^ рдареАрдХ рд╣реИ, рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдерд╛, рд╡рд╣ рд╣реИ рд░рд┐рдПрдХреНрдЯ-рдРрдк-рд░реАрд╡рд╛рдпрд░реНрдб рдФрд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝-рдХреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдпрд╣рд╛рдБ рдореЗрд░реА config-overrides.js рд╣реИ:

const {
    override,
    addWebpackAlias,
  } = require("customize-cra");

const path = require('path'); 

module.exports = override( 
    addWebpackAlias({
        react: path.resolve('./node_modules/react')
    })
)

рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛: https://github.com/dwjohnston/material-ui-hooks-issue/tree/master

рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджрд╕рд┐рдпреЛрдВ рдРрдкреНрд╕ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХ рдХрд╛рдо рд╣реИ, рдпреЗ рд╕рднреА рдРрдкреНрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 15.0.0 рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.8.0 рддрдХ рдЖрддреЗ рд╣реИрдВ, рд╣реБрдХ рдХреЗ рдКрдкрд░ рд▓рд╛рдЧреВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ рдирд╡реАрдирддрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

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

@dwjohnston create-react-app рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдХрд╛рдордХрд╛рдЬ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдирд╛ рдерд╛ред create-react-app рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡реЗрдмрдкреИрдХ, рд╡реЗрдмрдкреИрдХ-рджреЗрд╡-рд╕рд░реНрд╡рд░ рдФрд░ рдмреЗрдмреЗрд▓-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╣рд┐рдд рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдУрд╡рд░рд╣реЗрдб рд╣реИ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ create-react-app рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: https://github.com/facebook/create-react-app/issues/6953 рд╡реЗрдмрдкреИрдХ alias рд╕рдорд░реНрдерди рдпрд╛ рд╕рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЕрдЧрд░ рдХреЛрдИ рднреА create-react-app рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕ рджрд░реНрдж рдмрд┐рдВрджреБ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЙрд╕ рдореБрджреНрджреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

@ricokahler - рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдЕрдХреЗрд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ - рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рднреА рджреЗрдЦрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рд╕рдВрд╕рд╛рдзрди рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдЧреЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ?

рдпрджрд┐ рдЖрдк рдореЗрд░реА рдирд╛рд╡ рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдмрдирд╛рддрд╛ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдЖрдкрдХреЛ рджреЗ рд░рд╣рд╛ рд╣реИ рдРрдк 2 рдкреНрд░рддрд┐рдпрд╛рдВ рдпрд╛ рдЕрднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВред

рдореИрдВрдиреЗ node_modules/ рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ/node_modules рдРрдк рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

"prestart": "rimraf ./node_modules/<my_package>/node_modules"

рдПрд╕рдПрд╕рдЖрд░ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рднреА рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░" рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП ред (рдпрд╣ рдЗрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ)
рдЖрдк node --preserve-symlinks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдореВрд▓ рд░реЗрдкреЛ рдХреЛ рджреЗрдЦ рд╕рдХреЗ рдЬреЛ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "jest.moduleDirectories" рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдкреИрд░реЗрдВрдЯ рд░реЗрдкреЛ рдкрде рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬреЗрд╕реНрдЯ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░ рд╕рдХреЗ

@apieceofbart рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, thx!

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

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

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

рдореБрдЭреЗ рдЕрднреА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ: # https://github.com/react-bootstrap/react-bootstrap/issues/3965

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдм рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛, рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ https://github.com/whitecolor/yalc рдпрд╣ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@mpeyper рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

@apieceofbart рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдпреЗ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рд╣реБрдИ рдЬрдм рдореИрдВрдиреЗ рдкрд╛рд╡рд░рд╢реЗрд▓ рдореЗрдВ рдЕрдкрдиреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдкрде рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо рдХреЛ рдХреИрдкрд┐рдЯрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ/тАж/тАж рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/тАж/тАж рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ
рдЬрдм рдореИрдВрдиреЗ рдкреВрдВрдЬреАрдХрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рддреЛ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдореЗрд░реЗ рд▓рд┐рдП, рдХрд░:

    "react": "file:../my-library/node_modules/react",
    "react-dom": "file:../my-library/node_modules/react-dom",

рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛, рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд░рд╣реА hooks can only be called inside the body of a function component ред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХреБрдЫ рдШрдЯрдХ рдЬрд╣рд╛рдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдереЗ:

export default Radium(withTranslation()(MyComponent))

:рдПрдХреНрд╕:

рдЬрд╣рд╛рдВ withTranslation рд░рд┐рдПрдХреНрдЯ-i18next рд╕реЗ рдПрдЪрдУрд╕реА рд╣реИ рдФрд░ рд░реЗрдбрд┐рдпрдо рд╕реЗ Radium рдПрдЪрдУрд╕реА рд╣реИред

рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛:

export default withTranslation()(Radium(MyComponent))

:рднрд╛рд░реА_рдЪреЗрдХ_рдЪрд┐рд╣реНрди:
рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-i18next рд╕рдВрд╕реНрдХрд░рдг 10 рдореЗрдВ рдерд╛ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

@mikeaustin рд╣рдо рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ "рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╛рд░рд┐рдд/рдЗрдВрдЬреЗрдХреНрд╢рди" рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

рдЕрднреА рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рд╕рднреА рдЪрд░рдгреЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛:

  • рдпрд╛рд░реНрди рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ (рд▓рд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)
  • рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбреАрдкреА рд╣реИ, рд╣рд╛рдБ

рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЬрд┐рдирдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  • рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
$ npm ls react-dom
/xxx
тФФтФАтФА [email protected]

$ npm ls react
/xxx
тФФтФАтФА [email protected]

рд░реВрдЯ рдкреИрдХреЗрдЬ.json

{
  ...
  "workspaces": [
    "packages/*",
  ],
  "devDependencies": {
    ...
  },
  "dependencies": {
    "react": "16.8.6",
    "react-dom": "16.8.6"
  },
  "resolutions": {
    "react": "16.8.6",
    "react-dom": "16.8.6",
    "**/react": "16.8.6",
    "**/react-dom": "16.8.6"
  }
}

@JeremyGrieshop рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, рдзрдиреНрдпрд╡рд╛рджред

рдЕрдкрдиреЗ package.json рдореЗрдВ "prestart" рдХреЛ рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдЬреЛрдбрд╝реЗрдВ:

"scripts": {
    "prestart": "rimraf ./node_modules/<my package>/node_modules",
    "start": "react-scripts start",
    "build": "react-scripts build",
  },

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

Object.keys(require.cache).forEach((key) => {
      delete require.cache[key];
    });

рддреЛ рд╡рд╣рд╛рдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рд╕реЗ рдмрдЪреЗрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 alias: {
        react: path.resolve('./node_modules/react')
      }

рдореЗрд░реЗ рдореБрдЦреНрдп рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ resolve рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЧрд▓рддреА рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд╣реИ: #2402

рдкрд╛рд░реНрд╕рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ dist рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреА рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:

  "alias": {
    "react-mediator": "./dist"
  },

рдЖрдкрдХреЗ package.json рдФрд░ рдлрд┐рд░ рднреА рдЖрдк рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕/рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП link (рдПрдирдкреАрдПрдо рдпрд╛ рдпрд╛рд░реНрди) рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@mikeaustin рд╣рдо рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ "рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╛рд░рд┐рдд/рдЗрдВрдЬреЗрдХреНрд╢рди" рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

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

const withReact = Component = props => (
  <ReactContext.Provider value={api => <Component api={api} {...props} /> } />
)

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

_p.s: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдкреГрд╖реНрда рдХреЛ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред_

@OliverRadini

рдореИрдВ react-hot-loader рд╕реЗ ^4.6.0 . рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛

рдорд╛рди, рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред
@gaearon @theKashey рдЗрд╕реЗ https://reactjs.org/warnings/invalid-hook-call-warning.html рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪреЗрдВ рддрд╛рдХрд┐ рд▓реЛрдЧ react-hot-loader рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░рдг рдЕрдкрдирд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВ?

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

рдирдорд╕реНрддреЗ, рдореИрдВ рдПрдХ рдРрдк рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреЛрдиреЛрдВ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдРрдк рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:

рдРрдк рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ:

    alias: { react: path.resolve( '__dirname', '..',  'node_modules', 'react' ) // Adapt this to match your file tree

рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡реЗрдмрдкреИрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ

  externals: {
    react: 'react', // Case matters here
    'react-dom': 'react-dom' // Case matters here
  }

рддреЛ рдореИрдВ рдПрдХ рдЧреИрд░-рдкрд╛рд░рджрд░реНрд╢реА рдлрд╝рд╛рдЗрд▓ (*.js) рд╕реЗ рд╣реБрдХ рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ:

index.js :

import ReactDOM from 'react-dom';
import './index.css';
import App from './app';

ReactDOM.render(App(), document.getElementById('root'));

app.jsx

import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
const BaseContext = React.createContext();

const initialState = {
  woo: true
};

const reducer = (state, action) => {
  switch (action.type) {
    default:
      return state;
  }
};

const Home = () => <h1>You're at home.</h1>;

const App = () => {
  // eslint-disable-next-line
  const [state, dispatch] = React.useReducer(reducer, initialState);
  return (
    <Router>
      <BaseContext.Provider value={initialState}>
        <BaseContext.Consumer>
          <div className="welcome">
            <nav>
              <ul>
                <li>
                  <Link to="/">Home</Link>
                </li>
              </ul>
            </nav>
            <header className="header">
              <h1>Welcome!</h1>
            </header>
            <Route path="/" exact component={Home} />
          </div>
        </BaseContext.Consumer>
      </BaseContext.Provider>
    </Router>
  );
};
export default App;

рдХреЛрдИ рд╕рд▓рд╛рд╣, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ "рдЗрд╕реЗ JSX рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдБ" рдирд╣реАрдВ рд╣реИ?

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдореЗрдВ data-turbolinks-track="reload" data-turbolinks-eval="false" рдЬреЛрдбрд╝рдХрд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛?

$ npm ls react
[email protected] /mnt/g/development/javascript/pow-vehmain
тФФтФАтФА [email protected]`
Invalid hook call...
ServiceVisitMaintenance
src/components/ServiceVisit/ServiceVisitMaintenance.js:6
  3 | import { ServiceVisitForm } from './ServiceVisitForm';
  4 | 
  5 | const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
> 6 | const ServiceVisitMaintenance = () => {
  7 |   const [vehicleList, setVehicleList] = useState([]);
  8 |   return (
  9 |     <div>

ServiceVisitMaintenance.js:

import React, { useState } from 'react';
import { ServiceVisitForm } from './ServiceVisitForm';
const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
const ServiceVisitMaintenance = () => {
  const [vehicleList, setVehicleList] = useState([]);
  return (
    <div>
      <ServiceVisitForm vehicleList={data} />
    </div>
  );
};

export { ServiceVisitMaintenance };

рдХреГрдкрдпрд╛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рд╕рдВрд╕реНрдХрд░рдг рдХреНрдпрд╛ рд╣реИред

$ npm ls рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо
[email protected] /mnt/g/Development/javascript/pow-vehmain
тФФтФАтФА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо@16.8.6

рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рддрдм рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрдм рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрдЯ (mapStateToProps) (MyComponent) рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реАрдЖрд░рдП рдРрдк рдореЗрдВ рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

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

рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдпрд╣реА рдореБрджреНрджрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЧреИрдЯреНрд╕рдмреА рдХреЗ рд╕рд╛рде?

рдореИрдВ 'npm ls рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:
image

рдФрд░ 'рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо'
image

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓реА рд╣реИ, рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ред рдлрд┐рд░, рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, 'gatsby new random-name' рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реА (рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ, рд╕рд╛рде рдореЗрдВ https://www.youtube.com/watch?v=asrdFuAxPaU&feature=youtu .be) рдЧреИрдЯреНрд╕рдмреА-рд╕реНрдЯрд╛рд░реНрдЯрд░-рдбрд┐рдлреЙрд▓реНрдЯ рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдЦреБрдж рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреАред рдЦреИрд░, рдореЗрд░реЗ рдЪрд┐рд░рд╛рдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рдпрд╛!

рдХрд┐рд╕реА рднреА рдФрд░ рд╕рднреА рд╕рд▓рд╛рд╣ рдХреЛ рдПрдХ рдирд┐рд░рд╛рд╢ рдЬрдирд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдЕрднреА рднреА рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ npm ls рд╕реЗ рд╕рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ?
imageimage

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ why-did-you-update рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рдереАред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рддреЛ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдФрд░ рд▓рд░реНрди рдореЛрдиреЛрд░реЗрдкреЛ рдФрд░ рдкреИрдХреЗрдЬ рдХреЛ рдлрд╣рд░рд╛рддрд╛ рд╣реИред рдЬрд┐рд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ externals: [тАЬreactтАЭ] рд╕реЗрдЯ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ react/umd/react.development.js рд▓реЛрдб рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдХ рджрд░реНрдж рд╣реИ рдФрд░ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдареАрдХ рд╣реИ рддреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЧрд▓рддреА рд╕реЗ рд╡реЗрдмрдкреИрдХ рд░рдирдЯрд╛рдЗрдо.рдЬреЗрдПрд╕ рдХреЛ рдХрдИ рдмрд╛рд░ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рдереЗ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд░рд┐рдПрдХреНрдЯ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рдореМрдЬреВрдж рдереАрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд░рдирдЯрд╛рдЗрдордЪрдВрдХ (runtime.js) рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдореЗрд░реЗ рдЬреИрд╕реЗ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕реЗ рдЕрдкрдиреЗ jest.config.js . рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ

moduleNameMapper: {
    '^react$': '<rootDir>/node_modules/react/'
  }

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

рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг рдФрд░ рдЙрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ред

рдореЗрд░рд╛ рд╡рд╛рддрд╛рд╡рд░рдг electron рдФрд░ webpack рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЧреИрд░-рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд▓реЛрдЧреЛрдВ рдХреА рднреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рдПрдХреНрдЯ 16.9 (рдФрд░ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо 16.9) рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреНрдпреЛрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рджрд░реНрджрдирд╛рдХ рджрд┐рди рдмрд┐рддрд╛рдПред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдРрдк рдореЗрдВ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдереАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рджреЛ рднреМрддрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рдорд┐рд▓реЗ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ npm ls react рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдмрдВрдбрд▓ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ webpack-bundle-analyzer рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЖрдЦрд┐рд░рдХрд╛рд░, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ DOM рдХреЛ HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рдмрд╛рд░ рд╕рдВрджрд░реНрднрд┐рдд/рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рд░рд┐рдПрдХреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ index.js рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП console.log("React load") рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрд░реЛрдд electron-webpack рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЛ рдмрд╛рд╣рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдмрдВрдбрд▓ рдореЗрдВ рдФрд░ рд╕рд╛рде рд╣реА рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╕рдорд╛рдзрд╛рди рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рдерд╛ webpack.renderer.config.js :

module.exports = {
    externals: [
        "react",
        "react-dom"
    ],
};

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдпрд╣рд╛рдВ рдкрд╛рд░реНрд╕рд▓.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдЕрдЬреАрдм рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдпрд╛рдд рд╕реЗ рджреВрд░ рд╣реЛрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛: import React from 'React'; рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЙрд▓реНрд▓рдВрдШрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ from 'react' рдХреЗ рдмрдЬрд╛рдп from 'react' from 'React' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рдУрд╣ред

рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдпрд╣реА рдореБрджреНрджрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЧреИрдЯреНрд╕рдмреА рдХреЗ рд╕рд╛рде?

рдореИрдВ 'npm ls рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:
image

рдФрд░ 'рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо'
image

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓реА рд╣реИ, рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ред рдлрд┐рд░, рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, 'gatsby new random-name' рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реА (рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ, рд╕рд╛рде рдореЗрдВ https://www.youtube.com/watch?v=asrdFuAxPaU&feature=youtu .be) рдЧреИрдЯреНрд╕рдмреА-рд╕реНрдЯрд╛рд░реНрдЯрд░-рдбрд┐рдлреЙрд▓реНрдЯ рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдЦреБрдж рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреАред рдЦреИрд░, рдореЗрд░реЗ рдЪрд┐рд░рд╛рдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рдпрд╛!

рдХрд┐рд╕реА рднреА рдФрд░ рд╕рднреА рд╕рд▓рд╛рд╣ рдХреЛ рдПрдХ рдирд┐рд░рд╛рд╢ рдЬрдирд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╛рдБ, рдореБрдЭреЗ рдЖрдкрдХреЗ рдЬреИрд╕рд╛ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ... ,

// Add this in node_modules/react-dom/index.js
window.React1 = require('react');

// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);

рдореИрдВрдиреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ React2 рдЬреЛрдбрд╝рд╛ред рдпрд╣ рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░рддрд╛ рд╣реИред

Deduped рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ npm рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдпрд╣рд╛рдБ рд╕реЗ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ ...

рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдХреЛ рджреЛ рдмрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдВрджрд░реНрднрд┐рдд рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрдХреБрд▓ рдХреЛ "рдкреЗрдбрд╝ рдХреЗ рдКрдкрд░" (рдкреЗрдбрд╝ рдХреЛ рд╕рдорддрд▓ рдХрд░рддрд╛ рд╣реИ) рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдПрдХ рдкреИрдХреЗрдЬ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЬ рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдХрд┐ рдЧрдиреНрджрд╛ рд╣реЛрдЧрд╛) рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЖрдк рдЗрд╕реЗ рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдЬреЛ deduped рдХрд╣рддрд╛ рд╣реИ, рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рдФрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ "рдЙрдЪреНрдЪ рд╕реНрддрд░" рдкрд░ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдбрд┐рдбреБрдкрд┐рдВрдЧ рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдЖрдкрдиреЗ рдХреНрдпрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ?

рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдХреБрдЫ рдШрдЯрдХ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреВрдВ рддреЛ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧреАред рдореИрдВ рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реНрдордд рдХреЗ node_modules рдЖрджрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдореИрдВрдиреЗ рдЕрдкрдиреА рдЕрдЧрд▓реА.config.js рдлрд╝рд╛рдЗрд▓ рдФрд░ package.json рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд┐рд╕реНрдордд рдХреЗ react рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.8.6, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо 16.8.6, рдФрд░ рдЕрдЧрд▓реЗ 9.0.4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред npm ls рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рдПрдирдкреАрдПрдо рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рднрдВрдбрд╛рд░: https://github.com/dancancro/questions/tree/invalid-hook-call

рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдпрд╣рд╛рдБ рд╣реИ: https://codesandbox.io/s/github/dancancro/questions/tree/invalid-hook-call/?fontsize=14

рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ: https://stackoverflow.com/questions/57647040/nextjs-invalid-hook-call-hooks-can-only-be-call-inside-of-the-body-of-a-fun

рддреНрд░реБрдЯрд┐ рдпрд╣рд╛рдБ рд╣реИ: https://gist.github.com/dancancro/2dfafb053aaaedfade406fd4f67eb68a
... рд░реЗрдВрдбрд░ -> рд░реЗрдВрдбрд░рдЯреЙрд╕реНрдЯреНрд░рд┐рдВрдЧ -> ReactDOMServerRenderer.read -> ReactDOMServerRenderer.render -> Object.WithStyles [рд░реЗрдВрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ] ...

рдЖрдкрддреНрддрд┐рдЬрдирдХ рд╣реБрдХ рдПрдХ useStyles() рдПрдХ withStyles рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рдХреА рд▓рд╛рдЗрди 17428 рдкрд░ рдХреЙрд▓ рд╣реИред "Var Classes = useStyles (props)" рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВред рд╕рдорд╕реНрдпрд╛ рдиреЗрдХреНрд╕реНрдЯ-рдЬреЗрдирд░реЗрдЯреЗрдб рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ withStyles рдпрд╛ рдХрд┐рд╕реА рднреА рд╣реБрдХ рдпрд╛ "рдЙрдкрдпреЛрдЧ *" рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

https://raw.githubusercontent.com/dancancro/questions/invalid-hook-call/.next/static/development/pages/index.js

рдЕрджреНрдпрддрди: рдЗрд╕реЗ рдореЗрд░реЗ next.config.js рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ:

    webpack: config => {
        config.externals = [
            '/'
        ]
        return config
    },

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЗ node_modules рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ react рдФрд░ react-dom рдХреЛ рд╣рдЯрд╛рдХрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрд╛ред

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

рдпрд╣рд╛рдБ рдЙрдкрд╛рдп рд╣реИ:

  • рдкреИрдХреЗрдЬ рдП: рдЖрдкрдХрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдкреИрдХреЗрдЬ, npm link 'd . рд░рд╣рд╛ рд╣реИ
  • рдкреИрдХреЗрдЬ рдмреА: рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдкреИрдХреЗрдЬред рдкреИрдХреЗрдЬ A . рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ node_modules рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рд╣реИ
  1. рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ рдПред рдореЗрд░рд╛ рдЕрдкрдиреА рд╕рдВрдкрддреНрддрд┐ dist/ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ node_modules рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ
  2. рдкреИрдХреЗрдЬ рдП рдХреЗ рд╡рд┐рддрд░рд┐рдд node_modules рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, react рдФрд░ react-dom рд╣рдЯрд╛рдПрдВ
  3. ???
  4. рдлрд╛рдпрджрд╛!

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

рдореЗрд░реЗ рд▓рд┐рдП рдЕрд╕рдВрдЧрдд why-did-you-update рдХрд╛рдо рдирд┐рдХрд╛рд▓реЗрдВред (https://github.com/maicki/why-did-you-update/issues/52)

рдЕрд╕рдВрдЧрдд рдХреНрдпреЛрдВ-рдХреНрдпрд╛-рдЖрдк-рдЕрджреНрдпрддрди

@ рдмрд░реНрдереЛ-рд╢реВрдиреНрдп рдЙрдкрдпреЛрдЧ рдирдП devtools рдпрд╛ рдореЗрд░реЗ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ WhyDidYouUpdate

@brunolemos рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╡рд┐рд╡рд╢ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдкрд░ рд░рдЦрдирд╛ рд╣реИред

@ dmart914 рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рджреАред рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдкреИрдХреЗрдЬ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рддрд╛рдХрд┐ рдореИрдВ рдмрд┐рдирд╛ рдмрджрд▓рд╛рд╡ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреВрдВ ... рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ? рдУрдкрди-рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ ...

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЗ react рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЙрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП react (рдЬреИрд╕реЗ @testing-library/react рдпрд╛ @testing-library/react-hooks ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реИрдВред рдореБрдЦреНрдп рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдореЙрдбреНрдпреВрд▓ рджреЛрдиреЛрдВ рд░рд┐рдПрдХреНрдЯ 16.9.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдореЙрдбреНрдпреВрд▓ рдХреЛ React.lazy () рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЗрдВрдкреЛрд░реНрдЯ () рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрдм рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рддреЛ "рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓" рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреА рдЬрд╛рддреА рд╣реИред

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

  1. рдореЙрдбреНрдпреВрд▓ рдХреЗ webpack.config рдореЗрдВ рдПрдХ рдЙрдкрдирд╛рдо рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ apieceofbart рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
    рдЙрдкрдирд╛рдо: {
    рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: path.resolve ('../../node_modules/react')
    }

  2. рдореЙрдбреНрдпреВрд▓ рдХреЗ package.json рдореЗрдВ рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред
    "рдирд┐рд░реНрднрд░рддрд╛": {
    "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо": " рдлрд╝рд╛рдЗрд▓:../рд╕рд╛рдорд╛рдиреНрдп/рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо ",
    "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": " рдлрд╝рд╛рдЗрд▓:../рд╕рд╛рдорд╛рдиреНрдп/рдиреЛрдб_рдореЙрдбреНрдпреВрд▓/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ "
    }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдКрдкрд░ рджреА рдЧрдИ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣рд╛рдБ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ config/webpack.config.js . рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
externals: {
  react: {
    root: 'React',
    commonjs2: 'react',
    commonjs: 'react',
    amd: 'react'
  },
  'react-dom': {
    root: 'ReactDOM',
    commonjs2: 'react-dom',
    commonjs: 'react-dom',
    amd: 'react-dom'
  }
}
  1. рд╕рдВрдкрд╛рджрд┐рдд package.json
"devDependencies" : {
  ...
  "react": "^16.9.0",
  "react-dom": "^16.9.0",
}
"peerDependencies": {
  "react": "^16.9.0",
  "react-dom": "^16.9.0"
}
  1. рд╕рдВрдкрд╛рджрд┐рдд public/index.html
<head>
  <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
...

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

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдЪреНрдЪ рдХреНрд░рдо рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;
'рдкреНрд░реЛрдк-рдкреНрд░рдХрд╛рд░' рд╕реЗ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдЖрдпрд╛рдд рдХрд░реЗрдВ;
рдЖрдпрд╛рдд { withStyles } '@material-ui/styles' рд╕реЗ;
'@ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдХреЛрд░/рдмрдЯрди' рд╕реЗ рдЖрдпрд╛рдд рдмрдЯрди;

рдХреЙрдиреНрд╕реНрдЯ рд╕реНрдЯрд╛рдЗрд▓ = рдереАрдо => ({
рдЬрдбрд╝: {
рдкреГрд╖реНрдарднреВрдорд┐: 'рд░реИрдЦрд┐рдХ-рдврд╛рд▓ (45deg, #FE6B8B 30%, #FF8E53 90%)',
рд╕реАрдорд╛: 0,
рд╕реАрдорд╛ рддреНрд░рд┐рдЬреНрдпрд╛: 3,
рдмреЙрдХреНрд╕рд╢реИрдбреЛ: '0 3px 5px 2px рдЖрд░рдЬреАрдмреАрдП (255, 105, 135, .3)',
рд░рдВрдЧ рд╕рдлреЗрдж',
рдКрдВрдЪрд╛рдИ: 48,
рдкреИрдбрд┐рдВрдЧ: '0 30px',
},
});

рдХреНрд▓рд╛рд╕ рд╣рд╛рдпрд░рдСрд░реНрдбрд░рдХрдВрдкреЛрдиреЗрдВрдЯ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ {

рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛(){
рдХрд╛рд╕реНрдЯ {рдХрдХреНрд╖рд╛рдПрдВ} = this.props;
рд╡рд╛рдкрд╕реА (
рдЙрдЪреНрдЪ-рдХреНрд░рдо рдШрдЯрдХ
);
}
}

HighOrderComponent.propTypes = {
рдХрдХреНрд╖рд╛рдПрдВ: PropTypes.object.isRequired,
};

рд╕реНрдЯрд╛рдЗрд▓реНрд╕ (рд╢реИрд▓рд┐рдпреЛрдВ) (рд╣рд╛рдпрд░рдСрд░реНрдбрд░ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ) рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ;

рдореИрдВ рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ package.json рдореЗрдВ рд╕рдВрдХрд▓реНрдк рдХреЛ рдордЬрдмреВрд░ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ:

  "resolutions": {
    "**/react": "16.7.0-alpha.2",
    "**/react-dom": "16.7.0-alpha.2"
  },

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреИрд░реЗрдВрдЯ рдпрд╛ рдЪрд╛рдЗрд▓реНрдб рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ?

рдКрдкрд░ рджреА рдЧрдИ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣рд╛рдБ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ config/webpack.config.js . рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
externals: {
  react: {
    root: 'React',
    commonjs2: 'react',
    commonjs: 'react',
    amd: 'react'
  },
  'react-dom': {
    root: 'ReactDOM',
    commonjs2: 'react-dom',
    commonjs: 'react-dom',
    amd: 'react-dom'
  }
}
  1. рд╕рдВрдкрд╛рджрд┐рдд package.json
"devDependencies" : {
  ...
  "react": "^16.9.0",
  "react-dom": "^16.9.0",
}
"peerDependencies": {
  "react": "^16.9.0",
  "react-dom": "^16.9.0"
}
  1. рд╕рдВрдкрд╛рджрд┐рдд public/index.html
<head>
  <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
...

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

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ

рдХреЛрдИ рдЕрдкрд░рд╛рдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реИрдХреНрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рдмрдЧ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдПрдХ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди yarn|npm link рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рд░реЛрд▓рдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдмрдВрдбрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдмрдВрдбрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред рдЬрдм рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдРрдк рдХреЛ рдмрдВрдбрд▓ (рд╡реЗрдмрдкреИрдХ) рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдмрдЧ/рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ create-react-app рдФрд░ next.js рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛрддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдврд╛рдВрдЪреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдХреЛрдИ рд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрд╛ рд╣реИ?

npm|yarn link рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдХрд░, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЗрд╕ рд╕реБрдВрджрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╡реЗрдмрдкреИрдХ рдХреЛ рдЕрдкрдиреЗ рдмрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ _react_ рдФрд░ _react-dom_ рдХреЛ external рдпрд╛ alias рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдФрд░ рд▓реЙрдХ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╣рдорд╛рд░реЗ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЕрдВрджрд░ рднреАред

рд╢рд╛рдпрдж рдпрд╣ рд╕реВрдЪреА рдореЗрдВ рдереЛрдбрд╝рд╛ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛:

рд╕рдВрдкрд░реНрдХ

@GabrielBB рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рд╣реИ

@ dmart914 рдзрдиреНрдпрд╡рд╛рдж! рдЕрдм рддрдХ рдПрдХрдорд╛рддреНрд░ рдХрд╛рдордХрд╛рдЬ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдиреНрдпреВрдирддрдо, рд╕реАрдзреЗ рд╕реЗрдЯрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд░рд┐рдПрдХреНрдЯ рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ:

  1. рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯрдбреЙрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  2. рд╣реБрдХ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред
  3. рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИред

__рдирд┐рд░реНрднрд░рддрд╛__
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛@16.10.1
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо@16.10.1
рд╡реЗрдмрдкреИрдХ@4.41.0
рд╡реЗрдмрдкреИрдХ-рдХреНрд▓реА@3.3.9

рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП webpack test.js -o main.js рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ:

  • рдмреЙрдХреНрд╕ рд░реЗрдВрдбрд░ рдХрд░реЗрдВред

    • React.useState рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбреАрдмрдЧрд░ рдХреЛ рд░реЛрдХреЗрдВред

    • рдПрдХ рдмреВрд▓рд┐рдпрди рдмрдирд╛рдПрдВ test рдФрд░ рдХреЙрд▓рдмреИрдХ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ updateTest ред

    • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред

    • рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдкрд░ React.useEffect рдХреЙрд▓рдмреИрдХ рдХрд░реЗрдВред

    • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдпрд╛ рдХреБрдЫ рдФрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

// test.js
import React, { createElement as el } from 'react';
import ReactDOM from 'react-dom'; 

function Item() {
  debugger;
  const [test, updateTest] = React.useState(false); // Throws React error.

  React.useEffect(function checkTest() { // Throws React error.
    console.log("checking test", test);
  }, [test]);

  React.useEffect(function tester() { // Throws React error.
    if (!test) {
      setTimeout(() => {
        console.log("changing value for test");
        updateTest(true);
      }, 1000);
    }
  }, [test]);

  return el('div', {style: {width: '300px', height: '300px', 'background-color': 'green', border: '1px solid red'}});
}

function render() {
  let root = document.querySelector('#primary');
  if (!root) {
    root = document.createElement('div');
    document.body.appendChild(root);
  }

  ReactDOM.render(Item(), root);
}

render();

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдмрдирд╛рдирд╛ рднреВрд▓ рдЧрдП рд╣реИрдВред рдЖрдк ReactDOM.render рдХреЙрд▓ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣реЗ рд╣реИрдВ Item() ред рдЖрдкрдХреЛ el(Item) рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рддреНрдп! рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдХреБрдЫ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реВрдБред рдореИрдВ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реНрдб рдХреЛрдб рдХреЛ lib рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧ рдХреЗ externals рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реА рддрд╛рдХрд┐ рдпрд╣ рдШрдЯрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рди рд╣реЛред рдореИрдВ рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдпреЗ рдШрдЯрдХ рдЙрдирдХреЗ рдмреАрдЪ рдЖрдо рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдбреЗрдЯ рджреЛрдиреЛрдВ рдРрдкреНрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди рдореЗрдВ common-components: file:../../common-components/lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдШрдЯрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗрдмрдкреИрдХ рдЪрд▓рд╛рдирд╛ рдШрдЯрдХреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореБрдЭреЗ yarn upgrade common-components рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рджреЗрд╡ рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ common-components: link:../../common-components/lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реЗрдмрдкреИрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдореБрдЦреНрдп рдРрдк рдХреЗ node_modules рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреА (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм common-components/node_modules рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рд╕рд┐рдореНрд▓рд┐рдВрдХ (рдпрд╛рдиреА common-components: link:../../common-components/lib ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдореБрдЦреНрдп рдРрдк рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдорд┐рд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдЪреВрдВрдХрд┐ рдореИрдВ рджреЛрдиреЛрдВ рдРрдкреНрд╕ рдореЗрдВ рдЗрди рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреИрдХреЗрдЬ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рджреЛрдиреЛрдВ рдореБрдЦреНрдп рдРрдкреНрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ resolve рдлрд╝реАрд▓реНрдб рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреЗрдЦреА рд╣реИрдВ рдЬреЛ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛!

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

рдкреИрдХреЗрдЬ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЬреАрдердм рдкрд░ рдзрдХреНрдХрд╛ рджреЗрдВ рдФрд░ рдЗрд╕реЗ yarn add <git-url> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред

рдкреИрдХреЗрдЬ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЬреАрдердм рдкрд░ рдзрдХреНрдХрд╛ рджреЗрдВ рдФрд░ рдЗрд╕реЗ yarn add <git-url> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред

рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ npm рд▓рд┐рдВрдХ рдФрд░ npm рдкреИрдХреЗрдЬ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, NPM рдпрд╛ GitHub рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИред

рд╣рдо https://github.com/facebook/react/issues/13972#issuecomment -447599035 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдП рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реЗрдмрдкреИрдХ рдиреЛрдб рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рд░рдг рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЬреЗрд╕реНрдЯ рдХреЗ рднреАрддрд░ рдЪрд▓ рд░рд╣рд╛ рдПрдХ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдерд╛ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ webpack() рдЪрд▓рддрд╛ рдерд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХрд┐ рдХреИрд╕реЗ ESM рдФрд░ CJS рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реЗрдВ:

// node express server, doing server-rendering
import React from 'react';
import { ApolloProvider } from '@apollo/react-common';
import { renderToStringWithData } from '@apollo/react-ssr';

res.send(await renderToStringWithData(<ApolloProvider><App /></ApolloProvider>)

рдбреАрдмрдЧрд░ рд╕рддреНрд░ рдореЗрдВ рдореИрдВ рдЬреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

_react: {Children, ...}
_react2: {default: {Children, ...}

рдХрд╣рд╛рдВ
_react рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ ESM import React from 'react' рд╕реЗ рд╣реИ
_react2 рд╕реАрдЬреЗрдПрд╕ var _react = _interopRequireDefault(require("react")); рд╕реЗ node_modules/@apollo/react-ssr/lib/react-ssr.cjs.js рдХреЗ рднреАрддрд░ рд╕реЗ рд╣реИ

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рджреЛ рд╕реНрдерд╛рдиреЛрдВ (рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░ рдлрд╝рд╛рдЗрд▓, рдФрд░ @apollo/react-ssr рдХреЗ рдмрдВрдбрд▓ рдХреЗ рдЕрдВрджрд░) рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ред

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

рдореИрдВ рдЗрд╕реЗ рдпрд╛рд░реНрди рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:

рд╕реАрдбреА рд╕реЗ myApp/node_modules/react рдФрд░ yarn link

рдлрд┐рд░ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ yarn link react . рдЪрд▓рд╛рдПрдВ

рдЕрдм рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдареАрдХ рдЙрд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдореБрдЦреНрдп рдРрдк

рдореИрдВрдиреЗ рдЕрдкрдиреЗ lib рдореЗрдВ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдлрд┐рд░ lib рдирд╣реАрдВ рдмрди рдкрд╛рдПрдЧрд╛

рдХреЛрдИ create-react-app yarn рдирд┐рдХрд╛рд▓реЗ рдпрд╛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЖрдк npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рдЙрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рдирд┐рд╖реНрдХрд╛рд╕рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдЬрдм рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ react рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред

@woles рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рд╣реИрдВ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдореЗрд░реА 'рд╣реБрдХ' рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗ

рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ рдЗрд╕ рдмрдЧ рдХреЛ рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░рд╛рдЙрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдШрдЯрдХ рдХрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред

рдореЗрд░рд╛ рдРрдк рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдПрдХ рдШрдЯрдХ рдореЗрдВ рдореИрдВ рдпреВрдЬрд╝рд╕реНрдЯреЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрд╛ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░рд╛рдЙрдЯрд░ рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛:
<Route exact path="/path" render={ ComponentCausingTheErrorMesage }/>
рдЗрд╕рдореЗрдВ рд╕реНрд╡рд┐рдЪ рд╣реЛ рд░рд╣рд╛ рд╣реИ
<Route exact path="/path" component={ ComponentNowWorkingAgain }/>
рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛

рдореИрдВ рдПрдХ рдРрдк рдФрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ npm link рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕ рдкрд░ рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдРрдк рдХреЗ react рдФрд░ react-dom рдХреЛ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдерд╛, рдлрд┐рд░ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдРрдк рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓:

рдРрдк рдореЗрдВ:

  1. cd node_modules/react && npm link
  2. react-dom рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди

рдореЙрдбреНрдпреВрд▓ рдореЗрдВ:

  1. npm link react && npm link react-dom
  2. npm link

рдРрдк рдореЗрдВ:

  1. npm link [module-name]

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реБрдХ рдереЗ рд▓реЗрдХрд┐рди рдПрд╕рдПрд╕рдЖрд░ рдкрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдорд╛рд░ рд░рд╣реЗ рдереЗред рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛:

const nodeExternals = require('webpack-node-externals');

const serverConfig = () => {
  // lots of config, then:
  externals: [
    nodeExternals({
      modulesFromFile: true,
    }),
  ],
}

рдореИрдВ рдЗрд╕реЗ рдпрд╛рд░реНрди рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:

рд╕реАрдбреА рд╕реЗ myApp/node_modules/react рдФрд░ yarn link

рдлрд┐рд░ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ yarn link react . рдЪрд▓рд╛рдПрдВ

рдЕрдм рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдареАрдХ рдЙрд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдореБрдЦреНрдп рдРрдк

рдореИрдВрдиреЗ рдЕрдкрдиреЗ lib рдореЗрдВ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдлрд┐рд░ lib рдирд╣реАрдВ рдмрди рдкрд╛рдПрдЧрд╛

рдпрд╣ рд╕рд┐рд░реНрдл рд╕реБрдВрджрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

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

рд╣рд╛рдп ZVER3D, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛!

рдореИрдВ рдПрдХ рдРрдк рдФрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ npm link рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕ рдкрд░ рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдРрдк рдХреЗ react рдФрд░ react-dom рдХреЛ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдерд╛, рдлрд┐рд░ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдРрдк рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓:

рдРрдк рдореЗрдВ:

1. `cd node_modules/react && npm link`

2. same for `react-dom`

рдореЙрдбреНрдпреВрд▓ рдореЗрдВ:

1. `npm link react && npm link react-dom`

2. `npm link`

рдРрдк рдореЗрдВ:

1. `npm link [module-name]`

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ

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

рд╣рд╛рдп ZVER3D, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛!

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

"electronWebpack": {
    "whiteListedModules": [
      "@material-ui/core",
      "@material-ui/icons"
    ]
  }

рдореИрдВ monorepo рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрд╡реЗрджрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореБрдЦреНрдп рдРрдк ( brush ) рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдШрдЯрдХ ( react-gbajs ) рд╣реИред

рдЗрд╕рд▓рд┐рдП рдЬрдм рдореИрдВ рдЕрдкрдирд╛ react-gbajs рдШрдЯрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЙрд╕реА рдХреЛрдб рдХреЛ brush рдкрд░ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ (рд╡реЗрдмрдкреИрдХ, рдпрд╛рд░реНрди рдХреЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░, рдПрдирдкреАрдПрдо рд▓рд┐рдВрдХ рдкрд░ рдирд┐рд░реНрдорд╛рдг рдмрджрд▓реЗрдВ ...)

рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВ рдУрдПрд╕ рд░рд┐рдПрдХреНрдЯ ( console.log(window.React1 === window.React2) рд░рд┐рдПрдХреНрдЯ рдХреЗ рдбреЙрдХреНрдЯрд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рд▓реЗрдХрд┐рди рдпрд╣ true рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ!
(рдПрдХ рдмрд╣реБрдд рдмреБрд░рд╛ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореИрдВ рдЕрдм рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рд╣реБрдХ рдХреЛ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛: <GBAEmulator useEffect={useEffect} /> ... рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдорд░реНрдЬ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛)

рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рдпрд╣ рдирдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдШрдЯрдХ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ: https://github.com/macabeus/klo-gba.js/blob/ac18f4d42b122c333622f502947135c2de217ce2/react-gbajs/src/index.js#L251 -рдПрд▓274

рдирдорд╕реНрддреЗ,

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрдк (myApp) рд╣реИ рдЬреЛ рдПрдХ рдХрд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (myDepPackage) рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рдмрд┐рд▓реНрдб рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рдереАред рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рд╡реЗрдмрдкреИрдХ рдХреЛ рдХрд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (myDepPackage) рдХреЗ рдЕрдВрддрд┐рдо рдмрдВрдбрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдерд╛ред рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (myDepPackage рдХреА) рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдПрдХрдорд╛рддреНрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓рд╛рдЗрди рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ:

externals: {
  react: "react",
},

рдЖрдк рдпрд╣рд╛рдВ "рдмрд╛рд╣рд░реА" рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ: https://webpack.js.org/configuration/externals/#externals

@tsevdos Veeeery рдзрдиреНрдпрд╡рд╛рдж !!! тЭдя╕П
рдЗрд╕рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬреЛ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХрд╣рд╛ рдерд╛ред

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

рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдЬрд┐рдирдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдПрдореНрдмреЗрдбреЗрдб рдРрдкреНрд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрд┐рд▓реНрдб рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WP рд╢реЛрд░реНрдЯрдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдерд╛ред

рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛! рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рд╣реБрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗред

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

рдореЗрд░реЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╡рд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдзрд╛рдЧреЗ рд╕реЗ рджреЛ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдерд╛ред

рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (@apieceofbart рдХрд╛ рд╕реБрдЭрд╛рд╡ )

  resolve: {
    alias: {
      react: resolve('./node_modules/react')
    }
  }

рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ( @tsevdos рдХрд╛ рд╕реБрдЭрд╛рд╡ )

  externals:
    react: 'react'
  }

рдореБрдЭреЗ html-webpack-plugin рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рдореИрдВ index.html рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдпрд╣ template рд╕реЗ HtmlWebpackPlugin рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИред

// webpack.config.js
plugins: [
   new HtmlWebpackPlugin({
      template: "./public/index.html"
   })
],
<!-- public/index.html -->
<html>
<head>
    <title>React App</title>
</head>
<body>
    <div id="root"></div>
    <script src="main.js"></script>
</body>

</html>

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкреНрд▓рдЧрдЗрди <script type="text/javascript" src="main.js"></script> рдХреЗ рдареАрдХ рдмрд╛рдж рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛ рд░рд╣рд╛ рдерд╛ <div id="root"></div> ред

рддреЛ, рдЬрдм рдореИрдВрдиреЗ рджреЗрд╡ рдЙрдкрдХрд░рдг рдЦреЛрд▓рд╛ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рддреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛ред

<html>
<head>
    <title>React App</title>
</head>
<body>
    <div id="root"></div>
    <script src="main.js"></script>
    <script type="text/javascript" src="main.js"></script> <!-- injected from html-webpack-plugin -->
</body>

</html>

рдореЗрд░реЗ рд▓рд┐рдП, рд╡рд╣ Invalid Hook Call Warning рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдореИрдВ рдиреАрдЪреЗ рдХреА рддрд░рд╣ <script src="main.js"></script> рдХреЛ рд╣рдЯрд╛рдХрд░ рдЪреЗрддрд╛рд╡рдиреА рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

<!-- public/index.html -->
<html>
<head>
    <title>React App</title>
</head>
<body>
    <div id="root"></div>
</body>

</html>

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛!

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдирд┐рд░реНрднрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА рдЗрди рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ @emotion/core рдФрд░ @emotion/styled рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред

https://github.com/emotion-js/emotion/issues/1470

рдирдорд╕реНрддреЗ,

рдмреЗрджрдЦрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╡реЗрдмрдкреИрдХ рдЙрдкрдирд╛рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдзрд╛рди рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝-рдХреНрд░реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк-рд░реАрд╡рд╛рдпрд░реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдПрдХ config-overrides.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const { override, addWebpackAlias } = require('customize-cra');
const path = require('path');

module.exports = override(
  addWebpackAlias({
    react: path.resolve(path.join(__dirname, './node_modules/react')),
  }),
);

рдореЗрд░реЗ рдкрд╛рд╕ Gatsby рд╕рд╛рдЗрдЯ рдкрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, рдореИрдВрдиреЗ npm install рдЪрд▓рд╛рдпрд╛ рдФрд░ Gatsby рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рд╕рдм рдареАрдХ рдХрд░ рджрд┐рдпрд╛

рдпрджрд┐ рдЖрдкрдХреЛ yarn or npm test (рдЬреИрд╕реЗ рдореИрдВ рдерд╛) рдЪрд▓ рд░рд╣реЗ рдЬреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдФрд░ react-test-renderer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ react-test-renderer react рдХреЗ рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг:

// Package.json
{
  ...
    "react" : "16.8.3",
  ...
}

yarn add [email protected] . рдЪрд▓рд╛рдПрдБ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ lib рд╣реИ рдФрд░ рдореИрдВрдиреЗ lib рдФрд░ рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рджреЛрдиреЛрдВ рдореЗрдВ react рдФрд░ react-dom рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐ @apieceofbart рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

@apieceofbart , рдЖрдкрдиреЗ рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдпрд╛ <3

рдореЗрд░реЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╡рд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдзрд╛рдЧреЗ рд╕реЗ рджреЛ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдерд╛ред

рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (@apieceofbart рдХрд╛ рд╕реБрдЭрд╛рд╡ )

  resolve: {
    alias: {
      react: resolve('./node_modules/react')
    }
  }

рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ( @tsevdos рдХрд╛ рд╕реБрдЭрд╛рд╡ )

  externals:
    react: 'react'
  }

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

рдлрд┐рд░ рднреА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реА рдХрд╛рдлреА рд╣реИ, рдЬреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рдореЗрд░реЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╡рд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдзрд╛рдЧреЗ рд╕реЗ рджреЛ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдерд╛ред
рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (@apieceofbart рдХрд╛ рд╕реБрдЭрд╛рд╡ )

  resolve: {
    alias: {
      react: resolve('./node_modules/react')
    }
  }

рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ( @tsevdos рдХрд╛ рд╕реБрдЭрд╛рд╡ )

  externals:
    react: 'react'
  }

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

рдлрд┐рд░ рднреА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реА рдХрд╛рдлреА рд╣реИ, рдЬреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рджреВрд╕рд░рд╛ рдЖрдЗрдЯрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ!
рдпрджрд┐ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╕рд╛рде рдирд┐рд░реНрдпрд╛рдд рдХреА рдЬрд╛рдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ

рдвреЗрд░ рд╕рд╛рд░рд╛ рдкреНрдпрд╛рд░ @apieceofbart !!!! рдореИрдВ рджреАрд╡рд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдореЗрдЬ рдХреЛ рд▓рд╛рдд рдорд╛рд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛

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

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

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

@tschellenbach
рдЖрдк рдмрд┐рдирд╛ рдЗрдЬреЗрдХреНрдЯ рдХрд┐рдП CRA рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП craco рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
https://github.com/gsoft-inc/craco

@tsevdos рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдмрдирд╛рдпрд╛ рд╣реИ: https://youtu.be/esyS87NfBOw

рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рд╡реЗрдмрдкреИрдХ рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд╛рд░реНрд╕рд▓ рдмрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдРрдк рдХреЗ package.json рдореЗрдВ рдПрдХ рдЙрдкрдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛

    "alias": {
        "react": "./node_modules/react",
        "react-dom": "./node_modules/react-dom"
    },

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

- javascript
  - src
     - ComponentIWantToUse.tsx
      - package.json
- electron
   - src
     - IwantToUseItHere.tsx
      - package.json

package.json рджреЛрдиреЛрдВ рдореЗрдВ package.json рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ рдФрд░ рдЬрдм рдореИрдВ npm ls react рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдпрд╣ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: @ ewan-m рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд┐рдпрд╛!

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

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

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

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

рдареАрдХ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рдЕрдкрдиреЗ рдРрдк рд╕реЗ npm ls react react-dom рдЬрд╛рдВрдЪреЗрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛред

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

@GrandathePanda IMHO, рдЖрдкрдХреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ (1) рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ 16.12 рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ; (2) рдЕрдкрдиреЗ рдРрдк рдореЗрдВ 16.8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рд╕рдорд╛рди lib рд╕рдВрд╕реНрдХрд░рдг рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ; (3) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрдирдХреА рдкреНрд░рддрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ:

rimraf node_modules/search-ui/node_modules/react && rimraf node_modules/search-ui/node_modules/react-dom

рдЙрдкрд░реЛрдХреНрдд рдХрдорд╛рдВрдб рдХреЛ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХреЗ "рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕" рднрд╛рдЧ рдХреЗ рддрд╣рдд "рдкреНрд░реАрдмрд┐рд▓реНрдб" рдФрд░ "рдкреНрд░реЗрд╕реНрдЯрд╛рд░реНрдЯ" рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЗрд╕рди (рдЬреЛ рдХрд┐ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ (3), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╡реЗ рд╣реИрдВ 16.8 рдФрд░ 16.12 рдХреЗ рдмреАрдЪ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдирдорд╕реНрддреЗ,

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрдк (myApp) рд╣реИ рдЬреЛ рдПрдХ рдХрд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (myDepPackage) рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рдмрд┐рд▓реНрдб рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рдереАред рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рд╡реЗрдмрдкреИрдХ рдХреЛ рдХрд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (myDepPackage) рдХреЗ рдЕрдВрддрд┐рдо рдмрдВрдбрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдерд╛ред рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (myDepPackage рдХреА) рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдПрдХрдорд╛рддреНрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓рд╛рдЗрди рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ:

externals: {
  react: "react",
},

рдЖрдк рдпрд╣рд╛рдВ "рдмрд╛рд╣рд░реА" рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ: https://webpack.js.org/configuration/externals/#externals

@tsevdos рдореИрдВ рддреБрдорд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБред рдЖрдкрдиреЗ рдЕрднреА рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреА рддреАрд╡реНрд░ рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдЕрдВрдд рдХрд┐рдпрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,

рдореИрдВ рдПрдХ рдШрдЯрдХ рдореЗрдВ рдПрдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рдШрдЯрдХ рдХреЛ gatsby-browser.js рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:

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

  1. рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░реЗрдВрдбрд░рд░ рдХреЗ рдмреЗрдореЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо)
  2. рдЖрдк рдХрд╛рдВрдЯреЛрдВ рдХреЗ рдирд┐рдпрдо рддреЛрдбрд╝ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ
  3. рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдРрдк рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ
    рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП https://fb.me/react-invalid-hook-call рджреЗрдЦреЗрдВред

рдпрд╣ рдПрдХ рдирдореВрдирд╛ рдХреЛрдб рд╣реИ:

import React from 'react';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';

import configureStore from './src/utils/configure-store';
import { useApiResources } from './src/hooks/use-api-resources';

const RootWrapper = ({ element }) => {
  const resources = useApiResources();
  const store = configureStore();
  return <Provider store={store}>{element}</Provider>;
};

RootWrapper.propTypes = {
  element: PropTypes.node.isRequired,
};

export default RootWrapper;

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

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

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 16.12.0 . рд╣реИрдВ

@ leejh3224 рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рдпрд╛рд░! рдШрдВрдЯреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рдЙрддреНрддрд░ рдорд┐рд▓рд╛, рдЗрд╕рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ред
рдмрд╕ рд╕реЗ HtmlWebpackPlugin рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛
inject: true рд╕реЗ inject: 'head' рдФрд░ рдиреНрдпреВрдирддрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреВрд░ рд╣реЛ рдЧрдИ рд╣реИрдВред

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

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ jQuery рдЖрд╡реЗрджрди рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореЗрд░реЗ рдкрд╛рд╕ asJqueryPlugin рдирд╛рдордХ jQuery рдХреЗ рднреАрддрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рд╣реИ:

import React from 'react'
import ReactDOM from 'react-dom'

/**
 * A way to render React components with props easily with jQuery
 *
 * ## Register the React Component
 *
 * In your React Component file, register the component with jQuery using `asJqueryPlugin`
 * ```
 * const Greeting = ({ person }) => <div>Hello {person}</div>
 * asJqueryPlugin('Greeting', Greeting, { person: "Bob" })
 * ```
 *
 * ## Rendering, Selecting and Updating Props with jQuery
 *
 * Select an element and render using the `react` function
 * ```
 * $('#greeting').react('Greeting', { person: 'Frank' })
 * ```
 */

window.reactRegistry = window.reactRegistry || {}

// This is how React components register themselves as available within jQuery
export default function asJqueryPlugin(componentName, Component) {
  window.reactRegistry[componentName] = { Component }
}

if (typeof window.$ !== 'undefined') {
  ;(function($) {
    // Add the plugin function jQuery
    $.fn.react = function renderReactIntoElements(componentName, props) {
      this.each(function render() {
        const entry = window.reactRegistry[componentName || $(this).data('react')]
        if (!entry) throw Error(`${componentName} component is not registered.`)
        ReactDOM.render(<entry.Component {...props} />, this)
      })
      return this
    }
  })(window.$)
}

рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдРрдк рдХреЗ рдХрдИ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИрдВ, рдФрд░ рд▓рдЧрднрдЧ 3-4 рдШрдЯрдХ рдЕрдм рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрдм рдШрдЯрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯ рдмрдВрдбрд▓реЛрдВ рдореЗрдВ рдмрд╛рдВрдзрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЬрдм рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИред

рддреЛ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╡реЗрдмрдкреИрдХ рдореЗрдВ рджреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИрдВ:

entry: {
      foo: './assets/js/foo',
      bar: './assets/js/bar'
}

рдлрд┐рд░ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╣рдо рдПрдХ рдЙрдЬрд╛рдЧрд░ рдШрдЯрдХ (рдкреНрд░рддреНрдпреЗрдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:

// foo.js
import React from 'react'
import asJqueryPlugin from '../utils/asJqueryPlugin'
const Foo = () => {
  const ref = useRef()
  return <div ref={ref}>Foo</div>
}
asJqueryPlugin('Foo', Foo)

// bar.js
... same stuff but with Bar component

рдЕрдм рдпрджрд┐ рдореИрдВ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рджреЛрдиреЛрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ jQuery рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЛрдиреЛрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ ...

<script src="/bundles/foo.js" />
<script src="/bundles/bar.js" />
<script>
    $('#foo-container').react('Foo')
    $('#bar-container').react('Bar')
</script>

...рдореБрдЭреЗ рдпрд╣ рд╣реБрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ (рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рд╕реЗ) рд╕рдордЭрджрд╛рд░ рджреЗрд╡ рдЦреБрдж рдХреЛ рдХрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдорджрдж рдорд┐рд▓реА - https://github.com/facebook/react/issues/13991#issuecomment -554928373
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ react рдФрд░ react-dom рдХреЛ рднреА рд╣рдЯрд╛рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдФрд░ рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдирдорд╕реНрддреЗ,
рдореИрдВ рдмрд╛рддрдЪреАрдд рдФрд░ рд╡реЗрдм рдкрд░ рдХрдИ рдкреЛрд╕реНрдЯ рдкрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЕрднреА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВред
рдореИрдВ рдмрдЧ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░реЗрдкреЛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реВрдВ: https://github.com/jeromelegrand/dooliz-lib
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдзрдиреНрдпрд╡рд╛рджред

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

рдпрд╣ рддреНрд░реБрдЯрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдиреЛрдб.рдЬреЗрдПрд╕ рдмреИрдХрдПрдВрдб рдкрд░ рд╣реЛрддреА рд╣реИред

__ рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреНрдпрд╛ рдЬрд╛рдБрдЪ рдХреА__

рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛рд░реНрди рд╕реЗрдЯрдЕрдк рд╣реИ, yarn list react рдпрд╛ yarn list react-dom рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреИрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореБрджреНрд░рд┐рдд рдХреА рд╣реИ:

for(var key in require.cache) {
    if(key.indexOf("react") !== -1 && key.indexOf("index") !== -1) {
        console.log(key);
    }
}

рдореИрдВ рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕реЗ рдХреБрдЫ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╣реБрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ:

C:\web\resourceful\daCore\node_modules\react-dom\index.js
C:\web\resourceful\daCore\node_modules\react\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\react-is\index.js
C:\web\resourceful\daCore\node_modules\mini-create-react-context\dist\cjs\index.js
C:\web\resourceful\daCore\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\@fortawesome\react-fontawesome\index.js
C:\web\resourceful\daCore\node_modules\@tinymce\tinymce-react\lib\cjs\main\ts\index.js

рдЬреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ 1 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ node_modules/react-dom/index.js . рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ

console.log("React DOM daCore");
global['React1'] = require('react');

рдФрд░ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП node_modules/react-router-dom/cjs/Form.js

require('react-dom');
global['React2'] = require('react');
console.log('#TEST '+(global['React1'] === global['React2']? 'SAME' : 'NOT SAME'));

рдЬреЛ SAME рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдФрд░ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рдореИрдВ рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд░реЗрдкреЛ рдкрд░ рднреА рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред

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

... рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рддрдм рд╣реИ рдЬрдм рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ _roots_ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдкреГрд╖реНрда рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдореЗрдВ ReactDOM.render() рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж @timkindberg рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реАред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдкреЗрдбрд╝-рд╡рд╛рдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ ReactDOMServer.renderToString рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

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

рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ ReactDOM.render рдХреЙрд▓ рдереЗ! рдЕрднреА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдПрд╕рдПрд╕рдЖрд░-рдкреНрд░реАрдкрд╛рд╕ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реЗрдЯрдЕрдк рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╕рд╕реНрдкреЗрдВрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо/рд╕рд░реНрд╡рд░ рдореЗрдВ рдЖрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

рдореИрдВ рдЕрдкрдиреЗ рдЧреБрдЯреЗрдирдмрд░реНрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ react-compare-image https://github.com/junkboy0315/react-compare-image рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЬреАрдм рдореБрджреНрджрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм рднреА рдореИрдВ ReactCompareImage рдШрдЯрдХ рдХреЛ рд╕реЗрд╡ рдлрдВрдХреНрд╢рди рд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реВрдВ рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдбрд┐рдЯ рдлрдВрдХреНрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕реЗрд╡ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВрдиреЗ https://reactjs.org/warnings/invalid-hook-call-warning.html рджреЗрдЦрд╛ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛, рдореБрдЭреЗ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдкреВрд░реНрдг рд╕рд╣реЗрдЬреЗрдВ рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ:

```рдЖрдпрд╛рдд рдирд┐рд░реАрдХреНрд╖рдХ "./рдирд┐рд░реАрдХреНрд╖рдХ" рд╕реЗ;
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛" рд╕реЗ рдЖрдпрд╛рдд {рдЯреБрдХрдбрд╝рд╛};
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рддреБрд▓рдирд╛-рдЫрд╡рд┐" рд╕реЗ ReactCompareImage рдЖрдпрд╛рдд рдХрд░реЗрдВ;

/**

  • рд╡рд░реНрдбрдкреНрд░реЗрд╕ рдирд┐рд░реНрднрд░рддрд╛
    */
    рдХрд╛рд╕реНрдЯ {__} = wp.i18n;

рдХреЙрдиреНрд╕реНрдЯ рд╕реЗрд╡ = ({рд╡рд░реНрдЧрдирд╛рдо, рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ}) => {

const {
    paddingTop,
    paddingRight,
    paddingBottom,
    paddingLeft,

    marginTop,
    marginRight,
    marginBottom,
    marginLeft,

    border,
    borderColor,
    borderType,
    background,

    backgroundImage,
    gradient,

    dividerColor,
    buttonColor,

    direction,

    beforeImage,
    beforeLabel,
    afterImage,
    afterLabel,

} = attributes;

const style = {
    "padding": `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px`,
    "margin": `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`,
    "border": `${border}px ${borderType} ${borderColor}`,
    "background": background
};

return(
    <Fragment>
        <ReactCompareImage
            leftImage={beforeImage.url}
            leftImageLabel={beforeLabel}
            rightImage={afterImage.url}
            rightImageLabel={afterLabel}
            vertical={'vertical' === direction}
            sliderLineColor={dividerColor}
        />
    </Fragment>
);

};

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╣реЗрдЬреЗрдВ;
```
Screenshot 2020-02-19 at 4 11 52 PM

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдБред рдореЗрд░реЗ рдкрд╛рд╕ SO рдкрд░ рдПрдХ рдкреБрдирд░реНрдХрдерди рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://stackoverflow.com/questions/60331304/next-js-with-typescript-invalid-hook-call-hooks-can-only-be-call-inside-of-t

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдиреНрдпреВрдирддрдо рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИ: https://github.com/coler-j/shopify_playground

рдорд╛рдИ рдореЗрди рдРрдк рдПрдХ create-react рдРрдк рд╣реИ (рдмреЗрджрдЦрд▓ рдирд╣реАрдВ) рдЬреЛ рдПрдХ рд╕рд╛рдЭрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЗрд╕реЗ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

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

рд░реЛрд▓рдЕрдк-config.js

export default [
  {
    input: 'src/index.js',
    output: {
      file: pkg.main,
      format: 'cjs',
      sourcemap: true,
    },
    plugins: [external(), babel(), resolve(), commonjs(), svgr()],
  },
  {
    input: 'src/index.js',
    output: {
      file: pkg.module,
      format: 'es',
      sourcemap: true,
    },
    plugins: [
      alias({
        entries: [{ find: '<strong i="12">@components</strong>', replacement: 'src/components' }],
      }),
      external(),
      babel(),
      svgr(),
    ],
  },
]

рдореБрдЦреНрдп рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
craco.config.js

const path = require('path')

module.exports = {
  webpack: {
    alias: {
      react: path.resolve(__dirname, './node_modules/react'),
    },
  },
}

рдореБрдЭреЗ рдХреНрд░реЗрдХреЛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @arminyahya рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдПрдХ рд╕реАрдбреАрдПрди рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдЙрджрд╛рд╣рд░рдг (рдпрд╣ рд╕рдВрдкреВрд░реНрдг HTML рдкреГрд╖реНрда рд╣реИ) Hooks can only be called inside of the body of a function component рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм Example() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд░рд┐рдПрдХреНрдЯрдбреЙрдо рднреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЕрд╕рдВрднрд╡ рд╣реИ?

<!DOCTYPE html>
<html>

<head>
  <script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
  <script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>

</body>
  <script type="text/babel">
    function Example() {
      let [count, setCount] = React.useState(0);
      return ( <h1>Hello</h1> );
    };

  Example();
  </script>
</body>

</html>

@samkamin рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢реВрдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдбрд╝реЗрдВ рд╣реИрдВред рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЕрдЪреНрдЫреА рдкреБрд╖реНрдЯрд┐ рд╣реИ рдХрд┐ рд╣реБрдХ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдЯ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдпреБрдЧреНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ)ред

<html>
<head>
  <script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
  <script crossorigin src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
  <script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
  <div id="root"></div>
  <script type="text/babel">
    function Example() {
      let [count, setCount] = React.useState(0);
      return ( <h1>Hello</h1> );
    };

    ReactDOM.render(<Example />, document.getElementById('root'))
  </script>
</body>
</html>

рд╢реБрдХреНрд░рд┐рдпрд╛! рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдбрд╝ рдХреА рдХрдореА рдирд╣реАрдВ рдереА - рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣рдЯрд╛ рджрд┐рдпрд╛ - рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЧреВрдВрдЧрд╛: <Example /> рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рд╕рд┐рд░реНрдл Example() рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛

рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ 16.13.0 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

webpack.config.js

module.exports = {
  entry: ENTRY,
  output: {
    library: LIBRARY_NAME,
    path: path.resolve(__dirname, OUTPUT_DIR),
    filename: OUTPUT_FILENAME,
    libraryTarget: 'commonjs2',
  },
  module: {
    rules: [
      {
        test: /\.(js|tsx)$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: 'ts-loader',
      },
    ],
  },
  resolve: {
    alias: {
      '<strong i="7">@src</strong>': path.resolve(__dirname, './src'),
      '<strong i="8">@components</strong>': path.resolve(__dirname, './src/components'),
      '<strong i="9">@core</strong>': path.resolve(__dirname, './src/core'),
      react: path.resolve(__dirname, './node_modules/react'),
      'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
    },
    extensions: ['.js', '.json', '.tsx', '.ts'],
  },
  externals: {
    react: 'react',
  },
  target: 'node',
  plugins: [
    new HtmlWebPackPlugin({
      template: './tests/index.html',
      filename: 'index.html',
    }),
  ]}

рдХреЛрдИ рд╕реБрдЭрд╛рд╡? рдореИрдВрдиреЗ рдкреБрд░рд╛рдиреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рд╕рднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред
рдзрдиреНрдпрд╡рд╛рдж! рдореБрд╕реНрдХрд░рд╛рд╣рдЯ:

рдореИрдВрдиреЗ рдПрдХ Settings.js рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛:

import React, {useState} from 'react';

import {
    View,
    Text,
    Switch
} from 'react-native';

export function Settings(props) {
    const [rememberPin, setRememberPin] = useState(false);
    let {changeView, header} = props;


    const toggleRememberPin = (value) => {
        setRememberPin(value);
    };

    return (
            <View>
                    <Text>Remember PIN:</Text>
                    <Switch
                        onValueChange={toggleRememberPin}
                        value={rememberPin}
                        ios_backgroundColor="#aeaeae"
                        />
            </View>
    );
}

export default {Settings};

рдореИрдВ рдЗрд╕реЗ App.js рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдпрд╛рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

import React, {Component} from 'react';
import {
    SafeAreaView,
    StyleSheet,
    View,
    Text,
    TouchableOpacity,
    Dimensions,
    ScrollView,
    Switch
} from 'react-native';

import Colors from './src/assets/Colors';
import {Settings} from './src/components/Settings';
...

export default class App extends Component {
    constructor(props) {
        super(props);
        this.state = {viewsStack: this.viewsStack};
    }

    viewsStack = {
        SplashScreen: false,
        BindingInstructions: false,
        PinPad: false,
        Qr: false,
        Dashboard: false,
        Authorizations: false,
        Settings: true,
        Browsers: false,
        TransmitSDK: false,
        OTP: false,
    };

    changeView = (newView) => {
        let {viewsStack} = this.state;
        for (let key of Object.keys(viewsStack)) {
            viewsStack[key] = false;
        }
        viewsStack[newView] = true;
        this.setState(viewsStack);
    };

    render() {
        let {viewsStack} = this.state;
        return (
            <SafeAreaView style={styles.safeAreaView}>
                {viewsStack.SplashScreen && (splashScreen())}
                {viewsStack.BindingInstructions && (bindingInstructions({changeView: this.changeView}))}
                {viewsStack.PinPad && (pinPad({message: 'Inserisci un nuovo PIN', changeView: this.changeView}))}
                {viewsStack.Qr && (qr({header: 'QR Binding', message: 'Scansiona il QR dalla tua dashboard\noppure\ninserisci il codice manualmente.', changeView: this.changeView}))}
                {viewsStack.Dashboard && (dashboard({header: 'Profilo Utente', changeView: this.changeView}))}
                {viewsStack.Authorizations && (authorizations({header: 'Autorizzazioni', authorizations: [1, 2, 3, 4, 5, 6], changeView: this.changeView}))}
                {viewsStack.Settings && (Settings({header: 'Impostazioni', changeView: this.changeView}))}
            </SafeAreaView>
        );
    }
};
...

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ:

Screenshot 2020-02-27 at 22 27 01

рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

"react": "16.9.0",
"react-native": "0.61.5"

рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

рдЖрдк рдЕрдкрдиреЗ Settings рдШрдЯрдХ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рди рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВред

<Settings header='Impostazioni' changeView={this.changeView} />

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рд╕рд┐рд░рджрд░реНрдж рд╕реЗ рдмрдЪрд╛рдП, рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░-рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдирд╛ рдШрдЯрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ (рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ) рддреЛ рдпрд╣ Invalid Hook Call Warning рджреЗрдЧрд╛
<Route path="/:cuid/:title" render={PostArticle} />

рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рдЖрдзрд╛ рдШрдВрдЯрд╛ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдХрд╣рд╛рдВ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛

рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░-рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдмрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ <Route path={'/upgrade/:plan'} exact children={<Upgrade />} /> рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдмрдХрд┐ рдореИрдВ <Route path={'/upgrade/:plan'} exact children={Upgrade} /> . рдХрд░ рд░рд╣рд╛ рдерд╛

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЬреАрдм рд╣реИ рдпрджрд┐ рдЖрдк рд╕реАрдПрд▓рдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдпрд╛рд╣реА рдпрд╛ рдкреЗрд╕реНрдЯрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ https://github.com/vadimdemedes/pastel/issues/2)ред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдкреАрдпрд░рдбрд┐рдк рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░рд┐рдПрдХреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг / рд░рд┐рдПрдХреНрдЯ рдХреА рд╢реНрд░реЗрдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдореЗрд░реА рдЯреАрдо рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ Invalid hook call рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реА рдереА, рдРрдк рдореЗрдВ рдирд╣реАрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ react-test-renderer react рдФрд░ react-dom рд╕реЗ рдХрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣рд▓ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ package.json рдореЗрдВ package.json resolutions рдЬреЛрдбрд╝рд╛:

"devDependencies": {
    ...
    "react": "16.12.0",
    "react-dom": "16.12.0",
    ...
},
"resolutions": {
    "react-test-renderer": "16.12.0"
}

рдЙрдкрджрд┐рд░ рдореЗрдВ рдЧреИрдЯреНрд╕рдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИред

gatsby-node.js :

const path = require('path')
const fromRoot = name => path.resolve(__dirname + '/../node_modules/' + name)

exports.onCreateWebpackConfig = ({ actions }) => actions.setWebpackConfig({
  resolve: {
    alias: {
      'react': fromRoot('react'),
      'react-dom': fromRoot('react-dom'),
    },
  },
})

npm link рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ)

рддрдм рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рднреА рдЖ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдк npm рд▓рд┐рдВрдХ рдпрд╛ рд╕рдордХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХрд╛ рдмрдВрдбрд▓рд░ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ "рджреЗрдЦ" рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдФрд░ рдПрдХ рдЖрдкрдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ myapp рдФрд░ mylib рд╕рд╣реЛрджрд░ рдлреЛрд▓реНрдбрд░ рд╣реИрдВ, рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди npm link ../myapp/node_modules/react mylib рд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реИред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ A рдХреЛ B рдХрд╛ рдкрд░рд┐рдЪрдп рдХрд░рд╛рдирд╛ рд╣реИ рддреЛ A рдФрд░ B рднрд╛рдИ-рдмрд╣рди рд╣реИрдВя╝Й

  • рдЪрд░рдг 1 (рдмреА рдореЗрдВ)

    • npm link ./../A/node_modules/react

    • npm link

  • рдЪрд░рдг 2 (рдП рдореЗрдВ)
    npm link B

рдЗрд╕рд╕реЗ рдореЗрд░рд╛ рдХрд╛рдо рдмрдирддрд╛ рд╣реИ

рдЗрди рдЙрддреНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реА рдирд┐рд░реНрднрд░рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрд░реЗ рдореБрдЦреНрдп рдРрдк рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдФрд░ рдореЗрд░реЗ рдРрдк рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдореЗрд░реА рдирд┐рд░реНрднрд░рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рд╛ ( npm link <>/webapp/node_modules/react рдЪрд▓ рд░рд╣рд╛ рд╣реИред (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛- рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ React1 рдФрд░ React2 рд╕рдорд╛рди рдереЗ, рддреЛ рдЗрд╕рдиреЗ true рд▓реЙрдЧ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рдкрд░реАрдХреНрд╖рдг рд▓реЙрдЧрд┐рдВрдЧ рдиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдерд╛, рдлрд┐рд░ рднреА рдореБрдЭреЗ рд╣реБрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереАред

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ:

alias: {
        react: path.resolve('./node_modules/react')
 }

рддреЛ рдореИрдВ рдШрд╛рдЯреЗ рдореЗрдВ рд╣реВрдВред

рддреЛ рдореИрдВ рдШрд╛рдЯреЗ рдореЗрдВ рд╣реВрдВред

@orpheus рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╣реА рдкреГрд╖реНрда рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ? рдЙрд░реНрдл рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ ReactDOM.render рдХреЙрд▓ рд╣реИрдВ?

рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╣реА рдкреГрд╖реНрда рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ? рдЙрд░реНрдл рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ ReactDOM.render рдХреЙрд▓ рд╣реИрдВ?

@timkindberg

рдореИрдВ рдирд╣реАрдВред рдореЗрд░реЗ рдкрд╛рд╕ ReactDOM.render рдореЗрд░реЗ app рдХреЗ рдореВрд▓ рдореЗрдВ рд╣реИ, рдФрд░ lib рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдореИрдВ рд▓рд┐рдВрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдФрд░ ReactDOM.render рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдмрд┐рд▓рдХреБрд▓ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

import React from 'react'
import ReactDOM from 'react-dom'
import Root from './App/Root'

ReactDOM.render(
  <Root />,
  document.getElementById('root')
)

рдЬрд╣рд╛рдВ <Root /> рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ

const Root = () => {
  return <Provider store={store}>
        <PermissionsProvider>
              <Suspense fallback={null}>
                <Router history={history}>
                  <Routes store={store} />
                </Router>
              </Suspense>
        </PermissionsProvider>
  </Provider>
}

PermissionsProvider рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП lib рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдРрдк рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд░рд╛рдЬреНрдп рдФрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред

рдирдорд╕реНрддреЗ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдирд╛ рд╣реБрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╕реЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ react-use , swr ред

рдореБрдЭреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдБ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error

рдХреЛрд░ рдХреЛрдб:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВрдиреЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдкрд░ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред

$ tree -I node_modules
.
|-- test-app
|   |-- dist
|   |   |-- index.html
|   |   `-- main.js
|   |-- package-lock.json
|   |-- package.json
|   |-- src
|   |   |-- index.html
|   |   `-- index.js
|   `-- webpack.config.js
`-- test-lib
    |-- dist
    |   `-- main.js
    |-- package-lock.json
    |-- package.json
    |-- src
    |   `-- index.js
    `-- webpack.config.js

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рд╡реЗрдмрдкреИрдХ рдЙрдкрдирд╛рдо рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ npm link рд╡рд┐рдзрд┐ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рди рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред

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

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

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ resolve рдХреБрдВрдЬреА рдХреЗ рддрд╣рдд рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛:

alias: {
  react: path.resolve("./node_modules/react"),
},

рдпрд╣ рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡реЗрдмрдкреИрдХ рдЪрд▓рд╛рддреЗ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдбреЙрдХ рд╡реЙрд▓реНрдпреВрдо рдХреЗ рд╕рд╛рде рдмрдиреА рд░рд╣рддреА рд╣реИред рдореИрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдмрд╣реБрдд рдЬрд▓реНрджреА рдмрд╛рдд рдХреАред рдпрд╣ рдЕрдм рд░рд┐рдПрдХреНрдЯ рд░реЗрдВрдбрд░ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рдЗрдбреНрд░реЗрдЯ рдХреЗ рд╕рд╛рде рдирд╣реАрдВред

рдирдорд╕реНрддреЗ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдирд╛ рд╣реБрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╕реЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ react-use , swr ред

рдореБрдЭреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдБ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error

рдХреЛрд░ рдХреЛрдб:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx

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

@ рд╣реБрд╣рд▓реЗ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

 "peerDependencies": {
    "react": "^16.13.1",
    "react-dom": "^16.13.1"
  },
  "workspaces": {
    "nohoist": [
      "react", "react-dom"
    ]
  }

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

рдЖрдкрдХреЛ рдХрд╛рдордпрд╛рдмреА рдорд┐рд▓реЗ!

рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлреАрдХрд╛-рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХреБрдЫ рднреА рдХрд╛рдо рдХрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ 'рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, {useState, useEffect};
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд' рд╕реЗ рдЖрдпрд╛рдд {рдПрдирд┐рдореЗрдЯреЗрдб, рдЙрдкрдпреЛрдЧ рд╕рдВрдХреНрд░рдордг};

рдХреЙрдиреНрд╕реНрдЯ рдЯреЗрдХреНрд╕реНрдЯрдХрдВрдЯреЗрдВрдЯ = (рдкреНрд░реЙрдкреНрд╕) => {

const [items] = useState([
    { id: '0', title: 'Text1' },
    { id: '1', title: 'Text2' },
    { id: '2', title: 'Text1' }
])

const [index, setIndex] = useState(0);

const transitions = useTransition(items[index], index => index.id,
    {
        from: { opacity: 0 },
        enter: { opacity: 1 },
        leave: { opacity: 0 },
        config: { tension: 220, friction: 120 }
    }
)

useEffect(() => {
    const interval = setInterval(() => {
        setIndex((state) => (state + 1) % items.length);
    }, 4000)
    return () => clearInterval(interval);
}, []);

return (
    <div>
        {
            transitions.map(({ item, props, key }) => (
                <animated.div
                    key={key}
                    style={{ ...props, position: 'absolute' }}
                >
                    <p>{item.title}</p>
                </animated.div>
            ))
        }
    </div>
)

}

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ; `
Capture

рдореИрдВрдиреЗ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕-рдЖрдИрдПрдирдЬреА рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ 16.13.1 рдкрд░ рд╣реИрдВред

рдирдорд╕реНрддреЗ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдирд╛ рд╣реБрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╕реЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ react-use , swr ред
рдореБрдЭреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ?
рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдБ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
рдХреЛрд░ рдХреЛрдб:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx

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

рдмрд╣реБрдд рдЦреВрдм! рд╢реБрдХреНрд░рд┐рдпрд╛

рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлреАрдХрд╛-рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХреБрдЫ рднреА рдХрд╛рдо рдХрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ 'рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, {useState, useEffect};
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд' рд╕реЗ рдЖрдпрд╛рдд {рдПрдирд┐рдореЗрдЯреЗрдб, рдЙрдкрдпреЛрдЧ рд╕рдВрдХреНрд░рдордг};

рдХреЙрдиреНрд╕реНрдЯ рдЯреЗрдХреНрд╕реНрдЯрдХрдВрдЯреЗрдВрдЯ = (рдкреНрд░реЙрдкреНрд╕) => {

const [items] = useState([
    { id: '0', title: 'Text1' },
    { id: '1', title: 'Text2' },
    { id: '2', title: 'Text1' }
])

const [index, setIndex] = useState(0);

const transitions = useTransition(items[index], index => index.id,
    {
        from: { opacity: 0 },
        enter: { opacity: 1 },
        leave: { opacity: 0 },
        config: { tension: 220, friction: 120 }
    }
)

useEffect(() => {
    const interval = setInterval(() => {
        setIndex((state) => (state + 1) % items.length);
    }, 4000)
    return () => clearInterval(interval);
}, []);

return (
    <div>
        {
            transitions.map(({ item, props, key }) => (
                <animated.div
                    key={key}
                    style={{ ...props, position: 'absolute' }}
                >
                    <p>{item.title}</p>
                </animated.div>
            ))
        }
    </div>
)

}

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ; `
Capture

рдореИрдВрдиреЗ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕-рдЖрдИрдПрдирдЬреА рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ 16.13.1 рдкрд░ рд╣реИрдВред

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

styled-components рдкрд░ рдПрдХ рдФрд░ рдереНрд░реЗрдб рд╕реЗ, рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк file: package.json рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ rm -rf node_modules/local-package-name/node_modules рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ node_modules рдХреА рдЬрд╛рдВрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

styled-components рдкрд░ рдПрдХ рдФрд░ рдереНрд░реЗрдб рд╕реЗ, рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк file: package.json рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ rm -rf node_modules/local-package-name/node_modules рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ node_modules рдХреА рдЬрд╛рдВрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдВ, рдЕрдХреЗрд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рджрд░реНрдЬрди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдореИрдВрдиреЗ rm -rf (рд░рд┐рдорд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдкреНрд░реАрд╕реНрдЯрд╛рд░реНрдЯ" рдФрд░ "рдкреНрд░реАрдмрд┐рд▓реНрдб" рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝рд╛ред рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдореЗрдВ npm-link-shared рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рдо рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рдореЛрдиреЛрд░реЗрдкреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд░рд╣реЗ рд╣реИрдВред

рдирдорд╕реНрддреЗ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдирд╛ рд╣реБрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╕реЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ react-use , swr ред
рдореБрдЭреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ?
рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдБ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
рдХреЛрд░ рдХреЛрдб:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx

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

рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ redux рдпрд╛ redux рдЯреВрд▓рдХрд┐рдЯ рдФрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд╡реЗрдмрдкреИрдХ рд╕реЗ рдкрд░реЗрд╢рд╛рдиреА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдХрд╛рд░реНрдпрд╢реАрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ:

// package.json
...
"electronWebpack": {
  "whiteListedModules": ["react-redux"]
}

рджреЗрдЦреЗрдВ https://github.com/electron-userland/electron-webpack/issues/349

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛

import React from 'React'

рдХреЗ рдмрдЬрд╛рдп:

import React from 'react'

рдХрднреА-рдХрднреА рдпрд╣ рдЧреВрдВрдЧреА рдмрд╛рддреЗрдВ рд╣реЛрддреА рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 externals: {
    react: {
      root: "React",
      commonjs2: "react",
      commonjs: "react",
      amd: "react",
    },
    "react-dom": {
      root: "ReactDOM",
      commonjs2: "react-dom",
      commonjs: "react-dom",
      amd: "react-dom",
    },
  },

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

рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд▓рд░реНрди рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ? рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд┐рд╕реНрдордд рдХреЗ рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред

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

'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;
'./logo.svg' рд╕реЗ рд▓реЛрдЧреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'@ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдХреЛрд░/рд╕реАрдПрд╕рдПрд╕ рдмреЗрд╕рд▓рд╛рдЗрди' рд╕реЗ рд╕реАрдПрд╕рдПрд╕ рдмреЗрд╕рд▓рд╛рдЗрди рдЖрдпрд╛рдд рдХрд░реЗрдВ;

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдРрдк () {
рд╡рд╛рдкрд╕реА (

        //<React.Fragment>

        //<CssBaseline />

        <div className="App">
            <header className="App-header">
                <img src={logo} className="App-logo" alt="logo" />
                <p>
                    Edit <code>src/App.js</code> and save to reload.
                    </p>
                <a
                    className="App-link"
                    href="https://reactjs.org"
                    target="_blank"
                    rel="noopener noreferrer"
                >
                    Learn React
                    </a>
            </header>
        </div>

    //</React.Fragment>

);
}

рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП:
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ node_modules рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдореЗрдВ "рдпрд╛рд░реНрди рдЗрдВрд╕реНрдЯреЙрд▓" рдпрд╛ "рдПрдирдкреАрдПрдо рдЗрдВрд╕реНрдЯреЙрд▓" рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВред

рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреВрд╕рд░реА рдкреНрд░рддрд┐ рдХреЛ рдореБрдЦреНрдп рдмрдВрдбрд▓ рдореЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдпреА рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ ReactCurrentDispatcher.current рдЪрд░ рдореЗрдВ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ - рдЬрдм рдпрд╣ рдЦрд╛рд▓реА рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ Invalid hook call ... рдлреЗрдВрдХрддрд╛ рд╣реИ

рд╣рдо рдмрд┐рд▓реНрдб рд╕рдордп рдкрд░ рдХреНрд░рд┐рдПрдЯ рд░рд┐рдПрдХреНрдЯ рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░реЗрдХреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ:

  webpack: {
    alias: {
      react: path.resolve(__dirname, './node_modules/react'),
    },
  },

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

  plugins: [
    {
      plugin: CracoAlias,
      options: {
        source: 'options',
        baseUrl: './',
        aliases: {
          // We need to alias react to the one installed in the desktop/node_modules
          // in order to solve the error "hooks can only be called inside the body of a function component"
          // which is encountered during desktop jest unit tests,
          // described at https://github.com/facebook/react/issues/13991
          // This is caused by two different instances of react being loaded:
          // * the first at packages/desktop/node_modules (for HostSignUpDownloadComponent.spec.js)
          // * the second at packages/components/node_modules (for packages/components/Modal)
          react: './node_modules/react',
        },
      },
    },
  ],

рдореИрдВрдиреЗ @apieceofbart рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП, рдмрд┐рдирд╛ рдмреЗрджрдЦрд▓ рдХрд┐рдП, рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ @craco/craco рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╕реНрдерд╛рдиреАрдп рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП npm link рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛рдП рдЧрдП рдереЗ:

  1. npm i @craco/craco --save . рдЪрд▓рд╛рдХрд░ рдореЗрд░реЗ рдбреЗрдореЛ рдРрдк рдореЗрдВ рдХреНрд░реЗрдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
  2. рдЬрд╣рд╛рдВ рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди рдбреЗрдореЛ рдРрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ craco.config.js рдмрдирд╛рдПрдВред
  3. рдореЗрд░реЗ рдбреЗрдореЛ рдРрдк рдореЗрдВ react-scripts рдХреЛ craco рд╕реЗ рдмрджрд▓рдХрд░ $ start , build рдФрд░ test рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрджрд▓реЗрдВред
// craco.config.js
const path = require('path');

module.exports = {
    webpack: {
        alias: {
            react: path.resolve(__dirname, './node_modules/react')
        }
    }
}
// package.json
{
....
"scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "react-scripts eject"
  },
...
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдпрд╣ рднреА рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ @jasondarwin рдХрд╛ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рдерд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдПрдХ рджрд┐рди рдХрд╛ рдмреЗрд╣рддрд░ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

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

externals: { react: 'react', reactDOM: 'react-dom', },

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ!

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЙрдЯ-рд▓реЛрдбрд░ рд╕рдВрд╕реНрдХрд░рдг 4.0.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЙрдЯ-рд▓реЛрдбрд░ 4.8 рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдЪрд╛рд▓ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рдореБрдЭреЗ рдХреЗрд╡рд▓ Invalid hook call рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬрдм рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдкрд░ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред

рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рд╣реИ:
(https://github.com/BradCandell/invalid-hook-example)

  • react рдФрд░ react-dom . рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг

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

рдореИрдВ рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдБ!
-рдмреНрд░рд╛рдбреЛ

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 externals: {
    react: {
      root: "React",
      commonjs2: "react",
      commonjs: "react",
      amd: "react",
    },
    "react-dom": {
      root: "ReactDOM",
      commonjs2: "react-dom",
      commonjs: "react-dom",
      amd: "react-dom",
    },
  },

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

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЯреЛрд╕реНрдЯрд┐рдлрд╝ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдХрдВрд╕реЛрд▓ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реЗ рдЧреБрдЬрд╝рд░рд╛:

  1. рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо рдХреЗ рдмреЗрдореЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

    1. рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣реБрдХ рдХреЗ рдирд┐рдпрдо рддреЛрдбрд╝ рд░рд╣реЗ рд╣реЛрдВред

    2. рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдРрдк рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рддреАрд╕рд░рд╛ рдореБрджреНрджрд╛ рдмрдирдХрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛:
https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬрдм рддрдХ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдПрдХ рдФрд░ рдкреНрд░рддрд┐ рдмрдВрдбрд▓ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВ _importing_ рдерд╛ред
рдореИрдВрдиреЗ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдФрд░ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдбреЙрдХреНрд╕ рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ $#$ false $#$ рдХреЗ рдмрдЬрд╛рдп true рд▓реМрдЯрд╛ рд░рд╣рд╛ рдерд╛ред
react рдХреЛ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрдВрдбрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд▓ рдереАред

рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдирд╣реАрдВ рдерд╛, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдереАред рд╣рдо рдПрдХ рдирдпрд╛ UI рдврд╛рдВрдЪрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ npm рд▓рд┐рдВрдХ рдпрд╛ рд▓рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдХреЗрд╡рд▓ рд╡реЗрдмрдкреИрдХ рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рднрд╛рдИ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВрдЧреЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ @apieceofbart рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред

рд▓рд╛рдЗрди 130:21: рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ "рдпреВрдЬ рд╕реНрдЯрд╛рдЗрд▓реНрд╕" рдХреЛ рдлрдВрдХреНрд╢рди "рдлрд╛рд░реНрдореЗрд╕реАрдбреИрд╢рдмреЛрд░реНрдб" рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рди рддреЛ рд░рд┐рдПрдХреНрдЯ рдлрдВрдХреНрд╢рди рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реИ рдФрд░ рди рд╣реА рдХрд╕реНрдЯрдо рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдлрдВрдХреНрд╢рди рд░рд┐рдПрдХреНрдЯ-рд╣реБрдХ / рд░реВрд▓реНрд╕-рдСрдл-рд╣реБрдХ
рд▓рд╛рдЗрди 133:45: рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ "React.useState" рдХреЛ рдлрдВрдХреНрд╢рди "рдлрд╛рд░реНрдореЗрд╕реАрдбреИрд╢рдмреЛрд░реНрдб" рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рди рддреЛ рд░рд┐рдПрдХреНрдЯ рдлрдВрдХреНрд╢рди рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реИ рдФрд░ рди рд╣реА рдХрд╕реНрдЯрдо рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдлрдВрдХреНрд╢рди рд░рд┐рдПрдХреНрдЯ-рд╣реБрдХ / рд░реВрд▓реНрд╕-рдСрдл-рд╣реБрдХ

рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реИ ..... рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ

@vyshnaviryali рдЖрдк рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ usePharmacyDashboard

./src/components/HomeFiles/AppFooter.js
рдкрдВрдХреНрддрд┐ 1:1: рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ 'рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдиреЛ-рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб-рд▓реЗрдмрд▓'' рдирд╣реАрдВ рдорд┐рд▓реА рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдиреЛ-рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб-рд▓реЗрдмрд▓'
рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ npm link рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ npm publish рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ yalc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ

рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ npm link рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ npm publish рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ yalc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ

рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХрд┐рдпрд╛ рдерд╛: https://github.com/facebook/react/issues/13991#issuecomment -535150839

рд╣рдо рдЗрд╕реЗ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд▓рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдпрд╣рд╛рдВ рдПрдХ рдФрд░; рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ react рдФрд░ react-dom рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдиреЗ рдореВрд▓ package.json рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

 alias: {
        react: path.resolve('./node_modules/react')
      }

рдореЗрд░реЗ рдореБрдЦреНрдп рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ resolve рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЧрд▓рддреА рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд╣реИ: #2402

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

moduleNameMapper: {

...

  "^react$": "<rootDir>/node_modules/react",
  "^react-dom$": "<rootDir>/node_modules/react-dom",

...

}

рдореБрдЭреЗ рд╣рд╛рдирд┐ рд╣реЛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдРрдк рдХрд┐рд╕реА рднреА рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдбреБрдкреНрд▓реАрдХреЗрдЯ рдирд╣реАрдВ рд╣реИред рдореИрдВ next.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

npm ls react
npm ls react-dom

@maapteh рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдерд╛? рдореИрдВрдиреЗ рдЙрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЪрд▓рд╛рдпрд╛ рдФрд░ рдХреЛрдИ рдбреБрдкреНрд▓реАрдХреЗрдЯ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрд╕реНрдХрд░рдг 16.13.1 рдкрд░ рд╣реИрдВ

@dancancro рдореИрдВ Next.js рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред

npm ls react рдФрд░ npm ls react-dom рджреЛрдиреЛрдВ рд╣реА рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИред рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реВрдВред npm ls рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рдореИрдВ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдореБрдЦреНрдп рд░реЗрдкреЛ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд▓рд┐рдВрдХ рдареАрдХ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддрдм рднреА рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

@justincy рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рдкреИрдХреЗрдЬ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ Next.js рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдпрджрд┐ рдореИрдВ рдореБрдЦреНрдп рдШрдЯрдХ рдХреЛ typeof document !== 'undefined' рдХреЗ рдЕрдВрджрд░ рд░рдЦрддрд╛ рд╣реВрдВ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ Next.js рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ node_modules рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЛ рд╣рдЯрд╛рдХрд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдпрд╣ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред

@dancancro рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ Next.js рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рд╣реИред рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛, рддреЛ рдмрд╣реБрдд рд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреАред рдореИрдВ рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИред

рдЕрдЧрд░ рдореИрдВ рдореБрдЦреНрдп рдШрдЯрдХ рдХреЗ рд╕рд╛рдд рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкрд╛рдВрдЪ рдХреЛ рд╣рдЯрд╛ рджреВрдВ рддреЛ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧреАред рдореИрдВ рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ typeof document !== 'undefined' s рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдп рдЯреАрдо, рдореИрдВ рд░рд┐рдПрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 16.2.0 рд╕реЗ 16.13.1 рддрдХ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд░рд┐рдПрдХреНрдЯ-рдбреЛрдо рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ред
рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░реИрдкрд░ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕реЗ "/ рдкрд░реАрдХреНрд╖рдг" рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

class TestWrapper extends React.Component { render() { return ( <React.Fragment> <TestComponent /> </React.Fragment> ) } }

рдкрд░реАрдХреНрд╖рдг рдЖрд╡рд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ
function TestComponent(props) { useEffect(() => { console.log("TEST COMPONENT"); }); return ( <div> Hello world! </div> ) }

рд▓реЗрдХрд┐рди рдЬрдм рдкреГрд╖реНрда рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ UseEffect рд╣реБрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рдпрд╛рдиреА рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ рдЪреЗрддрд╛рд╡рдиреА
рдкреБрдирд╢реНрдЪ. :

  1. рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рд╕реНрдерд╛рдкрд┐рдд рд╣реИ
  2. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рд╕рдВрд╕реНрдХрд░рдг 16.13.1 . рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рд╣реИ
рдореИрдВ рддреЛ рдмрд╕ ...
@@
ReactError
рдореИрдВ рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА - рдорджрдж рдордд рдХрд░реЛред

рдЕрдиреНрдп рд╕рднреА рдкреЗрдЬ рдФрд░ рдлрдВрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ

@Brotipok рдЕрдЧрд▓рд╛.рдЬреЗрдПрд╕ рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг? (рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦрдирд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ 9.4.X рд╕реЗ 9.5 рдкрд░ рдЬрд╛рдиреЗ рдкрд░)

рдирдорд╕реНрддреЗ!

рдЬрдм рдореИрдВ рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбреЛрдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреИрдХреЗрдЬред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг: 16.13.1
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рд╕рдВрд╕реНрдХрд░рдг: 16.13.1

рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ create-react-app my-app --template typescript рдХреЗ рд╕рд╛рде рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рднреАрддрд░ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди

{
"рдирд╛рдо": "рдмреНрд▓рдмреНрд▓рд╛рдмреНрд▓рд╛рдореЛрд╡реА",
"рд╕рдВрд╕реНрдХрд░рдг": "0.1.0",
"рдирд┐рдЬреА": рд╕рдЪ рд╣реИ,
"рдирд┐рд░реНрднрд░рддрд╛": {
"@ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдЬреЗрд╕реНрдЯ-рдбреЛрдо": "^ 4.2.4",
"@ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рд░рд┐рдПрдХреНрд╢рди": "^9.5.0",
"@ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдпреВрдЬрд╝рд░-рдЗрд╡реЗрдВрдЯ": "^ 7.2.1",
"@types/jest": "^24.9.1",
"@ рдкреНрд░рдХрд╛рд░/рдиреЛрдб": "^12.12.53",
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "^16.9.43",
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо": "^16.9.8",
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░-рдбреЛрдо": "^5.1.5",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЖрдЗрдХрди": "^3.10.0",
"рд░рд┐рдПрдХреНрд╢рди-рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕": "3.4.1",
"рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ": "^ 3.7.5",
"рд╡реЗрдмрдкреИрдХ-рдмрдВрдбрд▓-рд╡рд┐рд╢реНрд▓реЗрд╖рдХ": "^ 3.8.0"
},
"рд╕реНрдХреНрд░рд┐рдкреНрдЯ": {
"рдкреНрд░рд╛рд░рдВрдн": "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╛рд░рдВрдн",
"рдмрд┐рд▓реНрдб": "рд░рд┐рдПрдХреНрд╢рди-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд┐рд▓реНрдб",
"рдкрд░реАрдХреНрд╖рдг": "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░реАрдХреНрд╖рдг",
"рдЗрдЬреЗрдХреНрдЯ": "рд░рд┐рдПрдХреНрд╢рди-рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЗрдЬреЗрдХреНрдЯ",
"рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ": "рд╕реНрд░реЛрдд-рдорд╛рдирдЪрд┐рддреНрд░-рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 'рдмрд┐рд▓реНрдб/рд╕реНрдЯреЗрдЯрд┐рдХ/рдЬреЗрдПрд╕/*.рдЬреЗрдПрд╕'"
},
"рдПрд╕реНрд▓рд┐рдВрдЯрдХреЙрдиреНрдлрд╝рд┐рдЧ": {
"рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд": "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк"
},
"рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реВрдЪреА": {
"рдЙрддреНрдкрд╛рджрди": [
">0.2%",
"рдорд░рд╛ рдирд╣реАрдВ",
"рд╕рднреА op_mini рдирд╣реАрдВ"
],
"рд╡рд┐рдХрд╛рд╕": [
"рдкрд┐рдЫрд▓реЗ 1 рдХреНрд░реЛрдо рд╕рдВрд╕реНрдХрд░рдг",
"рдкрд┐рдЫрд▓реЗ 1 рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг",
"рдкрд┐рдЫрд▓реЗ 1 рд╕рдлрд╛рд░реА рд╕рдВрд╕реНрдХрд░рдг"
]
}
}
рдореИрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдкрд╛рдЧрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрдЧрд░ рдХреЛрдИ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдзрдиреНрдпрд╡рд╛рджред

@Brotipok рдЕрдЧрд▓рд╛.рдЬреЗрдПрд╕ рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг? (рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦрдирд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ 9.4.X рд╕реЗ 9.5 рдкрд░ рдЬрд╛рдиреЗ рдкрд░)

рдпрд╣рд╛рдБ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ
"рдирд┐рд░реНрднрд░рддрд╛": {
"рдЕрдЧрд▓рд╛": "9.4.4",
"рдиреЗрдХреНрд╕реНрдЯ-рдЗрдореЗрдЬ": "^1.4.0",
"рдиреЛрдб-рдПрд╕рдПрдПрд╕": "^4.14.1",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "16.13.1",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рдореЗрдЯрд╛": "^3.0.0-рдмреАрдЯрд╛.2",
"рд░рд┐рдПрдХреНрд╢рди-рдбреЛрдо": "16.13.1",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдХреНрд╖реИрддрд┐рдЬ-рд╕рдордпрд░реЗрдЦрд╛": "^1.5.3",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореЗрдЯрд╛-рдЯреИрдЧ": "^0.7.4",
"react-onclickoutside": "^6.9.0"
},
"рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛": {
"@ рдкреНрд░рдХрд╛рд░/рдиреЛрдб": "^14.0.23",
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "^16.9.43",
"рдЯрд╛рдЗрдкрдкреНрд░рддрд┐": "^ 3.9.7"
}

рдореИрдВ material-ui/core/Dialog рдШрдЯрдХреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ react рдФрд░ react-dom рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.8.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ package.json рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред react-dom рдЖрдпрд╛рддред

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде npm ls react рдФрд░ npm ls react-dom рдЪрд▓рд╛рдпрд╛ рд╣реИ рдореИрдВрдиреЗ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ:

// Add this in node_modules/react-dom/index.js
window.React1 = require('react');

// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);

рдЬреЛ false рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдирд┐рд░реНрднрд░рддрд╛ рджреНрд╡рд╛рд░рд╛ рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ "рдЕрд▓рдЧ" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рдЯреНрд░реИрдХ рдХрд░реВрдВ?, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рд╕рд╛рдордЧреНрд░реА UI рд╕рдВрд╡рд╛рдж рдШрдЯрдХ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЬреИрд╕реЗ рд╣реА рдЯреИрдк рд╣реЛрддрд╛ рд╣реИ рдПрдХ рдмрдЯрди рдЬреЛ рдЗрд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдЬреИрд╕реЗ List рдФрд░ ListItems рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

рдореИрдВрдиреЗ рд╕рдВрдХрд▓реНрдкреЛрдВ рдХреЛ рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЗрд╕рдиреЗ рдЗрд╕реЗ рдареАрдХ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдореИрдВ рд╡реЗрдм рдкреИрдХ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг react-scripts build рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИред

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

рдкреГрд╖реНрдарднреВрдорд┐:
рдореИрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреЛ рд╡реЗрдмрдкреИрдХ-рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд╣рд╛рдВ рдЙрд╕ рдШрдЯрдХ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

function Example() {
    const [count, setCount] = React.useState(0);

    return <button onClick={() => setCount(count + 1)}>
        You clicked {count} times
    </button>;
}
export default Example;

... рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╕реАрдзреЗ HTML рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕реЗ:

<script defer>
            ReactDOM.render(
                ExportedCompiledExample.default(props),
                document.getElementById("my_element")
            );
</script>

рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ _ рдЬрдм рддрдХ рдШрдЯрдХ рдореЗрдВ рд╣реБрдХ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдЗрд╕ рднрдпрд╛рдирдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рднрд╛рдЧрддрд╛ рд░рд╣рд╛ред

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

export default () => <Example />;

(рдпрд╛ export default props => <Example {...props} /> рдЬрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛ)ред

рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА 20/20 рдореЗрдВ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

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

рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ , рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ...

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

... рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рд╕рд╣реА рдХреЙрд▓рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдореЗрдВ рдРрд╕рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП, Example() рдирд╣реАрдВ рдмрд▓реНрдХрд┐ <Example /> )ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдЕрдЧрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджрд░реНрдн (рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдИрдПрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗрдЯрдЕрдк) рд╢рд╛рдорд┐рд▓/рдЙрд▓реНрд▓реЗрдЦ/рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рддрд╛ред :) рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ export default Example рд╕рдВрд╕реНрдХрд░рдг рдмрд┐рдирд╛ рд╣реБрдХ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди @apieceofbart рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдПрдирдкреАрдПрдо рд▓рд┐рдВрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред

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

  1. npm install -D react-app-rewired
  2. рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ config-overrides.js рдирд╛рдо рдХреА рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВред
// config-overrides.js
module.exports = function override(config, env) {
  const path = require('path');

  return {
    ...config,
    resolve: {
      ...config.resolve,
      alias: {
        ...config.resolve.alias,
        react: path.resolve('./node_modules/react')
      }
    }
  };
}
  1. рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ react-scripts ... -commands рдХреЛ package.json рдореЗрдВ react-app-rewired ... рд╕реЗ рдмрджрд▓реЗрдВред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛

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

рдпрд╛рд░реНрди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб

рдореИрдВ рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ package.json рдореЗрдВ рд╕рдВрдХрд▓реНрдк рдХреЛ рдордЬрдмреВрд░ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ:

  "resolutions": {
    "**/react": "16.7.0-alpha.2",
    "**/react-dom": "16.7.0-alpha.2"
  },

рдкреИрд░реЗрдВрдЯ рдРрдк (рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЦрдкрдд) рдореЗрдВ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛:

  1. yarn add link:/path/to/parent-app/node_modules/react
  2. yarn add link:/path/to/parent-app/node_modules/react-dom

рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ yarn add link:/path/to/library . рдХреЗ рд╕рд╛рде рдкреИрд░реЗрдВрдЯ рдРрдк рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛

рдирдорд╕реНрддреЗ
рдореИрдВ рдпрд╛рд░реНрди рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд▓реЗрдЖрдЙрдЯ рд╣реИ:

рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░/
рдкреБрд╕реНрддрдХрд╛рд▓рдп/
рдРрдк1/
рдРрдк 2/

app1 рдФрд░ app2 рдореЗрдВ v16.9.0, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо v16.9.0 рдФрд░ 'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред
'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдореЗрдВ v16.9.0 рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣рд╛рдиреА рдХреА рдХрд┐рддрд╛рдм рдкрд░ рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рднреА рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдиреА рдХреА рдХрд┐рддрд╛рдм рд╕реЗ рдЖрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ v16.13.1 рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдореИрдВ рдпрд╛рд░реНрди рдЗрдВрд╕реНрдЯреЙрд▓ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.13.1 рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реВрдВ рдФрд░ рдРрдк 1 рдФрд░ рдРрдк 2 рдХреЗ рд╕реНрдерд╛рдиреАрдп рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ 16.9.0 рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдЬрдм рдореИрдВ рдРрдк 1 (рд╕реАрдЖрд░рдП рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛) рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ v16.9.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди 'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдХреЗ рдШрдЯрдХ рд░рд┐рдПрдХреНрдЯ v16.13.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

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

рдирдорд╕реНрддреЗ
рдореИрдВ рдпрд╛рд░реНрди рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд▓реЗрдЖрдЙрдЯ рд╣реИ:

рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░/
рдкреБрд╕реНрддрдХрд╛рд▓рдп/
рдРрдк1/
рдРрдк 2/

app1 рдФрд░ app2 рдореЗрдВ v16.9.0, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо v16.9.0 рдФрд░ 'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред
'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдореЗрдВ v16.9.0 рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣рд╛рдиреА рдХреА рдХрд┐рддрд╛рдм рдкрд░ рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рднреА рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдиреА рдХреА рдХрд┐рддрд╛рдм рд╕реЗ рдЖрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ v16.13.1 рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдореИрдВ рдпрд╛рд░реНрди рдЗрдВрд╕реНрдЯреЙрд▓ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.13.1 рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реВрдВ рдФрд░ рдРрдк 1 рдФрд░ рдРрдк 2 рдХреЗ рд╕реНрдерд╛рдиреАрдп рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ 16.9.0 рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдЬрдм рдореИрдВ рдРрдк 1 (рд╕реАрдЖрд░рдП рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛) рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ v16.9.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди 'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдХреЗ рдШрдЯрдХ рд░рд┐рдПрдХреНрдЯ v16.13.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ yarn run eject CRA рдРрдк рдФрд░ resolve рд╕реЗрдХреНрд╢рди рдХреЗ рдСрд░реНрдбрд░ рдХреЛ рдпрд╣рд╛рдВ рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛:

```рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдореЙрдбреНрдпреВрд▓: ['рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕', рдкрд╛рде.рдПрдкрдиреЛрдбрдореЙрдбреНрдпреВрд▓реНрд╕]ред рдХреЙрдиреНрдХреИрдЯ (
рдореЙрдбреНрдпреВрд▓.рдЕрддрд┐рд░рд┐рдХреНрддрдореЙрдбреНрдпреВрд▓рдкрд╛рде || []
),
````

рдкреНрд░рддрд┐
```рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдореЙрдбреНрдпреВрд▓: [paths.appNodeModules, 'node_modules'].concat(
рдореЙрдбреНрдпреВрд▓.рдЕрддрд┐рд░рд┐рдХреНрддрдореЙрдбреНрдпреВрд▓рдкрд╛рде || []
),
````

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'appNodeModules' рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдРрдк рдХреЛ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рд╡реЗрдмрдкреИрдХ рдФрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕реЗ рдЬреБрдбрд╝реА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ 'рд╣реБрдХ' рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдП рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рд╡реЗрдмрдкреИрдХ рджреНрд╡рд╛рд░рд╛ рдмрдВрдбрд▓ рдХреА рдЧрдИ рд╣реИ (рдФрд░ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдП рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдПрдХреНрд╕рдЯрд░реНрдирд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ (рдЗрд╕реЗ рдХреЙрдордирдЬ 2 рдореЙрдбреНрдпреВрд▓ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛)ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдВрдбрд▓ рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдиреЗ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг 'рд╣реБрдХ' рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХреАред

рдпрд╣ рдЗрди рддрдереНрдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ:

  • рдореЙрдбреНрдпреВрд▓ рдП рдХреЛ 'рд░рд┐рдПрдХреНрдЯ' рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЗ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЗрддрд╛ рд╣реИ;
  • рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдВрдбрд▓ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ 'рд▓реЛрдб' рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
  • рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдФрд░ рд╡реЗрдмрдкреИрдХ рд░рдирдЯрд╛рдЗрдо рджреЛрдиреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдореЙрдбреНрдпреВрд▓ рдХреИрд╢ рд╣реЛрддрд╛ рд╣реИ...

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

рдореИрдВрдиреЗ рдХрдИ рдЙрдкрдирд╛рдореЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдирд╛рдо рдХреЗрд╡рд▓ рд╡реЗрдмрдкреИрдХ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдХрд╣рд╛рдВ рдЦреЛрдЬрд╛ рдЬрд╛рдПред рдпрд╣ рдПрдХрд╛рдзрд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХреИрд╢ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!

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

рдЖрдЦрд┐рд░рдХрд╛рд░...

//webpack.config.js

module.exports = {
  ...
  externals: {
      react: 'react',
  },
}

Vue3 рдореЗрдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ react рдФрд░ react-dom рдХреЗ рд░реВрдк рдореЗрдВ peerDependencies рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди рдореЗрдВ рдбрд╛рд▓рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛, рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

  "peerDependencies": {
    "react": "^16.13.1",
    "react-dom": "^16.13.1"
  },

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдЕрдЧрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджрд░реНрдн (рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдИрдПрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗрдЯрдЕрдк) рд╢рд╛рдорд┐рд▓/рдЙрд▓реНрд▓реЗрдЦ/рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рддрд╛ред :) рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ export default Example рд╕рдВрд╕реНрдХрд░рдг рдмрд┐рдирд╛ рд╣реБрдХ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдп @ рдПрд╕реНрдкреЗрди42 ,
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдмрддрд╛рдпрд╛, рд╣рдордиреЗ рд╕рдЪрдореБрдЪ _everything_ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛?

рддреЛ, рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ (рдореИрдВ рдЗрд╕реЗ @bla/bla рдХрд╣реВрдВрдЧрд╛), рд╣рдорд╛рд░реЗ рдкрд╛рд╕ index.js рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдХ рд╣реИ, рдЬреИрд╕реЗ

function Bla = ({...props]) => {
const [bla, setBla] = useState(false);
return bla ? <div {...props} /> : 'no luck';
}

рд╣рдо npx babel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ npm link рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ npm link @bla/bla рдЬреИрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред
рдкреИрдХреЗрдЬ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджреЛрдиреЛрдВ рд╣реА рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯ-рдбреЛрдо рдХреЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ:

import Bla from `@bla/bla`

const RenderBla = ({...props}) => <Bla {...props} />

export default RenderBla

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рдмрдиреА рд╣реБрдИ рд╣реИред
Invalid hook call. Hooks can only be called inside of the body of a function component.

рд╣рдо рдХреНрдпрд╛ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВ?

"externals": {
  "react": "react",
  "react-dom": "react-dom"
}

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛, рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рдпрд╛рд░ тЭдя╕П

рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ (рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдСрдирд▓рд╛рдЗрди) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдлрд╝реАрд▓реНрдб рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝рд░ рддреНрд░реБрдЯрд┐

рдХреБрдЫ рдлреИрдмреНрд░рд┐рдХ ui рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдПрдХ spfx рдлрд╝реАрд▓реНрдб рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдЬрдм рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝реИрдмреНрд░рд┐рдХрдпреВрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ:
https://reactjs.org/docs/error-decoder.html/?invariant=321 ,
https://reactjs.org/docs/error-decoder.html/?invariant=290&args []=A.%20General

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлреИрдмреНрд░рд┐рдХ рдпреВрдЖрдИ рдХрд╛рд░рдг рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рднреА рдХрдкрдбрд╝реЗ рдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдлреИрдмрд┐рдХ рдпреВрдЖрдИ, 6.189.2, 6.214.0 рдФрд░ 7.114.1 рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рд╕рднреА рдлреИрдмреНрд░рд┐рдХ-рдпреВрдЖрдИ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдлрд┐рд░ рднреА рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА, рдпрд╣рд╛рдБ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ
рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
+-- @рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ/рдПрд╕рдкреА-рд╡реЗрдмрдкрд╛рд░реНрдЯ- рд╡рд░реНрдХрдмреЗрдВрдЪ @1.9.1
| +-- @рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ/рдСрдлрд┐рд╕-рдпреВрдЖрдИ-рдлреИрдмреНрд░рд┐рдХ-рд░рд┐рдПрдХреНрдЯ-рдмрдВрдбрд▓@ 1.9.1
| | -- [email protected] deduped | +-- @microsoft/[email protected] | | -- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛@16.8.5 рдкреНрд░рддрд┐рдкрд╛рджрд┐рдд
| +-- @Microsoft/sp-property-pane@ 1.9.1
| | -- [email protected] deduped | -- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛@16.8.5 рдкреНрд░рддрд┐рдкрд╛рджрд┐рдд
`-- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛@16.8.5

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

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

рдмреЗрд╢рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ред optimization.runtimeChunk рдХреЛ single рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд░рдирдЯрд╛рдЗрдо рдмрди рдЬрд╛рдПрдЧрд╛ред рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЖрдкрдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рддрддреНрдХрд╛рд▓ рд░реЛрдХ рджреЗрдЧрд╛ред

рджреЗрдЦреЗрдВ https://webpack.js.org/configuration/optimization/#optimizationruntimechunk

рдЬрд╝рд░рд╛ рд╕реБрдирд┐рдП рд╕рднреА,
рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕реАрдбреАрдПрди рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рд╣рд░реА lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ <script> рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдореИрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред lib рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ
3. You might have more than one copy of React in the same app рддреНрд░реБрдЯрд┐ред
рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдирд╣реАрдВ рд╣реИ: https://github.com/Anyline/anyline-ocr-anylinejs-module
рдореИрдВ рд╕реАрдЖрд░рдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред

рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ред

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

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдпрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред
рдореИрдВрдиреЗ рдЗрд╕реЗ GitLab рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдкрддреЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред
рдкреИрдХреЗрдЬ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ "рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓" рдорд┐рд▓рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рд╣реБрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВред

рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕

рдкрд░реАрдХреНрд╖рдг рдЬреЛ "рдРрдк" рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рджреЛ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ require рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ import рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рджреЛрдиреЛрдВ рддреНрд░реБрдЯрд┐ рджреЗрддреЗ рд╣реИрдВред

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

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

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдпрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред
рдореИрдВрдиреЗ рдЗрд╕реЗ GitLab рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдкрддреЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред
рдкреИрдХреЗрдЬ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?

@catsheue рдЖрдкрдХреЗ рд▓рд┐рдП React1 === React2 true рдерд╛?
рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░рд╛ рдПрдирдкреАрдПрдо рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рдлрд┐рд░ рднреА рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╣реИ?

рдореЗрд░рд╛ React1 === React2 = true рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдореИрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рд╕реНрдерд╛рдиреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП yarn link рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдореЗрд░реА рдЧрд▓рддреА react рдФрд░ react-dom рдХреЛ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣реА рдереАред

рддреЛ рдореБрдЭреЗ yarn add --peer react react-dom рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдЕрдВрдд рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЧрд▓рддреА рдХреА рд╣реИ, рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╢реБрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред rm -rf node_modules; yarn рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ред

рдореБрдЭреЗ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕реНрдЯреЛрд░реАрдмреБрдХ (v6.0.28) рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рджрд┐рдпрд╛, node_modules рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ yarn install рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдпрд╛ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдкрд░ рдЖрдБрд╕реВ рдФрд░ рдмрд░реНрдмрд╛рдж рдШрдВрдЯреЗ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХрд╛рдордХрд╛рдЬ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдФрд░ /functions/ node_modules рдлрд╝реЛрд▓реНрдбрд░ рд╣реИред рдЕрдЧрд░ рдореИрдВ /functions/node_modules рд╣рдЯрд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░рд╛ рдРрдк рдареАрдХ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдРрд╕рд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ node_modules рджреЛрдиреЛрдВ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдореМрдЬреВрдж рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

create-react-app рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рдРрдк рдореЗрдВ mdbootstrap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рднрд╛рд╡реА рдкреАрдврд╝реА рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдПред

рдмрдЯрди рдФрд░ рдХрд╛рд░реНрдб рдЫрд╡рд┐рдпреЛрдВ рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди mdbootstrap рдШрдЯрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрдЦреАред рд░рд┐рдПрдХреНрдЯ рд╕рдкреЛрд░реНрдЯ рдЖрд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХреЗ рд▓рд┐рдП index.js рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдкрд░ true рд▓реМрдЯрд╛ред рддреЛ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдкрдбрд╝реАред

рдлрд┐рдХреНрд╕ npm dedupe . рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛

npm ls react

+-- [email protected]
| `-- [email protected]
`-- [email protected]

npm dedupe

npm ls react

+-- [email protected]
| `-- [email protected]  deduped
`-- [email protected]

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рднреА рдШрдЯрдХреЛрдВ рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЦреБрд╢реА рдХреЗ рджрд┐рдиред

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ "рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓" рдорд┐рд▓рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рд╣реБрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВред

рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕

рдкрд░реАрдХреНрд╖рдг рдЬреЛ "рдРрдк" рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рджреЛ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ require рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ import рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рджреЛрдиреЛрдВ рддреНрд░реБрдЯрд┐ рджреЗрддреЗ рд╣реИрдВред

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

@ miket01 рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдЬреЛ рдореИрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ (рд▓реЗрдХрд┐рди w/o рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛?

рдРрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рдорд┐рд▓реЗ:

function HeadedSection (props) {
   if (!ReactDOMServer.renderToStaticMarkup(props.children))
        return null;

    const [hidden, set_hidden] = useState(props.hidden);

рдкрд╣рд▓реЗ useState рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛:

function HeadedSection (props) {
    const [hidden, set_hidden] = useState(props.hidden);

    if (!ReactDOMServer.renderToStaticMarkup(props.children))
        return null;

рдХрдИ рдорд╣реАрдиреЛрдВ рддрдХ рдЗрд╕реЗ рдЕрд▓рдЧ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред

рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╢реВрдиреНрдп рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред react рдХреА рдПрдХ рдкреНрд░рддрд┐ рдФрд░ react-dom рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИ рдФрд░ рд╡реЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рдХреЛрдИ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред

рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреБрдЫ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдиреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВ next.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдлрд┐рдХреНрд╕ рдХреБрдЫ рдЙрдк-рдШрдЯрдХреЛрдВ рдХреЛ {typeof window !== 'undefined' рдореЗрдВ рд▓рдкреЗрдЯрдХрд░ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдШрдЯрдХ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

[18:50:42] (master) questions
// тЩе npm ls react
[email protected] /Users/Dan/work/b/questions
тФФтФАтФА [email protected]

[22:46:34] (master) questions
// тЩе npm ls react-dom
[email protected] /Users/Dan/work/b/questions
тФФтФАтФА [email protected]

[22:46:55] (master) questions
// тЩе npm dedupe
removed 55 packages, moved 46 packages and audited 1712 packages in 65.449s

33 packages are looking for funding
  run `npm fund` for details

found 26 vulnerabilities (15 low, 3 moderate, 8 high)
  run `npm audit fix` to fix them, or `npm audit` for details

рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреА рдЧрдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ReactCurrentDispatcher.current === null рд▓реЗрдХрд┐рди рдореБрдЭреЗ /node_modules/react/cjs/react.development.js рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдХреБрдЫ рдкрд░ рд╕реЗрдЯ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ ReactCurrentDispatcher.current рдХрд╛ рдореВрд▓реНрдп рдХрд╣рд╛рдБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
https://github.com/facebook/react/search?p=2&q=%22ReactCurrentDispatcher.current+%3D%22&type=code

рдпрд╣ рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдореЗрд░реЗ react-development.js рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

    const prevPartialRenderer = currentPartialRenderer;
    setCurrentPartialRenderer(this);
    const prevDispatcher = ReactCurrentDispatcher.current;
    ReactCurrentDispatcher.current = Dispatcher;

https://github.com/facebook/react/blob/702fad4b1b48ac8f626ed3f35e8f86f5ea728084/packages/react-dom/src/server/ReactPartialRenderer.js#L859

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде next.js рджреНрд╡рд╛рд░рд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдб react-dom/server рдХреЗ рддрд╣рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рд╣реИред рдореИрдВ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ /node_modules/react/cjs/react-development.js рд╕рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рдЕрджреНрдпрддрди: рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереАред рдореИрдВрдиреЗ рдЕрдкрдиреА next.config.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ webpack.config.externals рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдерд╛
https://github.com/vercel/next.js/issues/17592#issuecomment -712443172

рдЬрдм рднреА рдореИрдВ рдЗрд╕рдореЗрдВ рд╕рд╛рдордЧреНрд░реА UI рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░рд╛ рдРрдк рдПрдХ рдмрдбрд╝реА рддреНрд░реБрдЯрд┐ (рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓) рдлреЗрдВрдХрддрд╛ рд╣реИред рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рд╣реВрдБ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдорджрдж рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

MoOx picture MoOx  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmullo picture jmullo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

huxiaoqi567 picture huxiaoqi567  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ