рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЬрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдЯрд╛ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╣рд░ рдкреГрд╖реНрда рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
Google рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдЬрд┐рд╕реЗ рдЖрдк рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ
, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ
рд░рд┐рдПрдХреНрдЯ рд╣реЗрд▓рдореЗрдЯ ред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдЗрд╕реЛрдореЙрд░реНрдлрд┐рдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рджреЛрдиреЛрдВ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
class Page extends Component { render() { return ( <div> <Helmet> <title>Turbo Todo</title> <meta name="theme-color" content="#008f68" /> </Helmet> {/* ... */} </div> ); } }
рд╕рд░реНрд╡рд░ рдкрд░, рд░рд╛рдЙрдЯрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
app.get('/*', (req, res) => { const html = renderToString(<App />); const helmet = Helmet.renderStatic(); res.send(` <!doctype html> <html ${helmet.htmlAttributes.toString()}> <head> ${helmet.title.toString()} ${helmet.meta.toString()} </head> <body ${helmet.bodyAttributes.toString()}> <div id="app">${html}</div> </body> </html> `); });
рдпреЗ рджреЛрдиреЛрдВ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдФрд░ рдХреБрд╢рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ BUT рд╣реИ, рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрдард┐рди рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдХреАрдбрд╝реЛрдВ рдХреЛ рдЫрд┐рдкрд╛ рджреЗрдЧрд╛:
app.get('/*', async (req, res) => {
рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рд╣реЗрд▓рдореЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реА рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рд╡рд╣ рд░рд┐рдПрдХреНрдЯ рдЯреНрд░реА рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдЯреИрдЧ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдХреЛрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдб рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдорд┐рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрд╛рдВрдЯрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрдм рдпрд╣
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЗрд▓рдореЗрдЯ-рдПрд╕рд┐рдВрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╡рд░реАрдпрддрд╛ рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп рдкреНрд░рддрд┐рдорд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЗрд▓рдореЗрдЯ рд╕рдВрджрд░реНрдн рдХреЛ рд╣реЗрд▓реНрдореЗрдЯрдкреНрд░реЛрд╡рд┐рдбрд░ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдЯреНрд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдирдХреИрдк рдХрд░рдХреЗ рдПрдХрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
import { Helmet, HelmetProvider } from 'react-helmet-async'; app.get('/*', async (req, res) => {тАЛ
рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЖрдк рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирд┐рдЪреЛрдбрд╝рдиреЗ рдФрд░ рдХреБрдЫ рдПрд╕рдИрдУ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯрд╛рдЗрдо рдЯреВ рдлрд░реНрд╕реНрдЯ рдмрд╛рдЗрдЯ (TTFB) рдореЗрдЯреНрд░рд┐рдХ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрдм рд╕рд░реНрд╡рд░ рдкреЗрдЬ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЪрдВрдХреНрд╕ рдХреЗ рд╕рд╛рде рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдгрдирд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
renderToString рдХреЗ рдмрдЬрд╛рдп
рд░реЗрдВрдбрд░рдЯрд╛рдЙрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред
рдпрд╣рд╛рдБ рд╣рдо рдлрд┐рд░ рд╕реЗ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдкреЗрдЬ рдХреА рдЬрд░реВрд░рдд рдХреЗ рд╕рднреА рдореЗрдЯрд╛ рдЯреИрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рд┐рдПрдХреНрд╢рди рдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрдЯрд╛ рдЯреИрдЧреНрд╕ рдХреЛ рдЙрд╕ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╣рдо рд░реЗрдВрдбрд░рдЯрд╛рдЙрди рдиреЛрд╕реНрдЯреЛрдбреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдордЧреНрд░реА рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдлрд┐рд░ рджреЛ рдмрд╛рд░ рд░рд┐рдПрдХреНрдЯ рдЯреНрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
app.get('/*', async (req, res) => {тАЛ const helmetContext = {}; let app = ( <HelmetProvider context={helmetContext}> <App/> </HelmetProvider> ); // do a first pass render so that react-helmet-async // can see what meta tags to render ReactDOMServer.renderToString(app); const { helmet } = helmetContext; response.write(` <html> <head> ${helmet.title.toString()}тАЛ ${helmet.meta.toString()} </head> <body> `); const stream = ReactDOMServer.renderToNodeStream(app); stream.pipe(response, { end: false }); stream.on('end', () => response.end('</body></html>')); });
рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд╕рд╡рд╛рд▓ рдмрди рдЬрд╛рддреА рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЬрд┐рд╕ TTFB рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдпрд╣рд╛рдВ рд╣рдо рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рди рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ
- рд░реЗрдВрдбрд░рдЯреЙрд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдВрдбрд░ рдХреЗ рдмрдЬрд╛рдп рд░реЗрдВрдбрд░рдЯреЙрдЗрд╕реНрдЯрдореИрдЯрд┐рдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рд╕рдВрднрд╡рдд: рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдЬреАрддрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛
- рдмреЙрдХреНрд╕ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рд░реЗрдВрдбрд░рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд╢ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЯреНрд░реА-рд╡реЙрдХрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╛ рдкреЗрдбрд╝ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдкреЗрдбрд╝ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рдПрдореНрдмреЗрдбреЗрдб рдШрдЯрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдерд▓рд╛ рдкреНрд░рддрд┐рдкрд╛рджрди
- рдПрдХ рдХреИрд╢рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдХрднреА-рдХрднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓рд╛ рдЪрд▓рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ
рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдкрд░рд┐рд╖реНрдХреГрдд рд▓рдЧрддрд╛ рд╣реИ рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреМрдбрд╝ рдкрд░ рд╕рдВрджреЗрд╣ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдПрдХ-рджреЛ рдорд┐рд▓реА рд╕реЗрдХрдВрдб рдореЗрдВ рдмрдирддреА рд╣реИред
рдпрд╣ рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ (рдФрд░ рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ
рд▓реЗрдЦ рд╣реИ ), рд╣рдо рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛ рдЯреИрдЧ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдЙрд╕реА рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд╛рдЙрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ - рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдПрд╕ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ
рдШрдЯрдХ ,
рдкрде рдХреЗ рдХрдИ рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдиреБрд░реЛрдз url рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд░рд╛рдЙрдЯрд░ рдФрд░ рдШрдЯрдХ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ
рд▓реЛрдбрдбрд╛рдЯрд╛ рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдореЗрдЯрд╛ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП
createMetatags ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреЗрдЬ рдХрдВрдкреЛрдиреЗрдВрдЯ рдЦреБрдж рдЗрд╕ рддрд░рд╣ рдмрди рдЬрд╛рдПрдЧрд╛:
class ProductPage extends React.Component { static createMetatags(store, request){ const item = selectItem(store, request.params.product_id); return [] .concat({property: 'og:description', content: item.desc}) .concat({property: 'og:title', content: item.title}) } static loadData(store, request){
рд╣рдордиреЗ рдПрдХ рд╕реНрдереИрддрд┐рдХ createMetatags рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ рдЬреЛ рдореЗрдЯрд╛ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рдмрди рдЬрд╛рдПрдЧрд╛:
app.get('/*', async (req, res) => {тАЛтАЛ const store = createStore(); const matchedRoutes = matchRoutes(routes, request.path);
рдпрд╛рдиреА рдЕрдм рд╣рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдЯреНрд░реА рдХреЛ рджреЛ рдмрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдо рдПрдХ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдПрдХ рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рддреБрд░рдВрдд рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред