React: рдПрдЪрдПрдордЖрд░ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдм рдХреИрд╕реЗ рдРрдк рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рд░рд┐рдПрдХреНрдЯ-рд╣реЙрдЯ-рд▓реЛрдбрд░ рдХреЛ рдмрджрд▓реЗ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЕрдЧре░ 2019  ┬╖  85рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдбреИрди рдЕрдмреНрд░рд╛рдореЛрд╡ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рджреЗрд╡рдЯреВрд▓ v4 react-hot-loader рдЕрдкреНрд░рдЪрд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ: https://twitter.com/dan_abramov/status/1144715740983046144?s=20

рдореБрдЭреЗ:
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реБрдХ рд╣реИ:
require("react-reconciler")(hostConfig).injectIntoDevTools(opts);
рд▓реЗрдХрд┐рди HMR рдиреЗ рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЕрдм рдпрд╣ рдПрдХ рдирдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ Devtools рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ HMR рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ; рдЕрдм рдЬрдм react-hot-loader рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде, require("react-hot-loader/root").hot рдкрджреНрдзрддрд┐), рд╣рдореЗрдВ HMR рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • DOM рдРрдкреНрд╕ рдХреЛ рд░рд┐рдПрдХреНрдЯ рдХрд░реЗрдВ
  • рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдиреЗрдЯрд┐рд╡ рдПрдкреНрд╕
  • рдХрд╕реНрдЯрдо рдХрд╕реНрдЯрдо рд░реЗрдВрдбрд░рд░ рдРрдкреНрд╕

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА react-hot-loader рдорд╛рдзреНрдпрдо рд╕реЗ HMR рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рддрд╛ рд╣реИред

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

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

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреНрдпрд╛ рд╣реИ?

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

рдХреНрдпрд╛ рдореИрдВ рд╡реЗрдм рдкрд░ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

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

рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рд╣реИ?

рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЯреБрдХрдбрд╝реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

  • рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ "рд╣реЙрдЯ рдореЙрдбреНрдпреВрд▓ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ" рддрдВрддреНрд░ред

    • рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдмрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    • рдЬреИрд╕реЗ рд╡реЗрдмрдкреИрдХ рдореЗрдВ, module.hot API рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред

  • рд░рд┐рдПрдХреНрдЯрд░ рд░реЗрдВрдбрд░ 16.9.0+ (рдЬреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо 16.9)

    • рдпрд╛ рдХрд╕реНрдЯрдо рд░реЗрдВрдбрд░рд░реНрд╕ рдХреЗ рд▓рд┐рдП [email protected] рдпрд╛ рдЕрдзрд┐рдХ

  • react-refresh/runtime рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
  • react-refresh/babel рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди

рдЖрдк рд╢рд╛рдпрдж рдПрдХреАрдХрд░рдг рднрд╛рдЧ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛рдиреА рд╡реЗрдмрдкреИрдХ "рд╣реЙрдЯ рдореЙрдбреНрдпреВрд▓ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ" рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде react-refresh/runtime рдПрдХреАрдХрд░рдгред

рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рд▓реБрдХрд┐рдВрдЧ рд▓рд╛рдЗрдХ рдХреНрдпрд╛ рд╣реИ?

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

рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдореЗрдВ HMR рд╕рдХреНрд╖рдо рдХрд░реЗрдВ (рдЬреИрд╕реЗ webpack)
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.9.0+ рд╣реИ
  • рдЕрдкрдиреЗ Babel рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ react-refresh/babel рдЬреЛрдбрд╝реЗрдВ

рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХрд╛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ $RefreshReg$ рдФрд░ $RefreshSig$ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред

рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ JS рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдРрдк рдореЗрдВ react-dom (!) рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП , рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ; рдпрджрд┐ рдпрд╣ react-dom рдмрд╛рдж рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

