Next.js: рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХ рд╣реЙрдЯ рд░реАрд▓реЛрдб рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдорд╛рд░реНрдЪ 2018  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vercel/next.js

  • [x] рдореИрдВрдиреЗ рдЗрд╕ рднрдВрдбрд╛рд░ рдХреЗ рдореБрджреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рд╣реИред

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░


рдореЗрд░реЗ рдкреГрд╖реНрда рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдХреЛрдб рд╣реИ:

import React from 'react'
import styled from 'styled-components'

const Title = styled.h1`
  color: pink;
  font-size: 50px;
`

export default () => <Title>My page</Title>

рдЬрдм рдореИрдВ рдкреГрд╖реНрда рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖рдХ рдЧреБрд▓рд╛рдмреА рд░рдВрдЧ рдХрд╛ рд╣реЛрдЧрд╛

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░


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

рдЖрдкрдХрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг


| рдЯреЗрдХ | рд╕рдВрд╕реНрдХрд░рдг |
|-----------|------------|
| рдЕрдЧрд▓рд╛ | рдирд╡реАрдирддрдо |
| рдиреЛрдб | |
| рдУрдПрд╕ | рдЖрд░реНрдЪ |
| рдмреНрд░рд╛рдЙрдЬрд╝рд░ | рд╡рд┐рд╡рд╛рд▓реНрдбреА |

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

рд╕рд╛рде рд╣реА рдпрд╣ рд╕рдорд╕реНрдпрд╛

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (рд╕рдорд╛рдзрд╛рди):

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмреИрдмрд▓ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░ рд╕реЗрдЯрдЕрдк рдареАрдХ рд╕реЗ рди рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ .babelrc рдлрд╝рд╛рдЗрд▓ рд╣реИ:

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреА package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛

"devDependencies": {
    "babel-plugin-styled-components": "^1.8.0"
},

рдлрд┐рд░ рдЕрдкрдирд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ, yarn install рдпрд╛ npm install рдФрд░ рдлрд┐рд░ рдЖрдк рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗ!

рдкреБрдирд╢реНрдЪ: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рджреЗрд╡ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЯреИрдм рдЦреБрд▓рд╛ рд╣реИ!

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

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдмрдЧ рд╣реИ, рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рдеред рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рд╣реИ:

  • app , рдореЗрд░реЗ next.js рдРрдк рдХреЗ рд╕рд╛рде
  • ui , рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реА 'ui рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдХреЗ рд╕рд╛рде

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ рдореЗрдВ рд╣реИ: https://github.com/lucleray/ssr-ui-library

рдЬрдм рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ui рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВ, рддреЛ рдкреГрд╖реНрда рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЕрдЧрд░ рдореИрдВ рдкреГрд╖реНрда рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЕрдкрдбреЗрдЯ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ <head> рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓ рд╢реАрдЯ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдСрд░реНрдбрд░ рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ?

@ianregister рдирд╣реАрдВ, <head> рдореЗрдВ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдХреНрд░рдо рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдмрдЧ рд╣реИ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╢реИрд▓рд┐рдпреЛрдВ рдкрд░ рдирд╣реАрдВ рд╣реИред рд╣реЙрдЯ рд░реАрд▓реЛрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЙрдард╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд░реАрдлреНрд░реЗрд╢рд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдирд╡реАрдирддрдо рдЕрдкрдбреЗрдЯ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рд╕рд░реНрд╡рд░ (рдиреЛрдб рд╕рд░реНрд╡рд░.рдЬреЗрдПрд╕) рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ [email protected] , рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.3 рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрдд рдХрд░реЗрдВред

