рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рдереЛрдбрд╝рд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред
рдореИрдВрдиреЗ Vue.js. рдкрд░ рдЕрдкрдиреА рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдореБрдЭреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ (рдПрд╕рдПрд╕рдЖрд░), рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓, рдХреЛрдб-рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЕрдиреНрдп рдЙрдкрд╣рд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдмреЗрд╢рдХ, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд░реНрдо рд░рд┐рдмреВрдЯ (HMR) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдореИрдВ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреИрд╕реЗ рдХрд┐ Nuxt.js, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдврд╝рддреА рд╣реИ, рддреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдХрд┐рд╕реА рднреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдорд╛рдзрд╛рди, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗрдВ, рдпрд╛ рди рджреЗрдВ, рд▓реЗрдХрд┐рди рдорд╣рд╛рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд╕рд╛рде (рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП Next.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рдЕрдиреБрднрд╡ рдерд╛)ред
рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдПрдХ рдЧрд░реНрдо рд░рд┐рдмреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдПрдХ
рд╡реЗрдмрдкреИрдХ-рджреЗрд╡-рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ред рд╣рдореЗрдВ рдЙрди рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ Node.js рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рд╣рдо рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЛрдб рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдореЗрдВ рдбреВрдмрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛рдпрд╛ред

рдореИрдВрдиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЖрдк рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╡рд┐рдХрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ:
- VueJS
- рдПрд╕рдПрд╕рдЖрд░
- Vuex
- рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓
- рдХреЛрдб рд╡рд┐рднрд╛рдЬрди
- ESLint, Prettier
рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдм рдордХреНрдЦреА рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрддреНрдкрд╛рджрди рдореЛрдб рдореЗрдВ, рдмрдВрдбрд▓реЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреИрд╢рд┐рдВрдЧ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрдВрдбрд▓реЛрдВ рдХреЗ рдкрде рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ html рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рд╕рдм
GitHub рдкрд░ рднрдВрдбрд╛рд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ , рдореИрдВ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ Vue.js рдХреЗ рдкрд╛рд╕ рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╣рд╛рдВ
рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛ Node.js рдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рдореЗрдВ
vue-server-renderer рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдкреИрдХреЗрдЬ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдмрдВрдбрд▓, рдПрдЪрдЯреАрдПрдордПрд▓-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХреЛ рдПрдХ HTML-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдкрде рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Server.js рдлрд╝рд╛рдЗрд▓ рдЕрдВрддрддрдГ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
const path = require('path'); const express = require('express'); const { createBundleRenderer } = require('vue-server-renderer'); const template = require('fs').readFileSync( path.join(__dirname, './templates/index.html'), 'utf-8', ); const serverBundle = require('../dist/vue-ssr-server-bundle.json'); const clientManifest = require('../dist/vue-ssr-client-manifest.json'); const server = express(); const renderer = createBundleRenderer(serverBundle, {
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо 2 рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
vue-ssr-server-bundle.json рдФрд░
vue- ssr-client-default.json ред
рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ; рдкрд╣рд▓реЗ рдореЗрдВ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░реЗ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдкрде рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
createBundleRenderer рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ
, рд╣рдордиреЗ
рдЗрдВрдЬреЗрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛
: рдЧрд▓рдд рдкреИрд░рд╛рдореАрдЯрд░ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП html рдХреЛрдб рдХреА рдХреЛрдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдкреВрд░реНрдг рд▓рдЪреАрд▓реЗрдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рд╣рдо рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> {{{ meta.inject().title.text() }}} {{{ meta.inject().meta.text() }}} {{{ renderResourceHints() }}} {{{ renderStyles() }}} </head> <body> <div id="app"></div> {{{ renderState() }}} {{{ renderScripts() }}} </body> </html>
рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
- meta.inject ()ред title.text () рдФрд░ meta.inject ()ред meta.text () рд╣реЗрдбрд░ рдФрд░ рдореЗрдЯрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡реАрдпреВ-рдореЗрдЯрд╛ рдкреИрдХреЗрдЬ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛
- рд░реЗрдВрдбрд░ .ResourceHints () - рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП rel = " preload / prefetch" рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдЧрд╛
- рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг () - рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдЧрд╛
- рд░реЗрдВрдбрд░рд╕реНрдЯреИрдЯ () - рд╡рд┐рдВрдбреЛ рдореЗрдВ рдбрд┐рдлреЙрд▓реНрдЯ рд╕реНрдЯреЗрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛ред INITIAL_STATE__
- renderScripts () - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛
рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╣рдорд╛рд░реЗ Vue рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐-server.js рдлрд╝рд╛рдЗрд▓ рд╣реИ ред
import { createApp } from './app'; export default context => new Promise((resolve, reject) => {
рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ
рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐-client.js рдлрд╝рд╛рдЗрд▓ рд╣реИ ред
import { createApp } from './app'; const { app, router, store } = createApp(); router.onReady(() => { if (window.__INITIAL_STATE__) {
App.js рдореЗрдВ , рд╣рдорд╛рд░реЗ Vue рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
import Vue from 'vue'; import { sync } from 'vuex-router-sync'; import { createRouter } from './router'; import { createStore } from './client/store'; import App from './App.vue'; export function createApp() { const router = createRouter(); const store = createStore(); sync(store, router); const app = new Vue({ router, store, render: h => h(App), }); return { app, router, store }; }
рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрдИ рдЕрдиреБрд░реЛрдз рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредApp.vue рд░реВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ
<рд░рд╛рдКрдЯрд░-рд╡реНрдпреВ> </ рд░рд╛рдЙрдЯрд░-рд╡реНрдпреВ> рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд░реВрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд░реВрд░реА рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рдСрдкреНрд╢рди рдХрд░реЗрдЧрд╛ред
рд░рд╛рдЙрдЯрд░ рд╣реА рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
import Vue from 'vue'; import Router from 'vue-router'; import VueMeta from 'vue-meta'; import routes from './routes'; Vue.use(Router); Vue.use(VueMeta); export function createRouter() { return new Router({ mode: 'history', routes: [ { path: routes.pages.main, component: () => import('./client/components/Main.vue') }, { path: routes.pages.about, component: () => import('./client/components/About.vue') }, ], }); }
Vue.use рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рджреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
рд░рд╛рдЙрдЯрд░ рдФрд░
VueMeta ред
рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ, рдШрдЯрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
() => import('./client/components/About.vue')
рдпрд╣ рдХреЛрдб рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд╣реИред
рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди (рд╡реАрдпреВрдПрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ) рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ, рдореИрдВрдиреЗ рдкрдХреНрд╖ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдм рд╕реНрд╡рдпрдВ Vue рдШрдЯрдХреЛрдВ рдореЗрдВ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
MetaInfo рдЧреБрдг
vue-meta рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдЯрд╛ рдбреЗрдЯрд╛ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ (
рдЕрдзрд┐рдХ ) рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
metaInfo: { title: 'Main page', }
рдШрдЯрдХреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЪрд▓рддреА рд╣реИред
serverPrefetch() { console.log('Run only on server'); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдиреА рд╣реИ, рддрд╛рдХрд┐ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдУрд╡рд░рд▓реИрдк рди рд╣реЛред CSS рдореЙрдбреНрдпреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдЧ
<рд╡рд░реНрдЧ рдирд╛рдо> _ <рд╣реИрд╢> рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдШрдЯрдХ рдореЗрдВ рдПрдХ
рд╢реИрд▓реА рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
<style module> .item { padding: 3px 0; } .controls { margin-top: 12px; } </style>
рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
: рд╡рд░реНрдЧ <div :class="$style.item"></div>
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗрдмрдкреИрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рднрд╛
рдЪрд▓рд┐рдП рдЦреБрдж рд╣реА рд╡реЗрдмрдкреИрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмреЗрд╕рд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
const webpack = require('webpack'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const merge = require('webpack-merge'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); const isProduction = process.env.NODE_ENV === 'production'; let config = { mode: isProduction ? 'production' : 'development', module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', }, { test: /\.js$/, loader: 'babel-loader', exclude: file => /node_modules/.test(file) && !/\.vue\.js/.test(file), }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, use: { loader: 'url-loader', options: { limit: 10000, name: 'images/[name].[hash:8].[ext]', }, }, }, ], }, plugins: [ new VueLoaderPlugin(), new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), }), ], }; if (isProduction) { config = merge(config, { optimization: { minimizer: [new OptimizeCSSAssetsPlugin(), new UglifyJsPlugin()], }, }); } module.exports = config;
рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреНрдпрд╛рд╕
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рд╕рд┐рд╡рд╛рдп рд╕реАрдПрд╕рдПрд╕ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗред
const merge = require('webpack-merge'); const nodeExternals = require('webpack-node-externals'); const VueSSRServerPlugin = require('vue-server-renderer/server-plugin'); const baseConfig = require('./webpack.base.js'); module.exports = merge(baseConfig, { entry: './app/entry-server.js', target: 'node', devtool: 'source-map', output: { libraryTarget: 'commonjs2', }, externals: nodeExternals({ whitelist: /\.css$/, }), plugins: [new VueSSRServerPlugin()], module: { rules: [ { test: /\.css$/, loader: 'css-loader', options: { modules: { localIdentName: '[local]_[hash:base64:8]', }, }, }, ], }, });
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рд╕реАрдПрд╕рдПрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЖрдзрд╛рд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рджреЛрдиреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЙрддреНрдкрд╛рджрди рд╢рд╛рд╕рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╢реЛрдзрди рдерд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдХрд┐ рд╕рд░реНрд╡рд░
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрди рдЧрдпрд╛, рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рдпрд╣
рдПрдХ рдорд┐рдиреА-рд╕реАрдПрд╕рдПрд╕-рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ-рдкреНрд▓рдЧрдЗрди рддреНрд░реБрдЯрд┐ рдереА рдЬреЛ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдПрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рддрдп рдХреА рдЧрдИ рдереАред
VueSSRServerPlugin ,
vue-ssr-server-bundle.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ , рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
const webpack = require('webpack'); const merge = require('webpack-merge'); const VueSSRClientPlugin = require('vue-server-renderer/client-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const path = require('path'); const baseConfig = require('./webpack.base.js'); const isProduction = process.env.NODE_ENV === 'production'; let config = merge(baseConfig, { entry: ['./app/entry-client.js'], plugins: [new VueSSRClientPlugin()], output: { path: path.resolve('./dist/'), filename: '[name].[hash:8].js', publicPath: '/dist/', }, module: { rules: [ { test: /\.css$/, use: [ isProduction ? MiniCssExtractPlugin.loader : 'vue-style-loader', { loader: 'css-loader', options: { modules: { localIdentName: '[local]_[hash:base64:8]', }, }, }, ], }, ], }, }); if (!isProduction) { config = merge(config, { output: { filename: '[name].js', publicPath: 'http://localhost:9999/dist/', }, plugins: [new webpack.HotModuleReplacementPlugin()], devtool: 'source-map', devServer: { writeToDisk: true, contentBase: path.resolve(__dirname, 'dist'), publicPath: 'http://localhost:9999/dist/', hot: true, inline: true, historyApiFallback: true, port: 9999, headers: { 'Access-Control-Allow-Origin': '*', }, }, }); } else { config = merge(config, { plugins: [ new MiniCssExtractPlugin({ filename: '[name].[hash:8].css', }), ], }); } module.exports = config;
рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ, рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдореЗрдВ, рд╣рдо
publicPath рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ
рдХрд░рддреЗ рд╣реИрдВ ,
рд╡реЗрдмрдкреИрдХ -рджреЗрд╡-рд╕рд░реНрд╡рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ
, рдФрд░ рдмрд┐рдирд╛ рд╣реИрд╢ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
devServer рдХреЗ рд▓рд┐рдП рд╣рдо
writeToDisk рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ
: рд╕рдЪреНрдЪрд╛ рдкреИрд░рд╛рдореАрдЯрд░ред
рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ,
рд╡реЗрдмрдкреИрдХ-рджреЗрд╡-рд╕рд░реНрд╡рд░ рд░реИрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ (
vue-ssr-client-default.json ), рдЬреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рд╕реНрдХреНрд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдбрд┐рд╕реНрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХрдбрд╝рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рд╕рдорд╛рдзрд╛рди рдпреБрд╡рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реИред рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреЛ
/ рдбрд┐рд╕реНрдЯрд░реНрдм рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рд░реНрд╡рд░ url рд╕реЗ рдХрдиреЗрдХреНрдЯ
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
server.js рдореЗрдВ рдореЛрдбред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб
рд░рд┐рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП Nodemon рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рджреЛ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдирдЬрд░ рд░рдЦрддрд╛ рд╣реИ:
dist / vue-ssr-server-bundle.json рдФрд░
app / server.js рдФрд░ рдЬрдм рд╡реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рддрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ
рдиреЛрдбрдореЙрди рдореЗрдВ рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ
nodemon.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо
server.js рдХрдиреЗрдХреНрдЯ
рдХрд░рддреЗ рд╣реИрдВ ред рдФрд░
nodemon.js рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдмрди рдЬрд╛рддреА рд╣реИред
рдЙрддреНрдкрд╛рджрди рдореЛрдб рдореЗрдВ,
app / server.js рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдХреБрд▓, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдХрдИ рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рднрдВрдбрд╛рд░ рд╣реИред
рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП: yarn run dev
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░: рдпрд╣
рд╡реЗрдмрдкреИрдХ-рдбреЗрд╡-рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ
рдХрд░рддрд╛ рд╣реИ , рдЬреЛ Vue рдШрдЯрдХреЛрдВ рдФрд░ рд╕рд░рд▓ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ, рджреЗрд╡ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкрде рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдХрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб, рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдлреНрд▓рд╛рдИ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл: рдпрд╣ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдореЛрдб рдореЗрдВ
рд╡реЗрдмрдкреИрдХ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдмрдВрдбрд▓ (
vue-ssr-server-bundle.json ) рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЛрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИред
рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдмрдВрдбрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ рдХрдорд╛рдВрдб рдХреЛ рд░рд┐рд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдиреЗ рдХреАред
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП: yarn run build
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл: js рдФрд░ css рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдЬреЛрдбрд╝рдХрд░, рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдкрдереЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдХрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рд╕реЗ: рдПрдХ рд╕рд░реНрд╡рд░ рдмрдВрдбрд▓ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдПрдХ рдФрд░
рдпрд╛рд░реНрди рд░рди рд╕реНрдЯрд╛рд░реНрдЯ-рдиреЛрдб рдХрдорд╛рдВрдб рдмрдирд╛рдпрд╛, рдЬреЛ
рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдЬреЗрдПрд╕ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрдПрдо 2ред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрднрд╡ рдЖрд░рд╛рдорджрд╛рдпрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