if (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {
  const runtime = require('react-refresh/runtime');
  runtime.injectIntoGlobalHook(window);
  window.$RefreshReg$ = () => {};
  window.$RefreshSig$ = () => type => type;
}

рдЗрд╕рд╕реЗ рдХреНрд░реИрд╢ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ $RefreshReg$ рдФрд░ $RefreshSig$ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╣реБрдХ рдХрд░рдирд╛ рдЙрд╕ рдПрдХреАрдХрд░рдг рдХрд╛рд░реНрдп рдХрд╛ рдорд╛рдВрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

// BEFORE EVERY MODULE EXECUTES

var prevRefreshReg = window.$RefreshReg$;
var prevRefreshSig = window.$RefreshSig$;
var RefreshRuntime = require('react-refresh/runtime');

window.$RefreshReg$ = (type, id) => {
  // Note module.id is webpack-specific, this may vary in other bundlers
  const fullId = module.id + ' ' + id;
  RefreshRuntime.register(type, fullId);
}
window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;

try {

  // !!!
  // ...ACTUAL MODULE SOURCE CODE...
  // !!!

} finally {
  window.$RefreshReg$ = prevRefreshReg;
  window.$RefreshSig$ = prevRefreshSig;
}

рдпрд╣рд╛рдБ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдмреИрдмрд▓ рдкреНрд▓рдЧрдЗрди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдКрдкрд░ рд╣рдорд╛рд░рд╛ рдПрдХреАрдХрд░рдг рдЙрди рдХреЙрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдЖрдИрдбреА рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬрдм рдПрдХ рдШрдЯрдХ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ рд░рдирдЯрд╛рдЗрдо "path/to/Button.js Button" рдЬреИрд╕реЗ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред (рдпрд╛, рд╡реЗрдмрдкреИрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдИрдбреА рдирдВрдмрд░ рд╣реЛрдВрдЧреЗред) рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рджреЛрдиреЛрдВ рдмреИрдмреЗрд▓ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд░реИрдкрд┐рдВрдЧ рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ / рдЕрдВрдд рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрд╕ рдЬрдЧрд╣ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЬрд╣рд╛рдВ рдмрдВрдбрд▓рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣рдо рдпрд╣рд╛рдВ рдореЗрдЯреНрд░реЛ (рдЖрд░рдПрди рдмрдВрдбрд▓) рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмреНрд▓реЛрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдпрд╛ рдЕрд╡реИрдз рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдХрд┐ import рдореЗрдВ try / finally import рд╕рд╛рде рд░реИрдк рдХрд░рдирд╛ред

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


// ...ALL MODULE CODE...

const myExports = module.exports; 
// Note: I think with ES6 exports you might also have to look at .__proto__, at least in webpack

if (isReactRefreshBoundary(myExports)) {
  module.hot.accept(); // Depends on your bundler
  enqueueUpdate();
}

isReactRefreshBoundary рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдЙрдерд▓реЗ рдирд┐рд░реНрдпрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИред рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдПрдХ рдЕрджреНрдпрддрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реЛ рд╕рдХрддреА рд╣реИред (рдЙрд╕ рдХреЛрдб рдореЗрдВ, Refresh react-refresh/runtime рдирд┐рд░реНрдпрд╛рдд рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

рдЖрдк рд╕рднреА рдирд┐рд░реНрдпрд╛рддреЛрдВ рдХреЛ $RefreshReg$ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

const runtime = require('react-refresh/runtime');

let enqueueUpdate = debounce(runtime.performReactRefresh, 30);

рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рдЖрдкрдХреЛ рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╛рд░реАрдХрд┐рдпреЛрдВ

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

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

рдЗрд╕реА рддрд░рд╣, рд╣рдореЗрдВ рдЗрд╕реЗ "рддреНрд░реБрдЯрд┐ рдмреЙрдХреНрд╕" рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, react-error-overlay Create

рдЕрдЧрд░ рдЖрдкрдХрд╛ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд╕реЗ рдкреВрдЫреЗрдВ!

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

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

рдореИрдВрдиреЗ DevTools рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рдХ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред

рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдП рдПрдЪрдПрдордЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдирд╡реАрдирддрдо рд╕реЛрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИред рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ @ Cear рд░реЗрдкреЛ рдкрд░ wip PR рд╣реИ:
https://github.com/facebook/create-react-app/pull/5958

рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдП рдПрдЪрдПрдордЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдирд╡реАрдирддрдо рд╕реЛрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИред рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ @ Cear рд░реЗрдкреЛ рдкрд░ wip PR рд╣реИ:

рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреАрдЖрд░ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред


рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрднреА рддрдХ рд╕рдордп рдирд╣реАрдВ рдерд╛

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреНрдпрд╛ рд╣реИ?

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

рдХреНрдпрд╛ рдореИрдВ рд╡реЗрдм рдкрд░ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

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

рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рд╣реИ?

рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЯреБрдХрдбрд╝реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

  • рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ "рд╣реЙрдЯ рдореЙрдбреНрдпреВрд▓ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ" рддрдВрддреНрд░ред

    • рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдмрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    • рдЬреИрд╕реЗ рд╡реЗрдмрдкреИрдХ рдореЗрдВ, module.hot API рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред

  • рд░рд┐рдПрдХреНрдЯрд░ рд░реЗрдВрдбрд░ 16.9.0+ (рдЬреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо 16.9)

    • рдпрд╛ рдХрд╕реНрдЯрдо рд░реЗрдВрдбрд░рд░реНрд╕ рдХреЗ рд▓рд┐рдП [email protected] рдпрд╛ рдЕрдзрд┐рдХ

  • react-refresh/runtime рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
  • react-refresh/babel рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди

рдЖрдк рд╢рд╛рдпрдж рдПрдХреАрдХрд░рдг рднрд╛рдЧ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛рдиреА рд╡реЗрдмрдкреИрдХ "рд╣реЙрдЯ рдореЙрдбреНрдпреВрд▓ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ" рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде react-refresh/runtime рдПрдХреАрдХрд░рдгред

рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рд▓реБрдХрд┐рдВрдЧ рд▓рд╛рдЗрдХ рдХреНрдпрд╛ рд╣реИ?

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

рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдореЗрдВ HMR рд╕рдХреНрд╖рдо рдХрд░реЗрдВ (рдЬреИрд╕реЗ webpack)
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.9.0+ рд╣реИ
  • рдЕрдкрдиреЗ Babel рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ react-refresh/babel рдЬреЛрдбрд╝реЗрдВ

рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХрд╛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ $RefreshReg$ рдФрд░ $RefreshSig$ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред

рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ JS рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдРрдк рдореЗрдВ react-dom (!) рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП , рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ; рдпрджрд┐ рдпрд╣ react-dom рдмрд╛рдж рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

if (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {
  const runtime = require('react-refresh/runtime');
  runtime.injectIntoGlobalHook(window);
  window.$RefreshReg$ = () => {};
  window.$RefreshSig$ = () => type => type;
}

рдЗрд╕рд╕реЗ рдХреНрд░реИрд╢ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ $RefreshReg$ рдФрд░ $RefreshSig$ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╣реБрдХ рдХрд░рдирд╛ рдЙрд╕ рдПрдХреАрдХрд░рдг рдХрд╛рд░реНрдп рдХрд╛ рдорд╛рдВрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

// BEFORE EVERY MODULE EXECUTES

var prevRefreshReg = window.$RefreshReg$;
var prevRefreshSig = window.$RefreshSig$;
var RefreshRuntime = require('react-refresh/runtime');

window.$RefreshReg$ = (type, id) => {
  // Note module.id is webpack-specific, this may vary in other bundlers
  const fullId = module.id + ' ' + id;
  RefreshRuntime.register(type, fullId);
}
window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;

try {

  // !!!
  // ...ACTUAL MODULE SOURCE CODE...
  // !!!

} finally {
  window.$RefreshReg$ = prevRefreshReg;
  window.$RefreshSig$ = prevRefreshSig;
}

рдпрд╣рд╛рдБ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдмреИрдмрд▓ рдкреНрд▓рдЧрдЗрди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдКрдкрд░ рд╣рдорд╛рд░рд╛ рдПрдХреАрдХрд░рдг рдЙрди рдХреЙрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдЖрдИрдбреА рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬрдм рдПрдХ рдШрдЯрдХ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ рд░рдирдЯрд╛рдЗрдо "path/to/Button.js Button" рдЬреИрд╕реЗ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред (рдпрд╛, рд╡реЗрдмрдкреИрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдИрдбреА рдирдВрдмрд░ рд╣реЛрдВрдЧреЗред) рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рджреЛрдиреЛрдВ рдмреИрдмреЗрд▓ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд░реИрдкрд┐рдВрдЧ рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ / рдЕрдВрдд рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрд╕ рдЬрдЧрд╣ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЬрд╣рд╛рдВ рдмрдВрдбрд▓рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣рдо рдпрд╣рд╛рдВ рдореЗрдЯреНрд░реЛ (рдЖрд░рдПрди рдмрдВрдбрд▓) рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмреНрд▓реЛрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдпрд╛ рдЕрд╡реИрдз рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдХрд┐ import рдореЗрдВ try / finally import рд╕рд╛рде рд░реИрдк рдХрд░рдирд╛ред

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


// ...ALL MODULE CODE...

const myExports = module.exports; 
// Note: I think with ES6 exports you might also have to look at .__proto__, at least in webpack

if (isReactRefreshBoundary(myExports)) {
  module.hot.accept(); // Depends on your bundler
  enqueueUpdate();
}

isReactRefreshBoundary рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдЙрдерд▓реЗ рдирд┐рд░реНрдпрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИред рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдПрдХ рдЕрджреНрдпрддрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реЛ рд╕рдХрддреА рд╣реИред (рдЙрд╕ рдХреЛрдб рдореЗрдВ, Refresh react-refresh/runtime рдирд┐рд░реНрдпрд╛рдд рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

рдЖрдк рд╕рднреА рдирд┐рд░реНрдпрд╛рддреЛрдВ рдХреЛ $RefreshReg$ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

const runtime = require('react-refresh/runtime');

let enqueueUpdate = debounce(runtime.performReactRefresh, 30);

рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рдЖрдкрдХреЛ рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╛рд░реАрдХрд┐рдпреЛрдВ

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

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

рдЗрд╕реА рддрд░рд╣, рд╣рдореЗрдВ рдЗрд╕реЗ "рддреНрд░реБрдЯрд┐ рдмреЙрдХреНрд╕" рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, react-error-overlay Create

рдЕрдЧрд░ рдЖрдкрдХрд╛ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд╕реЗ рдкреВрдЫреЗрдВ!

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрд░рд░ / рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдПрд░рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдмрддрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рдЖрд╕рд╛рди рдкрд░реНрдпрд╛рдкреНрдд" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреИрд╕реЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд░рд░ рдПрд░рд░ рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░реЗрдЧрд╛?

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

рд╕рднреА рдирд┐рд░реНрдпрд╛рдд рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрджреНрдпрддрди рдХреЛ "рд╕реНрд╡реАрдХрд╛рд░" рдХрд░рддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рдРрд╕реЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ - рдирд╣реАрдВред export.toString().indexOf('React')>0 рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА HOC рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛_ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдирд╣реАрдВ рд╣реИ - рдирдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рд╣реИрдВрдбрд▓ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЕрдЧрд▓рд╛ рдЕрдкрдбреЗрдЯ рдЙрдЪреНрдЪ рд╕реАрдорд╛ рдкрд░ рдмрдмрд▓ рдЬрд╛рдПрдЧрд╛, рдЗрд╕реАрд▓рд┐рдП require("react-hot-loader/root").hot рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ - рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХреЛ рдЕрдЫреВрддрд╛ рд░рдЦрддреЗ рд╣реБрдП react-hot-loader рд╕реЗ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ - рдЬреЛ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рд╕рднреА рдореМрдЬреВрджрд╛ рдкреНрд░рддрд┐рд╖реНрдард╛рдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред

react-refresh/babel 0.4.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрдЭреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ:

ERROR in ../orbit-app/src/hooks/useStores.ts
Module build failed (from ../node_modules/babel-loader/lib/index.js):
TypeError: Cannot read property '0' of undefined
    at Function.get (/Users/nw/projects/motion/orbit/node_modules/@babel/traverse/lib/path/index.js:115:33)
    at NodePath.unshiftContainer (/Users/nw/projects/motion/orbit/node_modules/@babel/traverse/lib/path/modification.js:191:31)
    at PluginPass.exit (/Users/nw/projects/motion/orbit/node_modules/react-refresh/cjs/react-refresh-babel.development.js:546:28)

рдореИрдВрдиреЗ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕ рд╕рд░рд▓рддрдо рдЪреАрдЬрд╝ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ:

import { useContext } from 'react'

export default () => useContext()

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

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

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

рдпрджрд┐ рд░реВрдЯ рдорд╛рдЙрдВрдЯ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ runtime.hasUnrecoverableErrors() рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗред рдлрд┐рд░ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рдереЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛ред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдлреНрд░реЗрд╢ / рдмреЗрдмрд▓ рдХрд╛ рдкреНрд░рдпреЛрдЧ 0.4.0 рдореБрдЭреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ:

рдирдпрд╛ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░реЗрдВ pls?

рдХреНрдпрд╛ рдРрд╕реЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛, рдЬреЛ рд╕реНрд╡рдпрдВ Runtime.isLikelyAReactComponent() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред

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

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

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

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рднреА рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореИрдВ рддреНрд░реБрдЯрд┐ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдЦреНрдд рдПрдХреАрдХрд░рдг рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА react-hot-loader рдХрд╣рд╛ рдЬрд╛ рд╕рдХреЗред

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

isLikelyComponentType(type) {
   return typeof type === 'function' && /^[A-Z]/.test(type.name);
},

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╕рднреА CapitalizedFunctions рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХ рд╣реИрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ - рдХрдИ рдореЙрдбреНрдпреВрд▓ (рдореЗрд░рд╛) рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреНрдп рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП _exports-for-test_ред рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ _unpredictability_ рдмрдирд╛рддрд╛ рд╣реИ - рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдЧрд░реНрдо рд╕реАрдорд╛ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ... рдпрд╛ рд▓рд╛рдЗрди рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИред
рдХреНрдпрд╛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ isLikelyComponentType рдкрд░реАрдХреНрд╖рдг:

  • рдирд┐рд░реНрдпрд╛рдд mapStateToProps (рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)
  • рдирд┐рд░реНрдпрд╛рдд hook (рдФрд░ рдпрд╣ рдареАрдХ рд╣реИ)
  • рдирд┐рд░реНрдпрд╛рдд Class рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)

рдЗрд╕рд▓рд┐рдП - рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реЛрдВрдЧреЗ рдЬрдм рдЧрд░реНрдо рд╕реАрдорд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рд╣реЛрдЧреА, рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЗ рднреА рд╣реЛрдВрдЧреЗ рдЬрдм рдЧрд░реНрдо рд╕реАрдорд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рд╣реЛрдЧреАред рдкреБрд░рд╛рдиреЗ рдЕрдЪреНрдЫреЗ рдЕрд╕реНрдерд┐рд░ рдЧрд░реНрдо рдкреБрдирдГ рд▓реЛрдбрд┐рдВрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд╣рдо рджреЛрдиреЛрдВ рдХреЛ рдХрд╛рдлреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ :)

рдПрдХ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЧрд░реНрдо рд╕реАрдорд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдХрд╛рдлреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдПрдЧреА - рдПрдХ thing рдпрд╛ domain рд╕реАрдорд╛, рдпрд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ, рдпрд╛рдиреА index.js reexporting рдПрдХ рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ Component.js рд╕реЗ рдПрдХ "рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ" (рдПрдХ рдлреЗрд╕рдмреБрдХ рд╢реИрд▓реА afaik рдирд╣реАрдВ)ред

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

рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдмреЛрд▓рд╛- рд╣реЙрдЯ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рд▓рд╛рдЬ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛? рдХреНрдпрд╛ import рдХреЗ рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рд╕реАрдорд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ?

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

Kapture 2019-09-07 at 23 09 04

рд░реЗрдкреЛ рдпрд╣рд╛рдБ: https://github.com/pekala/react-refresh-test

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

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

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

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

рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, compilation.mainTemplate.hooks.require рдЭрд░рдирд╛ рд╣реБрдХ рдореЗрдВ рд╣реБрдХ рдХрд░рдХреЗред рдЗрд╕рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдЖрд╣реНрд╡рд╛рди __webpack_require__ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдХрд╛рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕рд╛рдордЧреНрд░реА рдХреЛ try/finally рдмреНрд▓реЙрдХ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдореЗрдВ рдЯреИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╡реЗрдмрдкреИрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ MainTemplate.js рдФрд░ web/JsonpMainTemplatePlugin.js рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред JsonpMainTemplatePlugin рд╣реА MainTemplate.js рд╕реЗ рд╣реБрдХ рдХреЗ рдЭреБрдВрдб рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж "рдорд╛рдВрд╕" рд╣реИ рдХрд┐ рдЖрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рде рд╣реИрдХ рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рджрд╛рди рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИред рдпрд╣ рдХрд╛рдлреА рдЕрдзреВрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдПрдХ рд▓реЛ-рдлрд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ: https://gist.github.com/maisano/441a4bc6b2954205803d68deac04a716

рдХреБрдЫ рдиреЛрдЯ:

  • react-dom рдпрд╣рд╛рдВ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╕реНрдЯрдо рд░реЗрдВрдбрд░рд░реНрд╕ рдпрд╛ рд╕рдм-рдкреИрдХреЗрдЬ (рдЬреИрд╕реЗ react-dom/profiling ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
  • рдореИрдВрдиреЗ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рдХреЗ рд╕рднреА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд▓рд┐рдкрдЯрд╛ рд╣реИ рд╡рд╣ рдХрд╛рдлреА рд╣реИрдХ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░реЗрдЧрд╛, рддреЛ рдХрд╣реЗрдВрдЧреЗ, рдПрдХ umd рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рдХреНрд╖реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рд░рдирдЯрд╛рдЗрдо рдХрд╛ рд╕рдВрджрд░реНрдн рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

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

@maisano рдореБрдЭреЗ рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореИрдВ рд╡реЗрдмрдкреИрдХ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдП рдЧрдП рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рджреЛрдиреЛрдВ .accept(module.i, () => {}) рдФрд░ .accept(() => {}) (рд╕реНрд╡рдпрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред hot рд╕рдВрдкрддреНрддрд┐ рд╕рдХреНрд╖рдо рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреАрдЪреЗ рдЖрдпрд╛ рд╣реИ рдФрд░ рд╕реНрд╡реАрдХреГрдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред

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

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

diff --git a/node_modules/webpack/lib/HotModuleReplacement.runtime.js b/node_modules/webpack/lib/HotModuleReplacement.runtime.js
index 5756623..7e0c681 100644
--- a/node_modules/webpack/lib/HotModuleReplacement.runtime.js
+++ b/node_modules/webpack/lib/HotModuleReplacement.runtime.js
@@ -301,7 +301,10 @@ module.exports = function() {
                var moduleId = queueItem.id;
                var chain = queueItem.chain;
                module = installedModules[moduleId];
-               if (!module || module.hot._selfAccepted) continue;
+               if (!module || module.hot._selfAccepted) {
+                   module && module.hot._selfAccepted()
+                   continue;
+               }
                if (module.hot._selfDeclined) {
                    return {
                        type: "self-declined",

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

рдЗрд╕рд▓рд┐рдП ... рдореИрдВрдиреЗ @maisano рдХреЗ рдХрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд▓рдЧрдЗрди рдХреЛ рдФрд░ рдкреЙрд▓рд┐рд╢ рдХрд┐рдпрд╛:
https://github.com/pmmmwh/react-refresh-webpack-plugin
(рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЦреБрдж рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рд╕рд╛рде рдЬрдм рдореИрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЬреЗрдПрд╕ / рдлреНрд▓реЛ рдкрд░ рд╕рд╛рджреЗ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ)

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

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

рдореИрдВрдиреЗ рдЗрд╕ 5 рд╕рд╛рд▓ рдкреБрд░рд╛рдиреЗ рдзрд╛рдЧреЗ рдореЗрдВ @gaearon рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░реБрдЯрд┐ рд╕реБрдзрд╛рд░ (рдХрдо рд╕реЗ рдХрдо рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддреНрд░реБрдЯрд┐) рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ред рдЕрдЧрд▓рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЙрдмрд░ рд░рд╣рд╛ рд╣реИ - рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ (рдЬреИрд╕реЗ AppWrapper react-hot-loader ) рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддреНрд░реБрдЯрд┐-рдмреЙрдХреНрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рднреА рдирд┐рдкрдЯреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рдЙрд╕ рд╕рдордп рдХреЛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдХрд╛рдлреА рд╕рдордп рд╣реИред

@Natew рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рдореБрджреНрджреЗ рдХреЛ рднреА рдЯрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - enqueueUpdate рдХреЙрд▓ рдФрд░ hot.accpet(errorHandler) рдХреЙрд▓ рдХреЛ рдбрд┐рдХреЙрдкреНрд▓ рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@pmmmwh рдХреНрдпрд╛ рд╕рдордп рд╣реИ! рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рд░реЗрдкреЛ рдмрдирд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЬреАрд╕реНрдЯ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдереЛрдбрд╝реЗ рд╕реЗ рдХрд╛рдо рдкрд░ рдмрдирд╛рдпрд╛ рд╣реИред

рдореИрдВ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ рдкреНрд▓рдЧрдЗрди рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЧрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдареЛрд╕ рд╣реИред

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

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

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

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

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

@pmmmwh рдХреНрдпрд╛ рд╕рдордп рд╣реИ! рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рд░реЗрдкреЛ рдмрдирд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЬреАрд╕реНрдЯ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдереЛрдбрд╝реЗ рд╕реЗ рдХрд╛рдо рдкрд░ рдмрдирд╛рдпрд╛ рд╣реИред

рдореИрдВ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ рдкреНрд▓рдЧрдЗрди рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЧрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдареЛрд╕ рд╣реИред

@maisano рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ ... рдЖрдкрдХреЗ рдЬреАрд╕реНрдЯ рдиреЗ рдореБрдЭреЗ рдмрд╛рд╣рд░ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛: рдЯрд╛рдбрд╛:

рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдореЗрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдЪрдПрдордЖрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдХрд╣реАрдВ рдФрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрднреА-рдХрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ "рдХрд╛рдо" рдФрд░ "рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рдХрдИ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рдмрдВрдбрд▓рд░ рдПрдХреАрдХрд░рдг рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреЛ рд╡рд┐рд╖рдп рдпрд╛ рдпрд╣ рдзрд╛рдЧрд╛ рд╣реИ)ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкреЗрд╢ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ React Native 0.61 RC3 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@pmmmwh , @maisano рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрдХ рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдХреЛрдИ рддрд╛рдЬрд╝рд╛ рд╕реАрдорд╛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ:

https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/master/src/loader/utils/isReactRefreshBoundary.ts#L23 -L27

const desc = Object.getOwnPropertyDescriptor(moduleExports, key);
if (desc && desc.get) {
  // Don't invoke getters as they may have side effects.
  return false;
}

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

@gaearon React.lazy рдШрдЯрдХреЛрдВ (рдЬреИрд╕реЗ рдХреЛрдб-рд╡рд┐рднрд╛рдЬрд┐рдд рдорд╛рд░реНрдЧреЛрдВ) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ? рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рддрд╛рдЬрд╝рд╛ рд╕реАрдорд╛ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рд▓реЗрдХрд┐рди performReactRefresh() рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЖрд▓рд╕реА рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рддрд╛рдЬрд╝рд╛ рдкрд░рд┐рд╡рд░реНрддрди, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

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

рдореИрдВ рдЖрд▓рд╕реА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдХреБрдЫ рдЯреВрдЯ рдЧрдпрд╛ред рдореБрдЭреЗ рдПрдХ рдкреНрд░рдЬрдирди рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

рд╡рд╣рд╛рдБ рд╣реИ:
https://github.com/maisano/react-refresh-plugin
рддрдерд╛:
https://github.com/pmmmwh/react-refresh-webpack-plugin
рдореИрдВрдиреЗ pmmwh рдХреЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдПрдХ рдХрд╛рдВрдЯрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ [email protected] рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдирд┐рд░реНрдпрд╛рдд рдирд╛рдо рднреА рддрдп рдХрд░рддрд╛ рд╣реИ):
https://github.com/WebHotelier/webpack-fast-refresh

react-hot-loader рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

react-hot-loader fast refresh рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдФрд░ рдПрдХреАрдХреГрдд рдХреНрд╖рдг рд╣реИрдВ, рдЬреЛ рд╕рднреА рдХреЛ рдмреИрдХрдкреЛрд░реНрдЯ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдФрд░, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЙрдиреНрд╣реЗрдВ "rhal" рд╢рдмреНрджреЛрдВ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ ред рддреЛ - рдЗрд╕реЗ рд░рд┐рдЯрд╛рдпрд░ рд╣реЛрдиреЗ рджреЛред

рдПрдХ рдЕрдиреНрдп: https://github.com/yiminghe/react-refresh-loader

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ "рдХрд╛рдо" рдФрд░ "рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рдХрдИ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рдмрдВрдбрд▓рд░ рдПрдХреАрдХрд░рдг рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреЛ рд╡рд┐рд╖рдп рдпрд╛ рдпрд╣ рдзрд╛рдЧрд╛ рд╣реИ)ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкреЗрд╢ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ React Native 0.61 RC3 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреБрдЫ рдореЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд▓рд╛рд╣рд▓ рдкреНрд▓рдЧрдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдФрд░ рдпрд╣ рд╕рднреА рддрд░рд╣ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ react-refresh/runtime рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрдо рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЗрд░рд╛рджрд╛ рд╣реИ рдпрд╛ рдЕрдЧрд░ рдпрд╣ рд╡реЗрдмрдкреИрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдмрд╛рдж рдХрд╛ рд╣реИ рддреЛ рдореИрдВ рдХрд▓ рдПрдХ рдлрд┐рдХреНрд╕ рдЬрдореАрди рдкрд░ рдЙрддрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред (рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдореЗрдЯреНрд░реЛ рдкреНрд░реАрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рднреА рдХрд┐рдпрд╛ рдерд╛, рдпрд╣рд╛рдБ рдкрд░ рдкреБрди: рдкреЗрд╢

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

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

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

рд╣рд╛рдВ, рдмрд╛рдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рдХрдХреНрд╖рд╛рдПрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЖрд╢рдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдХ "рд╕рдВрднрд╛рд╡рдирд╛" рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред (рдЪреЗрдХрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред) рдпрджрд┐ рд╕рд╣реА рд╣реИ, рддреЛ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдмреИрдмреЗрд▓ рдкреНрд▓рдЧ рдЗрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ filename exports%export_name рдЬреИрд╕реА ID рджреЗрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдореЗрдЯреНрд░реЛ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреИрдмрд▓ рдкреНрд▓рдЧрдЗрди рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред

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

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

@gaearon рдПрдХ рдкреНрд░рддреАрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣рдо рдЙрди рдЪреАрдЬреЛрдВ рд╕реЗ

export default create({
  id: '100'
})

export const View = () => <div />

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

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

10 рд╕рд╛рд▓ рдЖрдЧреЗ рдЪрд▓рд┐рдПред рдЖрдкрдХрд╛ рдХреЛрдбрдмреЗрд╕ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ? рдпрд╣рд╛рдВ рдЕрдиреБрдорддрд┐ рджреЗрдВ, рд╡рд╣рд╛рдВ рд╕реЗ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░реЗрдВ? рдХреИрд╕реЗ рд░рдЦреЗрдВ рдЗрди рдЭрдВрдбреЛрдВ рдХреЛ рдЖрдЬ рддрдХ? рдХреИрд╕реЗ рдХрд░реЗрдВ рдХрд╛рд░рдг? рдЬреИрд╕реЗ рдХрд┐ рдЕрдкрдбреЗрдЯ_ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП _safe, рдФрд░ _unsafe_, рдЖрдкрдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдареАрдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреМрди рд╕реЗ рдХрд╛рд░рдг рд╡реИрдз рдХрд╛рд░рдг рд╣реИрдВ?

  • рдЬреЛ symbols рдЖрдкрдХреЗ рдкрд╛рд╕ рдФрд░ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ - рд▓рдЧрднрдЧ force allow рд░реАрд▓реЛрдб, рдпрд╛ force disallow рд░реАрд▓реЛрдб
  • рдЖрдк рдЕрджреНрдпрддрди рдкреНрд░рд╕рд╛рд░ рд╕реАрдорд╛ рдХреЛ рдХрдо рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд "рдЗрд╕" рдореЙрдбреНрдпреВрд▓ рд╕реАрдорд╛ рдкрд░ рдЕрджреНрдпрддрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ), рдпрд╛ рдЗрд╕реЗ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд "рдЙрд╕" рдореЙрдбреНрдпреВрд▓ рд╕реАрдорд╛ рдкрд░ рдЕрджреНрдпрддрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ)
  • рдпрджрд┐ рдХреЛрдИ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреА рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рдореИрдВ рдпрд╣рд╛рдБ рдПрдХ рд╣рд╛рде рдЙрдзрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред рдХреНрдпрд╛ рд╣рдо рдПрдХрд▓ рд░реЗрдкреЛ / рдкреНрд░рдпрд╛рд╕ рдкрд░ рд╕рд╣рдордд рд╣реБрдП рд╣реИрдВ?

рдХреНрдпрд╛ рдпрд╣ рд░реЗрдкреЛ @pmmmwh рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
https://github.com/pmmmwh/react-refresh-webpack-plugin

рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рд░реЗрдкреЛ @maisano рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
https://github.com/maisano/react-refresh-plugin

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @pmmmwh рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХреЛ рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рддрдХ рдореИрдВ рдирд╣реАрдВ рд╕реБрдирддрд╛ рдЕрдиреНрдпрдерд╛ рдореИрдВ рдорд╛рдирдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реИред

рдкрд╛рд░реНрд╕рд▓ 2 рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдБ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ: https://github.com/parcel-bundler/parcel/pull/3654

рдЧрд░реНрдореА!

рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕рдХреА рддрд▓рд╛рд╢ рдХреЗ рд▓рд┐рдП, рд░реЛрд▓рдЕрдк рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд░реЛрд▓рдЕрдк рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░реАрдПрдХреНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: https://github.com/PepsRyuu/rollup-plugin-react-refresh

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

рд╡реЗрдмрдкреИрдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдЪрдПрдордЖрд░ рд╕рдорд╛рдзрд╛рди рдбреИрди рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрднреА рднреА рд╣реИ: https://github.com/gaearon/react-hot-loader

рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдкрд╛рд░реНрд╕рд▓ 2 рдЕрд▓реНрдлрд╛ 3 рдХреЛ рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдХрд┐рдпрд╛ рд╣реИ! рдЗрд╕реЗ рдЯреНрд░рд╛рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред .Com / https://twitter.com/devongovett/status/119718738888985860096?s=20

ЁЯе│ рдЖрд░рдПрдЪрдПрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдбрд┐рдкреНрд░реЗрд╕реЗрд╢рди рдиреЛрдЯ

рдПрдХ рдиреБрд╕реНрдЦрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ CRA рдРрдк рдкрд░ рдкреНрд░рдЧрддрд┐ рдореЗрдВ @pmmmwh рдХреЗ рдХрд╛рдо рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, react-app-rewired , рдФрд░ customize-cra :

npx create-react-app <project_dir> --typescript

npm install -D react-app-rewired customize-cra react-refresh babel-loader https://github.com/pmmmwh/react-refresh-webpack-plugin

./package.json рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

  "scripts": {
    "start": "react-app-rewired start",
    "build": "react-app-rewired build",
    "test": "react-app-rewired test",
    "eject": "react-app-rewired eject"
  },

./config-overrides.js рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:

// eslint-disable-next-line
const { addBabelPlugin, addWebpackPlugin, override } = require('customize-cra');
// eslint-disable-next-line
const ReactRefreshPlugin = require('react-refresh-webpack-plugin');

/* config-overrides.js */
module.exports = override(
  process.env.NODE_ENV === 'development'
    ? addBabelPlugin('react-refresh/babel')
    : undefined,
  process.env.NODE_ENV === 'development'
    ? addWebpackPlugin(new ReactRefreshPlugin())
    : undefined,
);

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

рдзрдиреНрдпрд╡рд╛рдж @ drather19 !

рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рднрдВрдбрд╛рд░ рдмрдирд╛рдпрд╛, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:https://github.com/jihchi/react-app-rewired-react-refreshрдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рд░реЗрдкреЛ рдХрд╛ рдХреНрд▓реЛрди рддреИрдпрд╛рд░ рдХрд░реЗрдВред


рдХреГрдкрдпрд╛ https://github.com/pmmmwh/react-refresh-webpack-plugin/tree/master/examples/cra-kitchen-sink рджреЗрдЦреЗрдВ

рдФрд░ ... рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП v0.1.0 рд╕рд┐рд░реНрдл

@ drather19 @jihchi
рдЖрдк рд▓реЛрдЧ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рдПрдХреАрдХреГрдд рдЕрдиреБрднрд╡ рдФрд░ рд╕рд╛рде рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рд╕реБрдзрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

@pmmmwh ts-loader + babel-loader ?

@pmmmwh ts-loader + babel-loader ?

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

@ drather19 рдореИрдВрдиреЗ рдХреНрд▓реЛрдирд┐рдВрдЧ рдФрд░ рдЕрдкрдиреЗ рд░реЗрдкреЛ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рджреЗрд╡ рд╕рд░реНрд╡рд░ рдХрднреА рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖред

рд╡рд╛рддрд╛рд╡рд░рдг,
OS - OSX 10.14.6
рдиреЛрдб - v12.13.0
рд╕реВрдд -1.19.2

@pmmmwh - FYI рдХрд░реЗрдВ

react-app-rewired-react-refresh on юВа master is ЁЯУж v0.1.0 via тмв v12.13.0
тЭп yarn start
yarn run v1.19.2
$ react-app-rewired start | cat
тД╣ я╜вwdsя╜г: Project is running at http://192.168.1.178/
тД╣ я╜вwdsя╜г: webpack output is served from /
тД╣ я╜вwdsя╜г: Content not from webpack is served from /Users/seanmatheson/Development/temp/react-app-rewired-react-refresh/public
тД╣ я╜вwdsя╜г: 404s will fallback to /index.html
Starting the development server...


@ drather19 рдореИрдВрдиреЗ рдХреНрд▓реЛрдирд┐рдВрдЧ рдФрд░ рдЕрдкрдиреЗ рд░реЗрдкреЛ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рджреЗрд╡ рд╕рд░реНрд╡рд░ рдХрднреА рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖред

рд╡рд╛рддрд╛рд╡рд░рдг,
OS - OSX 10.14.6
рдиреЛрдб - v12.13.0
рд╕реВрдд -1.19.2

@pmmmwh - FYI рдХрд░реЗрдВ

react-app-rewired-react-refresh on юВа master is ЁЯУж v0.1.0 via тмв v12.13.0
тЭп yarn start
yarn run v1.19.2
$ react-app-rewired start | cat
тД╣ я╜вwdsя╜г: Project is running at http://192.168.1.178/
тД╣ я╜вwdsя╜г: webpack output is served from /
тД╣ я╜вwdsя╜г: Content not from webpack is served from /Users/seanmatheson/Development/temp/react-app-rewired-react-refresh/public
тД╣ я╜вwdsя╜г: 404s will fallback to /index.html
Starting the development server...

рдпрд╣ рдкреНрд▓рдЧрдЗрди рдХреЗ master рд╢рд╛рдЦрд╛ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрд▓ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ Babel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рдПрдХреНрдЯ рдРрдк рдХреЗ рд╕рд╛рде @pmmmwh рдХреЗ рд╡реЗрдмрдкреИрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдмрдирд╛рддрд╛ рд╣реИ ~ ts-loader рдХреЗ рд╕рд╛рде ~ 2 рд╕реЗрдХрдВрдб рдХреЗ рдмрдЬрд╛рдп рд▓рдЧрднрдЧ 12 рд╕реЗрдХрдВрдбред рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддрд╛ рд░рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдмреИрдмрд▓ рдХреЙрдиреНрдлрд┐рдЧ рд╕рд╛рдЗрдб рдкрд░ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд░реАрдм рд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рдЯреАрдПрд╕-рд▓реЛрдбрд░ рдФрд░ рдлреБрд▓ рд░рд┐рдлреНрд░реЗрд╢ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реЙрд╢ рд╣реИред

@IronSean рдХреГрдкрдпрд╛ рдЙрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реЗрдкреЛ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ? рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

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

рдорди рд╡рд╣рд╛рдБ рдЕрдкрдиреЗ рд╡рд┐рдиреНрдпрд╛рд╕ / рд╕реЗрдЯрдЕрдк рдкреЛрд╕реНрдЯрд┐рдВрдЧ? рдореИрдВ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдореБрджреНрджреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@pmmmwh рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдкрдиреЗ рд░реЗрдкреЛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓ рджрд┐рдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЕрдВрддрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ:
https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/20

рдХреНрдпрд╛ Preact рдХреЗ рд╕рд╛рде react-refresh ( React Fast Refresh ?) рдХрд╛рдо рд╣реЛрдЧрд╛, рдпрд╛ Preact рдХреЗ рд▓рд┐рдП react-hot-loader рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ?

@ рдЬрдВрдмреБрдбрдорд▓ рдЬреЛ

CRA рдХреЗ рд▓реЛрдЧ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рд╕рд╛рде рджреМрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд craco.config.js рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд░реИрдХреЛ (рдмрдирд╛рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк-рд░реАрд╡рд╛рдЗрд░реНрдб + рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝-рдХреНрд░реЗрдХ) рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рднрд╛рдЧреНрдп рд╣реИред

// eslint-disable-next-line
const { whenDev } = require('@craco/craco');
// eslint-disable-next-line
const ReactRefreshPlugin = require('react-refresh-webpack-plugin');

module.exports = {
  webpack: {
    configure: webpackConfig => {
      if (process.env.NODE_ENV === 'development') {
        webpackConfig.module.rules.push({
          test: /BabelDetectComponent\.js/,
          use: [
            {
              loader: require.resolve('babel-loader'),
              options: {
                plugins: [require.resolve('react-refresh/babel')],
              },
            },
          ],
        });
        webpackConfig.module.rules.push({
          test: /\.[jt]sx?$/,
          exclude: /node_modules/,
          use: [
            {
              loader: require.resolve('babel-loader'),
              options: {
                presets: [
                  '@babel/react',
                  '@babel/typescript',
                  ['@babel/env', { modules: false }],
                ],
                plugins: [
                  '@babel/plugin-proposal-class-properties',
                  '@babel/plugin-proposal-optional-chaining',
                  '@babel/plugin-proposal-nullish-coalescing-operator',
                  'react-refresh/babel',
                ],
              },
            },
          ],
        });
      }
      return webpackConfig;
    },
    plugins: [
      ...whenDev(
        () => [new ReactRefreshPlugin({ disableRefreshCheck: false })],
        [],
      ),
    ],
  },
};

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, webpackConfig.optimization.runtimeChunk = false; рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрдк рд╣реБрдХ рдЬреЛрдбрд╝реЗрдВрдЧреЗ / рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рднреА рд╢рд╛рд▓реАрдирддрд╛рдкреВрд░реНрд╡рдХ рддрд╛рдЬрд╝рд╛ рдХрд░ рдкрд╛рдПрдВрдЧреЗред

рдЕрдм рдФрд░ рднреА рдмреЗрд╣рддрд░ рдЕрдиреБрднрд╡ рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд░рд╣реЗ рд╣реИрдВред Https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/25 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд┐рдк рдХреЗ рд▓рд┐рдП @ mmhand123 рдХреЛ рдзрдиреНрдпрд╡рд╛рдж ! (<- рд╣рд▓!)

@ Drather19 рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝- рдПрд╕рд┐рдЯрдирд┐рдХ / рдХрд╕реНрдЯрдорд╛рдЗрдЬреНрдб-рдХреНрд░реЗрдк-рд░рд┐рдПрдХреНрд╢рди-рд░рд┐рдлреНрд░реЗрд╢ рджреЗрдЦреЗрдВ ред

@ Drather19 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЕрдм рдпрд╣ рдПрдХ рдпрд╛рд░реНрди рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдореЛрдиреЛрд░реЗрдкреЛ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрдк-рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рддреЗрдЬрд╝ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

"@craco/craco": "^5.6.3", "@pmmmwh/react-refresh-webpack-plugin": "^0.2.0", "webpack-hot-middleware": "^2.25.0"

рдлрд┐рд░ рдЗрд╕реЗ craco.config.js :

;(function ForbidCRAClearConsole() {
    try {
        require('react-dev-utils/clearConsole')
        require.cache[require.resolve('react-dev-utils/clearConsole')].exports = () => {}
    } catch (e) {}
})()

const { whenDev } = require('@craco/craco')
const ReactRefreshPlugin = require('@pmmmwh/react-refresh-webpack-plugin')

module.exports = {
    webpack: {
        configure: webpackConfig => {
            whenDev(() => {
                // Work around monorepo setup when using yarn workspace hoisted packages
                // without the need to list 'babel-loader' and 'babel-preset-react-app' as
                // dependencies to avoid duplication since 'react-scripts' already has them.
                const reactLoaderConfig = webpackConfig.module.rules
                    .find(x => Array.isArray(x.oneOf))
                    .oneOf.find(
                        x =>
                            x.options &&
                            x.options.presets &&
                            x.options.presets.some(p => p.includes('babel-preset-react-app')) &&
                            x.loader &&
                            typeof x.loader.includes === 'function' &&
                            x.loader.includes('babel-loader') &&
                            x.test &&
                            typeof x.test.test === 'function' &&
                            x.test.test('x.tsx') &&
                            x.test.test('x.jsx'),
                    )

                if (reactLoaderConfig) {
                    webpackConfig.module.rules.push({
                        test: /BabelDetectComponent\.js/,
                        use: [
                            {
                                loader: reactLoaderConfig.loader,
                                options: {
                                    plugins: [require.resolve('react-refresh/babel')],
                                },
                            },
                        ],
                    })

                    webpackConfig.module.rules.push({
                        test: /\.[jt]sx?$/,
                        exclude: /node_modules/,
                        use: [
                            {
                                loader: reactLoaderConfig.loader,
                                options: {
                                    presets: reactLoaderConfig.options.presets,
                                    plugins: [require.resolve('react-refresh/babel')],
                                },
                            },
                        ],
                    })
                } else {
                    console.error('cannot find react app loader')
                }

                // console.debug(require('util').inspect(webpackConfig.module.rules, { colors: true, depth: null }))
            })

            return webpackConfig
        },
        plugins: [whenDev(() => new ReactRefreshPlugin({ disableRefreshCheck: false }))].filter(Boolean),
    },
}

Do @gaearon рд╣рдо рддреЗрдЬреА рд╕реЗ рддрд╛рдЬрд╝рд╛ рд╕рдордп рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реАрдЖрд░рдП рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ?
рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдЙрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд░рд╛рд╢рд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :-) рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдпрджрд┐ HMR рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдШрдЯрдХрдбрд┐рдорд╛рдЙрдВрдЯред
рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдорд╛рдЙрдВрдЯ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 15.X рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

  • componentDidMount рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рд╛рде рд╣реА unmount - рд╡рд░реНрдЧ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреБрдирдГ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
  • рдФрд░ рдпрд╣ react-proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реИред рдареАрдХ рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╢рд╛рдпрдж рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • 15.X ? - рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВред рдлрд╛рд╕реНрдЯ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ __is рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ part__ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

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

рдореБрдЭреЗ JIT рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЙрдЯ-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? - рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╕рдВрдХрд▓рди

  • рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЙрдЯ-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

    fast refresh рдкрд╣рд▓реЗ рдЖрдЬрд╝рдорд╛рдПрдВ, рдлрд┐рд░ RHL

  • рдХреНрдпрд╛ рдПрдЪрдПрдордЖрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ (рдХрдВрдкреЛрдиреЗрдВрдЯрдорд╛рдЙрдВрдЯ) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? - рдпрд╣ рдирдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

    (рдЙрдкрдпреЛрдЧ рд╣реБрдХ ...), рдШрдЯрдХ рдЬреАрд╡рди рдЪрдХреНрд░ рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ, рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред react-query , swr рдпрд╛ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдЖрдЬрд╝рдорд╛рдПрдВред

рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдП рдПрдЪрдПрдордЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдирд╡реАрдирддрдо рд╕реЛрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИред рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ @ Cear рд░реЗрдкреЛ рдкрд░ wip PR рд╣реИ:

рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреАрдЖрд░ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрднреА рддрдХ рд╕рдордп рдирд╣реАрдВ рдерд╛

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

рдореИрдВ Error: [React Refresh] Hot Module Replacement (HMR) is not enabled! React Refresh requires HMR to function properly. рд╣реВрдВ, рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рдЧрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд░рд╣рддреА рд╣реИ: [рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ] рд╣реЙрдЯ рдореЙрдбреНрдпреВрд▓ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ (HMR) рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ! рд░рд┐рдПрдХреНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HMR рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рдЧрдпрд╛ рд╣реИ?

@silkfire рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк https://github.com/pmmmwh/react-refresh-webpack-plugin/ред

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

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

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ https://github.com/pmmmwh/react-refresh-webpack-plugin/ рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред
рдФрд░ https://github.com/facebook/react/issues/16604#issuecomment -528663101 рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╕реНрдЯрдо рдПрдХреАрдХрд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВред

рдореИрдВ Error: [React Refresh] Hot Module Replacement (HMR) is not enabled! React Refresh requires HMR to function properly. рд╣реВрдВ, рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рдЧрдпрд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡реЗрдмрдкреИрдХ HMR рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдЧреЗ рдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реЗрдкреЛ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХрд░реЗрдВред

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

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

@theKashey рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рддреЗрдЬрд╝ рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: pmmmwh / react-refresh-webpack-plugin # 7ред рд╢рд╛рдпрдж рдпрд╣ рдЕрдЧрд▓реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реЛрдЧрд╛ред

рддреЛ рд╢рд╛рдпрдж рд░рд┐рдПрдХреНрдЯ рдЯреАрдо рдХреЛ рдлрд┐рд▓рд╣рд╛рд▓ рдЗрд╕ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЪрд░рдг рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЗ рд▓рд┐рдП рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдХреА рддрд░рд╣ react-dom рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдерд┐рд░ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдПрдХреАрдХрд░рдг рд╕рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИрдВред

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

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

@gaearon
рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдЫ рд╕реНрдЯрд╛рдЗрд▓ рдШрдЯрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдореИрдВ Redux рдХреЗ рд░рд┐рдбреНрдпреВрд╕рд░ рдореЗрдВ рдХреБрдЫ рдХреЛрдб рдмрджрд▓рддрд╛ рд╣реВрдВ, рддреЛ рдкреВрд░рд╛ рдРрдк рд╣рд╛рд░реНрдб-рд░рд┐рдлреНрд░реЗрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА redux рд╕реНрдЯреЗрдЯреНрд╕ рдХреЛ рдЦреЛ рджреЗрддрд╛ рд╣реИред
рдореИрдВ рдЬреИрд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ redux-persist рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП react-fast-refresh ?

рд╣рдордиреЗ рдПрдХ рдкреВрд░рд╛ рдШреЗрд░рд╛ рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ and

рдПрдЪрдПрдордЖрд░ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рддреЗрдЬреА рд╕реЗ рд░рд┐рдлреНрд░реЗрд╢ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдХреГрдкрдпрд╛ рд░рд┐рдбрдХреНрд╕ рдпрд╛ рд╡реЗрдмрдкреИрдХ рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ

рд╣рдордиреЗ рдПрдХ рдкреВрд░рд╛ рдШреЗрд░рд╛ рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ and

рдПрдЪрдПрдордЖрд░ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рддреЗрдЬреА рд╕реЗ рд░рд┐рдлреНрд░реЗрд╢ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдХреГрдкрдпрд╛ рд░рд┐рдбрдХреНрд╕ рдпрд╛ рд╡реЗрдмрдкреИрдХ рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ

рдХреНрдпрд╛ рдЖрдк рдкреВрд░реНрдг рд╡реГрддреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВрдЧреЗ?

@ jwchang0206 рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рдЖрдкрдХреЗ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдкреВрд░реНрдг рд╡реГрддреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВрдЧреЗ?

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

@ jwchang0206 redux-reducers-рдЗрдВрдЬреЗрдХреНрдЯрд░ рдХреЛ рджреЗрдЦреЛ, рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ред
рдпрд╣ рдЖрдкрдХреЛ рдкреБрдирдГ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░реЗрдбреНрдпреВрд╕рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ reducers рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ redux рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрдЪрд╛рд░реВ red рдХрд╛рдо рдХрд░реЗрдЧрд╛
рдФрд░ рдЕрдЧрд░ рдЖрдк рд╕рд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд░реЗрдбрдХреНрд╕-рд╕рд╛рдЧрд╛рд╕-рдЗрдВрдЬреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@gaearon рдореИрдВ window рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реВрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХреА рдЬрд╛рддреА рд╣реИ? рдХрд┐рд╕ рдмрд╛рдд рдХрд╛?

var prevRefreshReg = window.$RefreshReg$; // these are dummies
var prevRefreshSig = window.$RefreshSig$; // these are dummies
var RefreshRuntime = require('react-refresh/runtime');

window.$RefreshReg$ = (type, id) =>{ /*...*/ }
window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;

try {
  // ...
} finally {
  window.$RefreshReg$ = prevRefreshReg; // these are dummies again
  window.$RefreshSig$ = prevRefreshSig; // these are dummies again
}

рдореЗрд░рд╛ рдЕрдкрдирд╛ рдХрд╕реНрдЯрдо рдмрдВрдбрд▓рд░ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ ... рд╢реБрд░реВ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ / рд░рд┐рд╕рд╛рд╡ рдЕрдиреБрдХреВрд▓рди рдкрд░ рд╕рдВрджреЗрд╣ рдерд╛ рд▓реЗрдХрд┐рди рдпреЗ рдХреЗрд╡рд▓ RefreshRuntime рд▓рд┐рдП рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдХреЙрд▓ рд╣реИрдВ ...

@leidegre рдореИрдВ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ $ RefreshSig $ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрдгрдп рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдпреБрдЧреНрдорди рдиреЗ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ NativeScript рдореЗрдВ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдПрдВ рджреАрдВред @pmmmwh рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреА рдХрдкрд▓рд┐рдВрдЧ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рд╡реЗрдмрдкреИрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрдпрд╛ (рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рдФрд░ рджреВрд░ рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ: https://github.com/pmmmwh/react-rebesh-webpack-plugin/ рдореБрджреНрджреЛрдВ / 79)ред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЗ рдХрд╕реНрдЯрдо рдмрдВрдбрд▓рд░ рдХреЗ рдлрд╛рд╕реНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рдПрдХреАрдХрд░рдг рдореЗрдВ рдЖрдкрдХреЗ рдХрд┐рд╕реА рдХрд╛рдо рдХрд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░рд╛ рдмрдВрдбрд▓ рдЬреНрдпрд╛рджрд╛рддрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреНрдпрд╛рджрд╛рддрд░ рдпрд╣ react-refresh/babel рдЖрдЧрдВрддреБрдХ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдд рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддреА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ react-refresh/bable рдЖрдЧрдВрддреБрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

import ts = require("typescript")

import { IndexModule } from "./registry"

/** Enables the use of `react-refresh` for hot reloading of React components. */
export function hotTransform(m: IndexModule, hot: boolean) {
  // see https://github.com/facebook/react/issues/16604#issuecomment-528663101
  return (ctx: ts.TransformationContext) => {
    return (sourceFile: ts.SourceFile) => {
      const refreshRuntime = ts.createUniqueName("ReactRefreshRuntime")

      const createSignatureFunctionForTransform = ts.createPropertyAccess(
        refreshRuntime,
        "createSignatureFunctionForTransform"
      )

      const register = ts.createPropertyAccess(refreshRuntime, "register")

      let hasComponents = false

      function visitor(node: ts.Node): ts.VisitResult<ts.Node> {
        if (ts.isFunctionDeclaration(node)) {
          if (_hasModifier(node, ts.SyntaxKind.ExportKeyword)) {
            // assert component naming convention

            if (node.name === undefined) {
              console.warn("unsupported export of unnamed function in ...")
              return node
            }

            const name = node.name
            if (!_isComponentName(name.text)) {
              console.warn(
                `warning: unsupported export '${name.text}' in ${m.path} (${m.id}) does not look like a function component, component names start with a capital letter A-Z. TSX/JSX files should only export React components.`
              )
              return node
            }

            if (!hot) {
              return node // opt-out
            }

            hasComponents = true

            let hookSignatureString = ""

            function hookSignatureStringVisitor(
              node: ts.Node
            ): ts.VisitResult<ts.Node> {
              const hookSig = _getHookSignature(node)
              if (hookSig !== undefined) {
                if (0 < hookSignatureString.length) {
                  hookSignatureString += "\n"
                }
                hookSignatureString += hookSig
              }
              return node
            }

            // update function body to include the call to create signature on render

            const signature = ts.createUniqueName("s")

            node = ts.visitEachChild(
              node,
              (node) => {
                if (ts.isBlock(node)) {
                  return ts.updateBlock(
                    ts.visitEachChild(node, hookSignatureStringVisitor, ctx),
                    [
                      ts.createExpressionStatement(
                        ts.createCall(signature, undefined, [])
                      ),
                      ...node.statements,
                    ]
                  )
                }
                return node
              },
              ctx
            )

            const signatureScope = ts.createVariableStatement(
              undefined,
              ts.createVariableDeclarationList(
                [
                  ts.createVariableDeclaration(
                    signature,
                    undefined,
                    ts.createCall(
                      createSignatureFunctionForTransform,
                      undefined,
                      undefined
                    )
                  ),
                ],
                ts.NodeFlags.Const
              )
            )

            const createSignature = ts.createExpressionStatement(
              ts.createCall(signature, undefined, [
                name,
                ts.createStringLiteral(hookSignatureString),
              ])
            )

            const registerComponent = ts.createExpressionStatement(
              ts.createCall(register, undefined, [
                name,
                ts.createStringLiteral(m.path + " " + name.text),
              ])
            )

            return [signatureScope, node, createSignature, registerComponent]
          }
        }

        if (!hot) {
          // if hot reloading isn't enable, remove hot reloading API calls
          if (ts.isExpressionStatement(node)) {
            const call = node.expression
            if (ts.isCallExpression(call)) {
              if (
                _isPropertyAccessPath(
                  call.expression,
                  "module",
                  "hot",
                  "reload"
                )
              ) {
                return undefined
              }
            }
          }
        }

        return node
      }

      sourceFile = ts.visitEachChild(sourceFile, visitor, ctx)

      if (hot && hasComponents) {
        let reactIndex = sourceFile.statements.findIndex((stmt) => {
          if (ts.isImportEqualsDeclaration(stmt)) {
            const ref = stmt.moduleReference
            if (ts.isExternalModuleReference(ref)) {
              const lit = ref.expression
              if (ts.isStringLiteral(lit)) {
                return lit.text === "react"
              }
            }
          }
          return false
        })

        if (reactIndex === -1) {
          console.warn(`cannot find import React = require('react') in ...`)
          reactIndex = 0
        }

        // insert after

        sourceFile = ts.updateSourceFileNode(sourceFile, [
          ...sourceFile.statements.slice(0, reactIndex + 1),
          ts.createImportEqualsDeclaration(
            undefined,
            undefined,
            refreshRuntime,
            ts.createExternalModuleReference(
              ts.createStringLiteral("react-refresh/runtime")
            )
          ),
          ...sourceFile.statements.slice(reactIndex + 1),
          ts.createExpressionStatement(
            ts.createCall(
              ts.createPropertyAccess(
                ts.createPropertyAccess(
                  ts.createIdentifier("module"),
                  ts.createIdentifier("hot")
                ),
                ts.createIdentifier("reload")
              ),
              undefined,
              undefined
            )
          ),
          ts.createExpressionStatement(
            ts.createBinary(
              ts.createPropertyAccess(
                ts.createIdentifier("globalThis"),
                ts.createIdentifier("__hot_enqueueUpdate")
              ),
              ts.createToken(ts.SyntaxKind.AmpersandAmpersandToken),
              ts.createCall(
                ts.createPropertyAccess(
                  ts.createIdentifier("globalThis"),
                  ts.createIdentifier("__hot_enqueueUpdate")
                ),
                undefined,
                undefined
              )
            )
          ),
        ])
      }

      return sourceFile
    }
  }
}

function _hasModifier(node: ts.Node, kind: ts.SyntaxKind): boolean {
  const modifiers = node.modifiers
  if (modifiers !== undefined) {
    for (let i = 0; i < modifiers.length; i++) {
      if (modifiers[i].kind === kind) {
        return true
      }
    }
  }
  return false
}

function _isComponentName(name: string): boolean {
  // ^[A-Z]
  const ch0 = name.charCodeAt(0)
  return 0x41 <= ch0 && ch0 <= 0x5a
}

function _isPropertyAccessPath(
  node: ts.Expression,
  ...path: ReadonlyArray<string>
): node is ts.PropertyAccessExpression {
  for (let i = 0; i < path.length; i++) {
    if (ts.isPropertyAccessExpression(node)) {
      if (!(node.name.text === path[path.length - (i + 1)])) {
        return false
      }
      node = node.expression
    }
  }
  return true
}

function _getHookSignature(node: ts.Node): string | undefined {
  if (ts.isExpressionStatement(node)) {
    const call = node.expression
    if (ts.isCallExpression(call)) {
      const prop = call.expression
      if (ts.isPropertyAccessExpression(prop)) {
        const text = prop.name.text
        if (text.startsWith("use") && 3 < text.length) {
          // todo: add additional checks and emit warnings if the hook usage looks non standard

          return text
        }
      }
    }
  }
  return undefined
}

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

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ:

import React = require("react")

export function App() {
  const [state, setState] = React.useState(0)

  return (
    <React.Fragment>
      <p>
        Click Count !!!<strong>{state}</strong>!!!
        <br />
        <button onClick={() => setState((acc) => acc + 1)}>Click me</button>
      </p>
    </React.Fragment>
  )
}

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const React = require("react");
const ReactRefreshRuntime_1 = require(6);
const s_1 = ReactRefreshRuntime_1.createSignatureFunctionForTransform();
function App() {
    s_1();
    const [state, setState] = React.useState(0);
    return (React.createElement(React.Fragment, null,
        React.createElement("p", null,
            "Click Count !!!",
            React.createElement("strong", null, state),
            "!!!",
            React.createElement("br", null),
            React.createElement("button", { onClick: () => setState((acc) => acc + 1) }, "Click me"))));
}
exports.App = App;
s_1(App, "useState");
ReactRefreshRuntime_1.register(App, "./App App");
module.hot.reload();
globalThis.__hot_enqueueUpdate && globalThis.__hot_enqueueUpdate();

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

рдореИрдВ window рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реВрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХреА рдЬрд╛рддреА рд╣реИ? рдХрд┐рд╕ рдмрд╛рдд рдХрд╛?

@leidegre

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

рдореБрдЭреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореВрд▓ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ - рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрд░реНрдХ рддреЗрдЬ рддрд╛рдЬрд╝рд╛ рддрд░реНрдХ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ react-refresh/babel рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╕реНрддреБрддрдГ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрдВрдбрд▓рд░)ред рд╕реНрд╡реИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдпрд╣ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рдРрд╕реЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ @babel/runtime рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдмрдВрдбрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдк рдХреЗрд╡рд▓ HMR рдХреЛ node_modules рдХреЛрдб рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЦрд╛рд▓реА рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдЖрд░рдВрднрд┐рдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рднреА рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рднреВрдорд┐ рдореЙрдбреНрдпреВрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреИрдмрд▓-рдЗрдВрдЬреЗрдХреНрдЯреЗрдб рд╣реЗрд▓реНрдкрд░реНрд╕ cleanup рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрдЪреНрдЪреЗ рд╣реИрдВ) рдЖрдпрд╛рдд)ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jvorcak picture jvorcak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

krave1986 picture krave1986  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hnordt picture hnordt  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmullo picture jmullo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Prinzhorn picture Prinzhorn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