ЁЯз░ рдзрдбрд╛ 07 тАФ Frameworks: рддреНрдпрд╛рдЪ рдХрд▓реНрдкрдирд╛, automate рдХреЗрд▓реЗрд▓реНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 тАФ рднрд╛рдЧ 2 рд╕реБрд░реВ! ┬╖ рдорд╛рдЧреАрд▓: lesson-06-accessibility ┬╖ рдкреБрдвреАрд▓: lesson-08-design-tokens
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ06, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд React, Vue рдЖрдгрд┐ Svelte рдЪреА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕рдлрд░: рддреЗ рдХрд╛рдп automate рдХрд░рддрд╛рдд (рдзрдбрд╛ 05 рдордзрд▓реЗ рд╕рдЧрд│реЗ), рддреНрдпрд╛рдВрдЪреА рдХрд┐рдВрдордд рдХрд╛рдп, рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдЪ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рддреАрди рд╕рд╛рдзреНрдпрд╛ files рдХрдзреА рдпреЛрдЧреНрдп рдЙрддреНрддрд░ рдЕрд╕рддрд╛рдд.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рддреБрдореНрд╣реА рдлрд▓рдХ рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрд▓рд╛. рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА state рдмрджрд▓рд▓реА рдХреА рддреБрдореНрд╣реА render()
рдмреЛрд▓рд╡рд▓реЗрдд, рдЬреНрдпрд╛рдиреЗ рдпрд╛рджреА рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзрд▓реА. рдкрд╛рдЪ cards рд╕рд╛рдареА рд╣реЗ рд╕реБрдВрджрд░ рдЪрд╛рд▓рддреЗ. рдкрд╛рдЪрд╢реЗ
cards, рд╡реАрд╕ components рдЖрдгрд┐ рддреЗ рдмрджрд▓рдгрд╛рд░реЗ рд╕рд╣рд╛ рд▓реЛрдХ рдЕрд╕рд▓реЗ рдХреА рджреЛрди рдЕрдбрдЪрдгреА рдпреЗрддрд╛рдд:
рд╕рдЧрд│реЗ рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзрдгреЗ рд╡рд╛рдпрд╛ рдЬрд╛рдгрд╛рд░реЗ рдХрд╛рдо рдЖрд╣реЗ, рдЖрдгрд┐ "render() рдмреЛрд▓рд╡рд╛рдпрд▓рд╛ рд╡рд┐рд╕рд░реВ
рдирдХрд╛" рд╣рд╛ рдирд┐рдпрдо рдорд╛рдгрд╕реЗ рд╡рд┐рд╕рд░рддрд╛рдд.
framework ЁЯз░ рдиреЗрдордХреЗ рддреЗрдЪ рдХрд╛рдо рд╣рд╛рддреА рдШреЗрддреЛ: рджрд┐рд▓реЗрд▓реНрдпрд╛ state рд╕рд╛рдареА UI рдХрд╕рд╛ рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛ рддреЗ рддреБрдореНрд╣реА рдЬрд╛рд╣реАрд░ рдХрд░рддрд╛, рдЖрдгрд┐ рддреЛ DOM рдордзрд▓реЗ рд╕рдЧрд│реНрдпрд╛рдд рдХрдореА рдмрджрд▓ рд╢реЛрдзреВрди рдХрд╛рдврддреЛ тАФ рдЖрдкреЛрдЖрдк, рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА state рдмрджрд▓рд▓реА рдХреА. рдПрд╡рдвреЗрдЪ. рдзрдбрд╛ 05 рдордзреНрдпреЗ рд╢рд┐рдХрд▓реЗрд▓реЗ рдордирд╛рддрд▓реЗ рдЪрд┐рддреНрд░ рдмрджрд▓рдд рдирд╛рд╣реА; рддреНрдпрд╛рд▓рд╛ рдлрдХреНрдд рдПрдХ рдЗрдВрдЬрд┐рди рдорд┐рд│рддреЗ.
- React тЪЫя╕П тАФ components рдореНрд╣рдгрдЬреЗ JSX рдкрд░рдд рдХрд░рдгрд╛рд░реА functions;
useStatestate рдзрд░рддреЗ; рддреА рдмрджрд▓рд▓реА рдХреА function рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рддреЗ рдЖрдгрд┐ React рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ diff рдХрд░рддреЛ. рд╕рдЧрд│реНрдпрд╛рдд рдореЛрдареА ecosystem, рд╕рдЧрд│реНрдпрд╛рдд рдЬрд╛рд╕реНрдд рдиреЛрдХрд▒реНрдпрд╛, рд╕рдЧрд│реНрдпрд╛рдд рдЬрд╛рд╕реНрдд рд╕рдВрдХрд▓реНрдкрдирд╛ (hooks, effects, keys). - Vue ЁЯЯв тАФ single-file components (template + script + style); reactive refs; data рдмрджрд▓рд▓рд╛ рдХреА template рдмрджрд▓рддреЛ. рд╕реБрд░реБрд╡рд╛рдд рд╕реЛрдкреА.
- Svelte ЁЯзб тАФ рдПрдХ compiler: рддреБрдордЪрд╛ component compile рд╣реЛрдКрди рдирд╛рд╣реАрд╕рд╛ рд╣реЛрддреЛ рдЖрдгрд┐ рдереЗрдЯ DOM updates рдЙрд░рддрд╛рдд, рддреНрдпрд╛рдореБрд│реЗ runtime diffing рдирд╛рд╣реА. рдЫреЛрдЯреЗ bundles, рд╕рд╛рдзрд╛ рджрд┐рд╕рдгрд╛рд░рд╛ code.
- Vanilla ЁЯНж тАФ рдЬреЗ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ рддреЗ. рд╢реВрдиреНрдп bytes, рд╢реВрдиреНрдп build, upgrade рдХрд░рд╛рдпрд▓рд╛ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА.
рдЕрдВрдЧрдареНрдпрд╛рдЪрд╛ рдирд┐рдпрдо: рддреАрди components state рд╢реЗрдЕрд░ рдХрд░реЗрдкрд░реНрдпрдВрдд vanilla рд╡рд░рдЪ рд░рд╛рд╣рд╛. рдордЧ team рдЖрдгрд┐ ecosystem рдкрд╛рд╣реВрди рдирд┐рд╡рдбрд╛, benchmark рдкрд╛рд╣реВрди рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ideas["ЁЯза lesson 05: state тЖТ components тЖТ render()"]
r["тЪЫя╕П React тАФ JSX + hooks + virtual DOM diff"]
v["ЁЯЯв Vue тАФ templates + reactivity"]
s["ЁЯзб Svelte тАФ compiles to direct DOM updates"]
van["ЁЯНж vanilla тАФ you call render() yourself"]
ideas --> r & v & s & van
cost["all of them add: a build step, a bundle, an upgrade path, a hiring pool"]
тЭУ рдХрд╛рдп
- рдкреНрд░рддреНрдпреЗрдХ framework рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджреЗрддреЛ: state рдмрджрд▓рд▓реНрдпрд╛рд╡рд░ рдЖрдкреЛрдЖрдк re-render, components рдЪреА рдЬреЛрдбрдгреА, keyed list diffing, event binding, рдЖрдгрд┐ рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдПрдХ router рдЖрдгрд┐ build toolchain.
- JSX рд╣реА "рд╣рд╛ component рдХрд╛рдп рдкрд░рдд рдХрд░рддреЛ" рд╣реЗ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА syntax рдЖрд╣реЗ; рддреА HTML
рдирд╛рд╣реА тАФ
className,onClick, рдЖрдгрд┐{}рдордзрд▓реЗ expressions. - Keys: lists render рдХрд░рддрд╛рдирд╛, DOM nodes рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзрдгреНрдпрд╛рдРрд╡рдЬреА рд╣рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА
frameworks рдирд╛ рдкреНрд░рддреНрдпреЗрдХ item рд╕рд╛рдареА рд╕реНрдерд┐рд░
keyрд▓рд╛рдЧрддреЗ (рдЖрдкрд▓рд╛student.id). - рдХрд┐рдВрдордд: рдПрдХ build step (Vite, Next, Nuxt, SvelteKit), рдкреНрд░рддреНрдпреЗрдХ visitor рд▓рд╛ рдкрд╛рдард╡рд▓реЗ рдЬрд╛рдгрд╛рд░реЗ bundle рдЪреЗ рд╡рдЬрди, version upgrades, рдЖрдгрд┐ framework-рд╡рд┐рд╢рд┐рд╖реНрдЯ bugs.
- Server-side rendering / meta-frameworks (Next.js, Nuxt, SvelteKit) рдкрд╣рд┐рд▓рд╛ paint рдкреБрдиреНрд╣рд╛ server рд╡рд░ рдиреЗрддрд╛рдд тАФ trade-offs рдкрд╛рдирд╛рд╡рд░рдЪрд╛ SPA trade-off.
- рддреБрдореНрд╣реА рдорд┐рд╕рд│реВ рд╢рдХрддрд╛: рдмрд╣реБрддреЗрдХ static site рдЖрдгрд┐ рддреНрдпрд╛рдд рдПрдХ interactive рдмреЗрдЯ (рдПрдХ web component рдХрд┐рдВрд╡рд╛ рдЫреЛрдЯрд╛ mount point) рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдЪрд╛рдВрдЧрд▓реА architecture рдЖрд╣реЗ тАФ рдпрд╛ рд╢рд╛рд│реЗрдЪреА рд╕реНрд╡рддрдГрдЪреА рдкрд╛рдиреЗ рд╣реЗрдЪ рдХрд░рддрд╛рдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "рдХреЛрдгрддрд╛ framework" рд╣рд╛ front-end рдордзрд▓рд╛ рд╕рдЧрд│реНрдпрд╛рдд рдореЛрдареНрдпрд╛ рдЖрд╡рд╛рдЬрд╛рддрд▓рд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ рдЖрдгрд┐ рдЬрд╡рд│рдЬрд╡рд│ рдХрдзреАрдЪ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдирд╕рддреЛ. рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдкреНрд░рд╢реНрди рдЕрд╕рд╛: рддреБрдореНрд╣рд╛рд▓рд╛ state тЖТ view, keys, рдЖрдгрд┐ рддреБрдореНрд╣реА phone рд▓рд╛ рдХрд╛рдп рдкрд╛рдард╡рдд рдЖрд╣рд╛рдд рд╣реЗ рд╕рдордЬрддреЗ рдХрд╛. рдЖрддрд╛ рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдордЬрддреЗ тАФ рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рдЦрд▒реНрдпрд╛ рдХрд╛рд░рдгрд╛рдВрд╕рд╛рдареА framework рдирд┐рд╡рдбреВ рд╢рдХрддрд╛, рдХрд┐рдВрд╡рд╛ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рдиреЗ рдирд╛рдХрд╛рд░реВ рд╢рдХрддрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ тАФ рднрд╛рд╖рд╛рдВрддрд░рд╛рдЪрд╛ рд╕рд░рд╛рд╡)
рдЖрдкрд▓реЗ StudentCard рдЖрдгрд┐ render() framework code рд╡рд░ рдПрдХрд╛рд╕-рдПрдХ рдмрд╕рддрд╛рдд. React
рдордзреНрдпреЗ рддреЛрдЪ рдлрд▓рдХ рд╕рд╛рдзрд╛рд░рдг рдЕрд╕рд╛ рджрд┐рд╕рддреЛ:
function StudentCard({ s }) { // our StudentCard(s)
return <li className="card"><strong>{s.name}</strong> <span>class {s.class}</span></li>;
}
function Board() {
const [students, setStudents] = useState([]); // our state.students
const [filter, setFilter] = useState(""); // our state.filter
useEffect(() => { fetch("/api/students").then(r => r.json()).then(d => setStudents(d.items)); }, []);
const rows = students.filter(s => !filter || s.class === filter); // derived, not stored (lesson 05!)
return <ul className="cards">{rows.map(s => <StudentCard key={s.id} s={s} />)}</ul>;
}
рдХреБрдареЗрд╣реА render() call рдирд╛рд╣реА: setStudents рд╣рд╛рдЪ рддреЛ call рдЖрд╣реЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# 1) on paper (10 min): translate the enrol form into React тАФ which lines are state, which are the component,
# where does e.preventDefault() go, and what replaces our manual render()?
# 2) count the cost: our board ships ~9 KB of HTML+CSS+JS, uncompressed and unminified.
wc -c ui/index.html ui/styles.css ui/app.js
# a "hello world" React app ships ~140 KB of framework before your code. Both numbers are fine тАФ know which you are paying.
# 3) the honest test: does your next feature need shared state across three components? If not, stay vanilla.
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рддреБрдордЪреНрдпрд╛ React рдЖрд░рд╛рдЦрдбреНрдпрд╛рдд app.js рд╕рд╛рд░рдЦреЗрдЪ рдЪрд╛рд░ рднрд╛рдЧ рдЖрд╣реЗрдд (state, component,
derived list, fetch рдХрд░рдгрд╛рд░рд╛ effect) рдЖрдгрд┐ рд╣рд╛рддрд╛рдиреЗ repaint рдирд╛рд╣реА. Byte count
рджрд╛рдЦрд╡рддреЛ рдХреА рд╕рдВрдкреВрд░реНрдг рдлрд▓рдХ рдХрд╛рд╣реА kilobytes рдЪрд╛ рдЖрд╣реЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Frameworks рдзрдбрд╛ 05 рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрдд рдирд╛рд╣реАрдд, рддрд░ рддреЛ automate рдХрд░рддрд╛рдд тАФ рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рддреНрдпрд╛рдВрдкреИрдХреА рдХреЛрдгрддрд╛рд╣реА рд╡рд╛рдЪреВ рд╢рдХрддрд╛, рдЖрдгрд┐ рдПрдХрд╣реА рди рдирд┐рд╡рдбрдгреНрдпрд╛рдЪреЗ рд╕рдорд░реНрдерди рдХрд░реВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- team рдЖрдгрд┐ ecosystem рдРрд╡рдЬреА benchmark рдкрд╛рд╣реВрди framework рдирд┐рд╡рдбрдгреЗ
- state рд╢реЗрдЕрд░ рдХрд░рдгрд╛рд░рд╛ рддрд┐рд╕рд░рд╛ component рдпреЗрдгреНрдпрд╛рдЖрдзреАрдЪ framework рдШреЗрдгреЗ
- derived data state рдордзреНрдпреЗ рд╕рд╛рдард╡рдгреЗ (рддреЛрдЪ bug, рдЖрддрд╛ hooks рд╕рд╣)
- lists рдордзреНрдпреЗ
keyрдирд╕рдгреЗ рдХрд┐рдВрд╡рд╛ index рд╡рд░ рдЖрдзрд╛рд░рд┐рддkeyтАФ рд╕реВрдХреНрд╖реНрдо, рд╡рд┐рдЪрд┐рддреНрд░ рдХреНрд░рдо рдмрд┐рдШрдбрд╡рдгрд╛рд░реЗ bugs - рдкрд╛рдЪ рдкрд╛рдирд╛рдВрдЪреНрдпрд╛ static site рд╕рд╛рдареА meta-framework рдкрд╛рдард╡рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: framework рдЪреА рдирд┐рд╡рдб team рдордзрд▓реНрдпрд╛ рдмрд╣реБрддреЗрдХ рд▓реЛрдХрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЯрд┐рдХрддреЗ. рдЬреНрдпрд╛ teams рдирд╛ рдЦрд╛рд▓рдЪреНрдпрд╛ рдХрд▓реНрдкрдирд╛ рд╕рдордЬрддрд╛рдд рддреНрдпрд╛рдЪ рдЙрддреНрдкрд╛рджрдХ рд░рд╛рд╣рддрд╛рдд, рдХрд╛рд░рдг рддреНрдпрд╛ rewrite рди рдХрд░рддрд╛ upgrade, migrate рдХрд┐рдВрд╡рд╛ рдмрд╛рд╣реЗрд░ рдкрдбреВ рд╢рдХрддрд╛рдд.
тПня╕П рдкреБрдвреЗ
рддреБрдореНрд╣реА рдХрд╕реЗрд╣реА render рдХрд░рд╛, рдлрд▓рдХрд╛рд▓рд╛ рдПрдХрдЪ рд░реВрдк рд╣рд╡реЗ: design systems рдЖрдгрд┐ tokens тАФ рдПрдХрд╛ рдкрддреНрд░рдХрд╛рддреВрди рд░рдВрдЧ, рдЕрдВрддрд░, рдЕрдХреНрд╖рд░реЗ рдЖрдгрд┐ dark mode.
git checkout lesson-08-design-tokens