@lucleray , рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВ:

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ babel-plugin-styled-components рдФрд░ рдЕрдкрдиреЗ package.json рдореЗрдВ рдмреЗрдмреЗрд▓ рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╕реЛрдЪреЗрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
`` `рдЬреЗрд╕рди
"рдмреЗрдмреЗрд▓": {
"рдПрдирд╡реА": {
"рд╡рд┐рдХрд╛рд╕": {
"рдкреНрд░реАрд╕реЗрдЯ": ["рдЕрдЧрд▓рд╛/рдмреЗрдмреЗрд▓"],
"рдкреНрд▓рдЧрдЗрдиреНрд╕": [
[
"рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХ",
{
"рдПрд╕рдПрд╕рдЖрд░": рд╕рдЪ рд╣реИ,
"рдбрд┐рд╕реНрдкреНрд▓реЗрдирд╛рдо": рд╕рдЪ
}
]
]
},
"рдЙрддреНрдкрд╛рджрди": {
"рдкреНрд░реАрд╕реЗрдЯ": ["рдЕрдЧрд▓рд╛/рдмреЗрдмреЗрд▓"],
"рдкреНрд▓рдЧрдЗрдиреНрд╕": [
[
"рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХ",
{
"рдПрд╕рдПрд╕рдЖрд░": рд╕рдЪ рд╣реИ,
"рдбрд┐рд╕реНрдкреНрд▓реЗрдирд╛рдо": рдЭреВрдард╛
}
]
]
}
}
}

@tvthatsme рдореИрдВрдиреЗ ui рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдРрдк рджреЛрдиреЛрдВ рдореЗрдВ рд╣реА babel-plugin-styled-components рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЖрдк рдпрд╣рд╛рдВ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
https://github.com/lucleray/ssr-ui-library/blob/master/app/.babelrc
https://github.com/lucleray/ssr-ui-library/blob/master/ui/.babelrc

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди), рдпрд╛ рдХрд╣реАрдВ рдмрдЧ рд╣реИред

рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдкрд░ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдШрдЯрдХ (рдЧреИрд░ рд╢реИрд▓рд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд) рдореЗрдВ рдХреЛрдИ рднреА рд╕рдВрдкрд╛рджрди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ "рдЪреЗрддрд╛рд╡рдиреА: рдкреНрд░реЛрдк className рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ред рд╕рд░реНрд╡рд░:" рдмрд╛рдж рдХреЗ рд╣рд╛рд░реНрдб рдкреЗрдЬ рдкрд░ рддрд╛рдЬрд╝рд╛ред рдЗрд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@sea129 рдХреНрдпрд╛ рдЖрдк рдареАрдХ рдХрд░ рдкрд╛рдП?

рд▓реЙрд▓, рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред @valeeum рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ?

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

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: https://github.com/lucleray/ssr-ui-library

app Next.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ ui рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рд░реНрди рдХреЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕рд░рд▓ yarn link ред

рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░, рдмрдВрдбрд▓ рдореЗрдВ ui рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ external рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ node_modules рдореЗрдВ рд╣реИ)ред
рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдкрд░, рдмрдВрдбрд▓ рдореЗрдВ ui рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдпрд╣ .next/static (рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб) рдмрдВрдбрд▓реЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

/***/ "../ui/bundle.js":
/*!***********************!*\
  !*** ../ui/bundle.js ***!
  \***********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, '__esModule', { value: true });

function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }

var styled = _interopDefault(__webpack_require__(/*! styled-components */ "../node_modules/styled-components/dist/styled-components.browser.esm.js"));

const UiButton = styled.button`
  background: black;
