рдореЗрд░реЗ рдкреГрд╖реНрда рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдХреЛрдб рд╣реИ:
import React from 'react'
import styled from 'styled-components'
const Title = styled.h1`
color: pink;
font-size: 50px;
`
export default () => <Title>My page</Title>
рдЬрдм рдореИрдВ рдкреГрд╖реНрда рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖рдХ рдЧреБрд▓рд╛рдмреА рд░рдВрдЧ рдХрд╛ рд╣реЛрдЧрд╛
рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдкреГрд╖реНрда рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢реАрд░реНрд╖рдХ рдЧреБрд▓рд╛рдмреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдкреГрд╖реНрда рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЧреБрд▓рд╛рдмреА рд░рдВрдЧ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд░ рдореИрдВ рдХреЛрдб рдореЗрдВ рд░рдВрдЧ рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реВрдВ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВ, рддреЛ рдкреЗрдЬ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдкрд░, рдкрд░рд┐рд╡рд░реНрддрди рдлрд┐рд░ рд╕реЗ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
| рдЯреЗрдХ | рд╕рдВрд╕реНрдХрд░рдг |
|-----------|------------|
| рдЕрдЧрд▓рд╛ | рдирд╡реАрдирддрдо |
| рдиреЛрдб | |
| рдУрдПрд╕ | рдЖрд░реНрдЪ |
| рдмреНрд░рд╛рдЙрдЬрд╝рд░ | рд╡рд┐рд╡рд╛рд▓реНрдбреА |
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдмрдЧ рд╣реИ, рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рдеред рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рд╣реИ:
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() } } }
рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВ?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╕рд╛рде рд╣реА рдпрд╣ рд╕рдорд╕реНрдпрд╛
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (рд╕рдорд╛рдзрд╛рди):
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмреИрдмрд▓ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░ рд╕реЗрдЯрдЕрдк рдареАрдХ рд╕реЗ рди рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕
.babelrc
рдлрд╝рд╛рдЗрд▓ рд╣реИ:рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреА
package.json
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛рдлрд┐рд░ рдЕрдкрдирд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ,
yarn install
рдпрд╛npm install
рдФрд░ рдлрд┐рд░ рдЖрдк рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗ!рдкреБрдирд╢реНрдЪ: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рджреЗрд╡ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЯреИрдм рдЦреБрд▓рд╛ рд╣реИ!