
рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╡реЗрдм рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреНрдпреЛрдВ рд╣реИрдВ? рдореИрдВ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЖрдИрдЯреА рдореЗрдВ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдпреВрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЬрдиреНрдо рдФрд░ рдЙрд╕реА рдЧрддрд┐ рд╕реЗ рд╣реБрдЖ рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗрдм рдореЗрдВ рд╣реБрдЖ рдерд╛ред рдбреЗрд╕реНрдХрдЯреЙрдк OS рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬреИрд╕реЗ: MFC, Qt, WPF, рдЖрджрд┐ред - рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд░рд╛рдХреНрд╖рд╕ рдереЗ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдереЗред рд╡реЗрдм рдкрд░ рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ - рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рдЧрднрдЧ рд╣рд░ рд╣рдлреНрддреЗ рдЬрд╛рд░реА рд╣реЛрддреЗ рд╣реИрдВ, рдиреЗрддрд╛ рдмрджрд▓рддреЗ рд╣реИрдВ - рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпреВрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрдореА рдЖрдИ рд╣реИред рд╣рд╛рдВ, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрдИ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХрд╛рдлреА рд╕рдордп рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП - рдЬреЛ, рдЬрдм рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдкреАрдЖрдИ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ - рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкрдврд╝реЗрдВред
рдпрд╣ рд▓реЗрдЦ рдХреНрдпреЛрдВ?
рд╣реИрдмреЗ рдкрд░ рдПрдХ рд╕рдордп рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдереА - рдЬреЛрд╕ рдкрд░ рдХреЛрдб рдХреА 30 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ - рдХреНрдпрд╛ 30 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╣рд╛рдВ, 30 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдЖрдВрдХрдбрд╝реЗ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╢реИрдХреНрд╖рд┐рдХ рд╣реИред рдпрд╣ рдЖрднрд╛рд╕реА рдШрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдереЛрдбрд╝реА рдЧрд╣рд░реА рд╕рдордЭ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реЛрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдФрд░ рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдмрдирд╛рдирд╛ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред
рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдп рд░рдЦрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреЛрдгреАрдп рдФрд░ рдПрдореНрдмрд░ рдПрдХ рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╕рд┐рд░реНрдл рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрд╡реЗрджрди рдХреЗ рджреГрд╢реНрдп рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред
рд╣рдо рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреЗрдЬ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ / рдЕрдкрдбреЗрдЯ / рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдбреЛрдо рдПрдкреАрдЖрдИ рдкрд░ рд░реИрдкрд░реЛрдВ рдХреА рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд╡рд┐рдХрд▓реНрдк (рдПрдкреАрдЖрдИ) рд╣реИ рдЬреЛ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЛрдо рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрди рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдореЗрдВ
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╢рдмреНрджрд╛рдВрдХрди рдореЗрдВ - рд░рд┐рдПрдХреНрдЯ рдХрд╛рдлреА рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред
рдЦреИрд░, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд▓рд╛рдареА рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред рд░рд┐рдПрдХреНрдЯ рдПрдХ рдЖрднрд╛рд╕реА рдШрд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЛрдо рдХреЗ рдиреЛрдбреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдбреЛрдо рдЯреНрд░реА рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдЦреНрдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ DOM рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реЗрд░рдлреЗрд░ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DOM рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрдЪреБрдЕрд▓ DOM рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╡рд░реНрдЪреБрдЕрд▓ DOM рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдкреБрд░рд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DOM рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DOM рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрдо рд╕реЗ рдХрдо рд╣реЛред DOM - рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рдмрдирд╛рддрд╛ рд╣реИред
рдЪреВрдБрдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рд╣рд╛рдЙрд╕ рдЯреНрд░реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рд╡рд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ - рдЗрд╕рдХреЗ рдиреЛрдбреНрд╕ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ - рдЗрд╕рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ / рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд╢рдмреНрдж рдХреЗ рдЖрд╕рд╛рди рд╕реЗ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА JSX рдХреА рдПрдХ рдШреЛрд╖рд┐рдд рднрд╛рд╖рд╛ рд╕реЗ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ JSX рд╕реЗ
рдпрд╣ JSX рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ
const Component = () => ( <div className="main"> <input /> <button onClick={() => console.log('yo')}> Submit </button> </div> ) export default Component
Component
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдбреЛрдо рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
const vdom = { type: 'div', props: { className: 'main' }, children: [ { type: 'input' }, { type: 'button', props: { onClick: () => console.log('yo') }, children: ['Submit'] } ] }
рдмреЗрд╢рдХ, рд╣рдо рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╣рдо рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдкреНрд▓рдЧрдЗрди рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд░рд▓ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ jsx- рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ JSX рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:
jsx.fromString('<h1>Hello World</h1>', { factory: 'h' }); // => 'h("h1", null, ["Hello World"])'
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ h рдиреЛрдбреНрд╕ рдХреЗ vdom рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ, рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ DOM рдиреЛрдб рдмрдирд╛рдПрдЧрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, React.createElement рдлрд╝рдВрдХреНрд╢рди рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЖрджрд┐рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ
export function h(type, props, ...stack) { const children = (stack || []).reduce(addChild, []) props = props || {} return typeof type === "string" ? { type, props, children } : type(props, children) } function addChild(acc, node) { if (Array.isArray(node)) { acc = node.reduce(addChild, acc) } else if (null == node || true === node || false === node) { } else { acc.push(typeof node === "number" ? node + "" : node) } return acc }
рдмреЗрд╢рдХ, рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЕрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣рдо vdom рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ
'h("h1", null, ["Hello World"])' => { type: 'h1', props:null, children:['Hello World']}
рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреЛрдбреНрд╕
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рдЕрдм рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рдлрд╝рдВрдХреНрд╢рди vdom рдиреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдм
рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛, рд╣рдореЗрдВ рдПрдХ patch
рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореВрд▓ DOM рддрддреНрд╡ рдХреЛ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдкреБрд░рд╛рдирд╛ vdom, рдирдпрд╛ vdom, рдФрд░ рдирдП DOM рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DOM рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╢рд╛рдпрдж рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдХрд▓рд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдХреЛрдбреЙрдо рдкреИрдХреЗрдЬ рд╕реЗ рдХреЛрдб рд▓рд┐рдпрд╛
export function patch(parent, oldNode, newNode) { return patchElement(parent, parent.children[0], oldNode, newNode) } function patchElement(parent, element, oldNode, node, isSVG, nextSibling) { if (oldNode == null) { element = parent.insertBefore(createElement(node, isSVG), element) } else if (node.type != oldNode.type) { const oldElement = element element = parent.insertBefore(createElement(node, isSVG), oldElement) removeElement(parent, oldElement, oldNode) } else { updateElement(element, oldNode.props, node.props) isSVG = isSVG || node.type === "svg" let childNodes = [] ; (element.childNodes || []).forEach(element => childNodes.push(element)) let oldNodeIdex = 0 if (node.children && node.children.length > 0) { for (var i = 0; i < node.children.length; i++) { if (oldNode.children && oldNodeIdex <= oldNode.children.length && (node.children[i].type && node.children[i].type === oldNode.children[oldNodeIdex].type || (!node.children[i].type && node.children[i] === oldNode.children[oldNodeIdex])) ) { patchElement(element, childNodes[oldNodeIdex], oldNode.children[oldNodeIdex], node.children[i], isSVG) oldNodeIdex++ } else { let newChild = element.insertBefore( createElement(node.children[i], isSVG), childNodes[oldNodeIdex] ) patchElement(element, newChild, {}, node.children[i], isSVG) } } } for (var i = oldNodeIdex; i < childNodes.length; i++) { removeElement(element, childNodes[i], oldNode.children ? oldNode.children[i] || {} : {}) } } return element }
рдпрд╣ рднреЛрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдпрд╣ рдмрд╣реБрдд рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рддрддреНрд╡реЛрдВ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ (рдХреБрдВрдЬреА, рдЖрдИрдбреА) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ - рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЖрджрд┐рдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
createElement updateElement removeElement
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди createElement updateElement removeElement
рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓рд╛рдКрдВрдЧрд╛, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ, рдЬреЛ рдХреЛрдИ рднреА рдЗрдЪреНрдЫреБрдХ рд╣реИ рд╡рд╣ рдпрд╣рд╛рдВ рд╕реНрд░реЛрдд рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ ред
рдПрдХрдорд╛рддреНрд░ рдХреИрд╡рд┐рдЯ рд╣реИ - рдЬрдм input
рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП value
рдЧреБрдг рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рддреБрд▓рдирд╛ рдкреБрд░рд╛рдиреЗ vnode рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдШрд░ рдореЗрдВ value
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде - рдпрд╣ рд╕рдХреНрд░рд┐рдп рддрддреНрд╡ рдХреЛ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рд╣реИ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рдФрд░ рдЪрдпрдиред
рдареАрдХ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрди рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рд╣реИ рдФрд░ UI рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд┐рдЦрдирд╛ рд╣реИ
рд╣рдо 5 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рднреАрддрд░ рд░рд╣рддреЗ рд╣реИрдВ ред
- рдЬреИрд╕рд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 3 рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
export function app(selector, view, initProps) {
рдЪрдпрдирдХрд░реНрддрд╛ - рд░реВрдЯ рдбреЛрдо рдЪрдпрдирдХрд░реНрддрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 'рдирд┐рдХрд╛рдп')
рджреГрд╢реНрдп - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд░реВрдЯ vnode рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ
initProps - рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЧреБрдг - DOM рдореЗрдВ рд░реВрдЯ рдПрд▓рд┐рдореЗрдВрдЯ рд▓реЗрдВ
const rootElement = document.querySelector(selector || 'body')
- рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде vdom рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ
let node = view(initProps)
- рд╣рдо DOM рдореЗрдВ рдкреНрд░рд╛рдкреНрдд vdom рдХреЛ рдкреБрд░рд╛рдиреЗ vdom рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдЙрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо null рд▓реЗрддреЗ рд╣реИрдВ
patch(rootElement, null, node)
- рд╣рдо рдирдП рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ
return props => patch(rootElement, node, (node = view(props)))
рдлреНрд░реЗрдорд╡рд░реНрдХ рддреИрдпрд╛рд░ рд╣реИ!
рдЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ 'рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб' рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
import { h, app } from "../src/index" function view(state) { return ( <div> <h2>{`Hello ${state}`}</h2> <input value={state} oninput={e => render(e.target.value)} /> </div> ) } const render = app('body', view, 'world')
рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рд░рд┐рдПрдХреНрдЯ рдХреА рддрд░рд╣, рдШрдЯрдХ рд░рдЪрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рдШрдЯрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рддреА рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ рдПрдХ
рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХреЗред рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ToDo рдЙрджрд╛рд╣рд░рдг ред
рдмреЗрд╢рдХ, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ: рдЬреАрд╡рди рдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдПрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЬрдХрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рдо рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдорд╛рдг / рдЕрджреНрдпрддрди / рдиреЛрдбреНрд╕ рдХреЗ рд╡рд┐рд▓реЛрдкрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВ), рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдкрдбреЗрдЯ редрд╕реЗрдЯрд╕реНрдЯреИрдЯ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП DOM рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) vdom рдиреЛрдб - рдпрд╣ рддрд░реНрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛), рдкреИрдЪрдореЗрдВрдЯ рдХреЛрдб рдмрд╣реБрдд рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рд╣реИ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрддреНрд╡реЛрдВ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рддрддреНрд╡реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ :)
рдкреБрдирд╢реНрдЪ: рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╢рд╛рдирджрд╛рд░ рд╣рд╛рдЗрдкрд░рдкреНрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛, рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрдЪреНрдЫрд╛ рдХреЛрдбрд┐рдВрдЧ!