`;

exports.UiButton = UiButton;


/***/ }),

рджреВрд╕рд░реА рдУрд░, .next/server (рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб) рдмрдВрдбрд▓реЛрдВ рдореЗрдВ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:

/***/ "@monorepo/ui":
/*!*******************************!*\
  !*** external "@monorepo/ui" ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = require("@monorepo/ui");

/***/ }),

рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ module.exports = require("@monorepo/ui") рдХреЛ ui рдкреИрдХреЗрдЬ рдореЗрдВ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд╕ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╢реНрдб рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ ui рдкреИрдХреЗрдЬ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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


рдЗрд╕рдиреЗ @monorepo/ui рдХреЛ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдмрдВрдбрд▓реЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдмрдВрдбрд▓ рдХрд┐рдпрд╛: https://github.com/lucleray/ssr-ui-library/blob/ webpack-config/app/next.config.js

рдореИрдВ рдЕрднреА рднреА рд╕рдордЭрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ

require рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреИрд╢ рд╣реИ ( require.cache ) рдпрд╣ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рднреА рдмрдВрдбрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ (рд╕рдВрдХрд▓рди рдЧрддрд┐ рдХреЗ рд▓рд┐рдП)ред

рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рддреЛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣реЙрдЯ-рд░реАрд▓реЛрдбрд░ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдкреБрдирдГ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреНрд▓рд╛рдЗрдВрдЯ (рдЬреЛ рдорд╛рдорд▓рд╛ рд╣реИ) рдФрд░ рд╕рд░реНрд╡рд░ (рдЬреЛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ) рджреЛрдиреЛрдВ рддрд░рдл рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рддреЛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣реЙрдЯ-рд░реАрд▓реЛрдбрд░ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдкреБрдирдГ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА, рд╣рдо рдХреЗрд╡рд▓ requ.cache рд╕реЗ рдкреВрд░реНрдг рдкрде рд╣рдЯрд╛рддреЗ рд╣реИрдВред

рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ @timneutkens рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛

рдХреНрдпрд╛ рдореБрдЭреЗ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ @monorepo/ui рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдмрдВрдбрд▓реЛрдВ рдореЗрдВ рдмрдВрдбрд▓ рд╣реЛ рдЬрд╛рдП? рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА?

рдореЙрдбреНрдпреВрд▓ рд╕рдВрдХрд▓рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/martpie/next-plugin-transpile-modules рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@timneutkens рдЗрд╕реЗ рдХреНрдпреЛрдВ рдмрдВрдж рдХрд┐рдпрд╛ рдЧрдпрд╛? рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдореМрдЬреВрдж рд╣реИ

рдЕрднреА рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ

рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ

рдпрд╣рд╛рдБ рднреА

рд╕рд╛рде рд╣реА рдпрд╣ рд╕рдорд╕реНрдпрд╛

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (рд╕рдорд╛рдзрд╛рди):

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмреИрдмрд▓ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░ рд╕реЗрдЯрдЕрдк рдареАрдХ рд╕реЗ рди рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ .babelrc рдлрд╝рд╛рдЗрд▓ рд╣реИ:

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреА package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛

"devDependencies": {
    "babel-plugin-styled-components": "^1.8.0"
},

рдлрд┐рд░ рдЕрдкрдирд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ, yarn install рдпрд╛ npm install рдФрд░ рдлрд┐рд░ рдЖрдк рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗ!

рдкреБрдирд╢реНрдЪ: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рджреЗрд╡ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЯреИрдм рдЦреБрд▓рд╛ рд╣реИ!

рдареАрдХ рд▓реЛрдЧред рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рд╣реИред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рдПрдХ _document.js рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВред

import Document, { Head, Main, NextScript } from 'next/document'
import { ServerStyleSheet } from 'styled-components'

class MyDocument extends Document {
  static getInitialProps ({ renderPage }) {
    const sheet = new ServerStyleSheet()
    const page = renderPage(App => props => sheet.collectStyles(<App {...props} />))
    const styleTags = sheet.getStyleElement()
    return { ...page, styleTags }
  }

  render () {
    return (
      <html>
        <Head>
          <title>Your site title</title>
          {this.props.styleTags}
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </html>
    )
  }
}

export default MyDocument

рдлрд┐рд░ npm install --save -D babel-plugin-styled-components

рдкреЗрдЬ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛, _App.js рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдРрдк рднреА рдмрдирд╛рдПрдВ рдФрд░ рдЬреЛрдбрд╝реЗрдВ:

import React from "react";
import App from "next/app";

class MyApp extends App {
  render() {
    const { Component, pageProps } = this.props;
    return <Component {...pageProps} />;
  }
}

export default MyApp;

рддреБрдо рд╕рдм рд╕реЗрдЯ рд╣реЛ

рд╕рд╛рде рд╣реА рдпрд╣ рд╕рдорд╕реНрдпрд╛

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (рд╕рдорд╛рдзрд╛рди):

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмреИрдмрд▓ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░ рд╕реЗрдЯрдЕрдк рдареАрдХ рд╕реЗ рди рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ .babelrc рдлрд╝рд╛рдЗрд▓ рд╣реИ:

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреА package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛

"devDependencies": {
    "babel-plugin-styled-components": "^1.8.0"
},

рдлрд┐рд░ рдЕрдкрдирд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ, yarn install рдпрд╛ npm install рдФрд░ рдлрд┐рд░ рдЖрдк рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗ!

рдкреБрдирд╢реНрдЪ: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рджреЗрд╡ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЯреИрдм рдЦреБрд▓рд╛ рд╣реИ!

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ:

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ

styled.h1`
color: red;
`

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдб рдкрд░ рдпрд╣ рд▓рд╛рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ

styled.h1`
color: purple;
`

рдЗрд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╛рда рдХрд╛рд▓рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдИ рд╢реИрд▓реА рдирд╣реАрдВред
рдЬрдм рдЖрдк рдкреГрд╖реНрда рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдмреИрдВрдЧрдиреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рд░рдВрдЧ рдмрджрд▓рддреЗ рд╣реИрдВ red , рддреЛ HMR рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рд▓рд╛рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк рдЗрд╕реЗ рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдХреИрд╢рд┐рдВрдЧ рдЪрд▓ рд░рд╣реА рд╣реЛред

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

рдореБрдЭреЗ SC рдФрд░ Next.js рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпреЗ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рдЕрдиреБрдорд╛рди рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдЗрд╕рдиреЗ рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ 5.0.0-rc.2

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХрд┐рддрдиреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЕрдЧрд▓реЗ рд░реЗрдкреЛ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд▓рд╛рдкрддрд╛ рдмрд┐рдЯреНрд╕ рдХреЛ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ
https://github.com/zeit/next.js/tree/canary/examples/with-typescript-styled-components

рдореИрдВ next.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ @MaxMcKinney рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдмрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ .babelrc рд╡рд░реАрдпрддрд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рд╛рд░реВрдк рдпрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реА .babelrc рдлрд╝рд╛рдЗрд▓ рдереА:

{
    "presets": [
        [
            "next/babel",
            {
                "styled-jsx": {
                    "plugins": [
                        "styled-jsx-plugin-postcss"
                    ]
                }
            }
        ]
    ],
    "plugins": [
        [
            "styled-components",
            {
                "ssr": true
            }
        ]
    ]
}

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рд╣реЛрдЧреА рдЬрдм рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ Next.js рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдХреНрд▓реЛрди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдорд╛рди package.json рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдФрд░ .babelrc рд╕реЗрдЯрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИрдВред MaxMckinney рд╕рдорд╛рдзрд╛рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ package.json рдореЗрдВ рд╕рд╣реА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдореБрдЭреЗ "styled-components": "^5.0.0" рдмрд┐рд▓реНрдХреБрд▓ рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЗрдЬ рдлрд╝реНрд▓реЙрдбрд░ рдХреЗ рддрд╣рдд рдмрд╕ _app.js рдФрд░ _document.js рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

// _app.js
import App from 'next/app'
import { ThemeProvider } from 'styled-components'

const theme = {}

export default class MyApp extends App {
    render() {
        const { Component, pageProps } = this.props
        return (
            <ThemeProvider theme={theme}>
                <Component {...pageProps} />
            </ThemeProvider>
        )
    }
}
// _document.js
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: (App) => (props) =>
            sheet.collectStyles(<App {...props} />),
        })

      const initialProps = await Document.getInitialProps(ctx)
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      }
    } finally {
      sheet.seal()
    }
  }
}

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЗрдЬ рдлрд╝реНрд▓реЙрдбрд░ рдХреЗ рддрд╣рдд рдмрд╕ _app.js рдФрд░ _document.js рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

// _app.js
import App from 'next/app'
import { ThemeProvider } from 'styled-components'

const theme = {}

export default class MyApp extends App {
    render() {
        const { Component, pageProps } = this.props
        return (
            <ThemeProvider theme={theme}>
                <Component {...pageProps} />
            </ThemeProvider>
        )
    }
}
// _document.js
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: (App) => (props) =>
            sheet.collectStyles(<App {...props} />),
        })

      const initialProps = await Document.getInitialProps(ctx)
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      }
    } finally {
      sheet.seal()
    }
  }
}

рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВ?

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

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

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

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

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

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

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