
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЖрдк рдЕрдХреЗрд▓реЗ рдХреБрдЫ рдмреЙрдпрд▓рд░ рдкрд░ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд╛рд░реНрдердХ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрдХрдиреАрдХ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд▓реЗрдЦ Gatsby.js рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЬреНрдЮрд╛рди рд╕реЗ рдЖрдк рдЬрдЯрд┐рд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдФрд░ рдмреНрд▓реЙрдЧреЛрдВ рдХреЛ рдмрдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
JAM- рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмреНрд▓реЙрдЧ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ
рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╡рд┐рд╖рдп:
рдЯреНрд░реЗрдирд┐рдВрдЧ
рдкреАрд╕реА рдкрд░ рдЧреИрдЯреНрд╕рдмреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВyarn global add gatsby-cli
рдПрдХ рдиреНрдпреВрдирддрдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдХреНрд▓реЛрдирд┐рдВрдЧ npx gatsby new gatsby-tutorial https://github.com/gatsbyjs/gatsby-starter-hello-world cd gatsby-tutorial
рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди git init git add . git commit -m "init commit"
рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдБрдЪ yarn start
рдпрджрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкрде рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ http: // localhost: 8000 рдЖрдк "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдк рд╣реЙрдЯ-рд░реАрд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП /src/pages/index.js рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреГрд╖реНрда рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдорд╛рд░реНрдЧ
Gatsby рдореЗрдВ рдПрдХ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирдИ рдлрд╝рд╛рдЗрд▓ / src / рдкреЗрдЬ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ HTML рдкреЗрдЬ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрд╕ рдкреГрд╖реНрда рдХрд╛ рдкрде рдирд╛рдо рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрде рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдФрд░ рдкреГрд╖реНрда рдЬреЛрдбрд╝реЗрдВ:
src тФФтФАтФА pages тФЬтФАтФА about.js тФЬтФАтФА index.js тФФтФАтФА tutorial тФЬтФАтФА part-four.js тФЬтФАтФА part-one.js тФЬтФАтФА part-three.js тФЬтФАтФА part-two.js тФФтФАтФА part-zero.js
рд╕рд╛рдордЧреНрд░реА рдЕрднреА рддрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкрд╛рда рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
import React from "react"; export default () => <div>Welcome to tutorial/part-one</div>;
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд╛рдВрдЪреЗрдВ:
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреБрд░рдВрдд рд░реВрдЯрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╡рд┐рд╢реЗрд╖ createPage API рднреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдкрдереЛрдВ рдФрд░ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ Gatsby рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд▓реЗрдЦ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдкреГрд╖реНрдареЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЧреИрдЯреНрд╕рдмреА рдкреИрдХреЗрдЬ рд╕реЗ <Link />
рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рднреА рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдорд┐рдд <a>
рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
/src/pages/index.js
import React from "react"; import { Link } from "gatsby"; export default () => ( <div> <ul> <li> <Link to="/about">about</Link> </li> <li> <Link to="/tutorial/part-zero">Part #0</Link> </li> <li> <Link to="/tutorial/part-one">Part #1</Link> </li> <li> <Link to="/tutorial/part-two">Part #2</Link> </li> <li> <Link to="/tutorial/part-three">Part #3</Link> </li> <li> <Link to="/tutorial/part-four">Part #4</Link> </li> </ul> </div> );
<Link>
рд╣реБрдб рдХреЗ рддрд╣рдд рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдореБрд╢реНрдХрд┐рд▓ рддрдВрддреНрд░ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЗрдЯ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <a>
рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкреГрд╖реНрда рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЕрд╡рдпрд╡, рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рдФрд░ рдЙрдирдХреА рд╕рд╣рднрд╛рдЧрд┐рддрд╛
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реЗрдбрд░, рдлреБрдЯрд░, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреГрд╖реНрда, рд╕рд╛рдордЧреНрд░реА рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЪреВрдВрдХрд┐ рдЧреИрдЯреНрд╕рдмреА рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдШрдЯрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣реЗрдбрд░ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдмрдирд╛рдПрдБ:
/src/components/header.js
import React from "react"; import { Link } from "gatsby"; /** * * , React-. * , * " ". * "" GraphQL gatsby- */ import logoSrc from "../images/logo.png"; export default () => ( <header> <Link to="/"> <img src={logoSrc} alt="logo" width="60px" height="60px" /> </Link> That is header </header> );
/src/components/sidebar.js
import React from "react"; import { Link } from "gatsby"; export default () => ( <div> <ul> <li> <Link to="/about">about</Link> </li> <li> <Link to="/tutorial/part-zero">Part #0</Link> </li> <li> <Link to="/tutorial/part-one">Part #1</Link> </li> <li> <Link to="/tutorial/part-two">Part #2</Link> </li> <li> <Link to="/tutorial/part-three">Part #3</Link> </li> <li> <Link to="/tutorial/part-four">Part #4</Link> </li> </ul> </div> );
рдФрд░ рдЙрдиреНрд╣реЗрдВ /src/pages/index.js рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
import React from "react"; import Header from "../components/header"; import Sidebar from "../components/sidebar"; export default () => ( <div> <Header /> <Sidebar /> <h1>Index page</h1> </div> );
рд╣рдо рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рд╣реИрдбрд░ рдФрд░ рд╕рд╛рдЗрдбрдмрд╛рд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЖрдЙрдЯ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЧреИрдЯреНрд╕рдмреА рд▓реЗрдЖрдЙрдЯ == рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрдВрдЯреЗрдирд░
рд╣рд╛рдВ, рдпрд╣ рд╕рдЦреНрдд рд╕рдорд╛рдирддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ
/src/components/layout.js
import React from "react"; import Header from "./header"; import Sidebar from "./sidebar"; export default ({ children }) => ( <> <Header /> <div style={{ margin: `0 auto`, maxWidth: 650, backgroundColor: `#eeeeee` }} > <Sidebar /> {children} </div> </> );
/src/pages/index.js (рдФрд░ рдЕрдиреНрдп рд╕рднреА рдкреГрд╖реНрда)
import React from "react"; import Layout from "../components/layout"; export default () => ( <Layout> <h1>Index page</h1> </Layout> );
рдХрд┐рдпрд╛, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рджреЗрдЦреЛ:

рдХреНрдпреЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд▓реЛрдЕрд░рдХреЗрд╕ рдкрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рднреА рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╣реИ? рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдирд╛рдо рд╕реНрдерд╛рди рдЗрд╕ рддрдереНрдп рд╕реЗ рдЖрддрд╛ рд╣реИ рдХрд┐ "рд╣рд░ рдлрд╝рд╛рдЗрд▓ рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдФрд░ рд╡рд░реНрдЧ рд╣рдореЗрд╢рд╛ рдкреВрдВрдЬреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред" рдЧреИрдЯреНрд╕рдмреА рдореЗрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрднреА рднреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ "рд▓реЗрдХрд┐рди" рд╣реИ - "рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкреГрд╖реНрда рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдирд╛рдо рдЗрд╕ рдкреГрд╖реНрда рдХрд╛ URL рд╣реИ"ред рд╕рдореБрджрд╛рдп рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ http://domain.com/User/Settings
рдЬреИрд╕реЗ рд▓рд┐рдВрдХ рдХрдореНрдмрд▓-рдЗрд▓-рдлрд╛рдЯ рдФрд░ рдЕрдиреБрдореЛрджрд┐рдд рдХрдмрд╛рдм-рдХреЗрд╕ рдирд╣реАрдВ рд╣реИрдВред
рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ src тФЬтФАтФА components тФВ тФЬтФАтФА header.js тФВ тФЬтФАтФА layout.js тФВ тФФтФАтФА sidebar.js тФЬтФАтФА images тФВ тФФтФАтФА logo.png тФФтФАтФА pages тФЬтФАтФА about.js тФЬтФАтФА index.js тФФтФАтФА tutorial тФЬтФАтФА part-eight.js тФЬтФАтФА part-five.js тФЬтФАтФА part-four.js тФЬтФАтФА part-one.js тФЬтФАтФА part-seven.js тФЬтФАтФА part-six.js тФЬтФАтФА part-three.js тФЬтФАтФА part-two.js тФФтФАтФА part-zero.js
рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдЕрдм рдЬрдм рд╕рд╛рдЗрдЯ рд╕рдВрд░рдЪрдирд╛ рддреИрдпрд╛рд░ рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдЖрдк рд╕рд╛рдордЧреНрд░реА рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕рд┐рдХ "рд╣рд╛рд░реНрдбрдХреЛрдб" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЗрдПрдПрдо рд╕реНрдЯреИрдХ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рдерд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде "AJAX рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛" рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рднрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред Gatsby рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП GraphQL рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ рдпрд╛ рдореЗрд░реЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЖрдк рдпрд╣рд╛рдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, gatsby
рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ gatsby
рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдФрд░ рд╕рд░рд▓ рдШрдЯрдХреЛрдВ рджреЛрдиреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА - рдкреГрд╖реНрда рдХреНрд╡реЗрд░реА рд╕реЗ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░ рд╣реИред рдЕрдм рддрдХ, рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬрд╝реЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
query
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП query
рдЖрдкрдХреЛ http: // localhost: 8000 / ___ graphql рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрдбрдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдСрдЯреЛ-рдкреВрд░реНрдгрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред

/src/components/sidebar.js
import React from "react"; import { Link, StaticQuery, graphql } from "gatsby"; export default () => ( <StaticQuery query={graphql` { allSitePage { edges { node { id path } } } } `} render={({ allSitePage: { edges } }) => ( <ul> {edges.map(({ node: { id, path } }) => ( <li key={id}> <Link to={path}>{id}</Link> </li> ))} </ul> )} /> );
рдЕрдм query
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ query
рд╣рдо рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреИрдирд▓ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд╣ рд╕рднреА рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдкрд░ рдмрд┐рдирд╛ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдкреНрд▓рдЧ-рдЗрди рдФрд░ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ "рд╣рд╛рд░реНрдбрдХреЛрдб" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рд╡рд┐рд╖рдп рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ - рдкреНрд▓рдЧрдЗрдиреНрд╕ред
рдкреНрд▓рдЧ-рдЗрди
рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ, рдЧреИрдЯреНрд╕рдмреА рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреБрдбрд╝рд┐рдпреЛрдВ рдХрд╛ рд╕рдореВрд╣ рд╣реИ, рдЬреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдЯ рд╕реНрддрд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ /gatsby-config.js рдмрдирд╛рдПрдВред рдЬреЛ рдХрдореНрдкрд╛рдЗрд▓рд░ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдкреНрд▓рдЧрдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛:
yarn add gatsby-source-filesystem
/Gatsby-config.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди :
module.exports = { plugins: [ { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/`, } } ], }
рдКрдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА /** * gatsby-config.js * JS * */ module.exports = { /** * 'plugins' pipeline * , */ plugins: [ /** * , * */ `gatsby-example-plugin`, { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/`, } } ], }
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдордиреЗ Gatsby рдореЗрдВ "рд╕рд╣реА" рдЫрд╡рд┐ рдЖрдпрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА?
/src/components/header.js
import React from "react"; import { Link, StaticQuery, graphql } from "gatsby"; export default () => ( <StaticQuery query={graphql` { allFile(filter: { name: { eq: "logo" } }) { edges { node { publicURL } } } } `} render={({ allFile: { edges: [ { node: { publicURL } } ] } }) => ( <header> <Link to="/"> <img src={publicURL} alt="logo" width="60px" height="60px" /> </Link> That is header </header> )} /> );
рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдмрдкреИрдХ рдЖрдпрд╛рдд рдХреЗ рдмрдЬрд╛рдп рдЪрд┐рддреНрд░ рдХреЛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЗрд╢рд╛рд░реЗ рдереЗ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдкрд░ рдЬрд▓реНрджрдмрд╛рдЬрд╝реА рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдд рдЙрд╕реА рдкреНрд▓рдЧ рдЗрди рдХреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рд╕рд╛рдЗрдЯ рдкрд░ рд╣рдЬрд╛рд░реЛрдВ рдлрд╝реЛрдЯреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╣рдорд╛рд░реА рдЖрд▓рд╕реА-рд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдПрдХ рдЧреИрдЯреНрд╕рдмреА-рдЫрд╡рд┐ рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬреЛ рд╕рднреА рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред query
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐рдпрд╛рдВ рдЖрдпрд╛рдд рдХреА query
ред
рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛:
yarn add gatsby-plugin-typography react-typography typography typography-theme-noriega node-sass gatsby-plugin-sass gatsby-plugin-styled-components styled-components babel-plugin-styled-components
gatsby-config.js
module.exports = { plugins: [ { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/` } }, // add style plugins below `gatsby-plugin-typography`, `gatsby-plugin-sass`, `gatsby-plugin-styled-components` ] };
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЖрдк рд╣рд░ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрд╡реЗрджрди рд╕реНрдЯрд╛рдЗрд▓
рдЖрдЗрдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдордиреЗ SASS , рд╕реНрдЯрд╛рдЗрд▓-рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдФрд░ рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА.рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд▓рдЧ рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ css.modules рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
рдЖрдЗрдП рд╡реИрд╢реНрд╡рд┐рдХ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рдкреВрд░реА рд╕рд╛рдЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣, /gatsby-browser.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:
import "./src/styles/global.scss";
Gatsby-browser.js рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ
/src/styles/global.scss
body { background-color: lavenderblush; }
рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд░реБрдЭрд╛рди "рдЬреЗрдПрд╕ рдореЗрдВ рд╕реАрдПрд╕рдПрд╕" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдУрд░ рдЭреБрдХ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд╝реЙрдиреНрдЯ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╢реИрд▓реА рдЦрд╛рд▓реА рд░рд╣реЗрдЧреАред
рдЖрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ gatsby-plugin-typography
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╛рдЗрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реАрд╕реЗрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдм рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред
/src/utils/typography.js
import Typography from "typography"; import theme from "typography-theme-noriega"; const typography = new Typography(theme); export default typography;
рдЖрдк рд╕реВрдЪреА рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдкреИрдХреЗрдЬ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреИрдЯреНрд╕рдмреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг )
/gatsby-config.js
module.exports = { plugins: [ { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/` } }, { resolve: `gatsby-plugin-typography`, options: { pathToConfigModule: `src/utils/typography` } }, `gatsby-plugin-sass`, `gatsby-plugin-styled-components` ] };
рдФрд░ рдЪрдпрдирд┐рдд рдкреНрд░реАрд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рд╛рдЗрдЯ рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рд╢реИрд▓реА рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдпрд╣ рдПрдХ рддрдХрдиреАрдХреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдФрд░ рдорддрднреЗрджреЛрдВ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯрд╛рдЗрд▓ рдШрдЯрдХреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ :
рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ /src/utils/vars.js рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ
export const colors = { main: `#663399`, second: `#fbfafc`, main50: `rgba(102, 51, 153, 0.5)`, second50: `rgba(251, 250, 252, 0.5)`, textMain: `#000000`, textSecond: `#ffffff`, textBody: `#222222` };
/src/components/header.js import React from "react"; import { Link, StaticQuery, graphql } from "gatsby"; import styled from "styled-components"; import { colors } from "../utils/vars"; const Header = styled.header` width: 100%; height: 3em; display: flex; justify-content: space-between; align-items: center; background-color: ${colors.main}; color: ${colors.textSecond}; padding: 0.5em; `; const Logo = styled.img` border-radius: 50%; height: 100%; `; const logoLink = `height: 100%;`; export default () => ( <StaticQuery query={graphql` { allFile(filter: { name: { eq: "logo" } }) { edges { node { publicURL } } } } `} render={({ allFile: { edges: [ { node: { publicURL } } ] } }) => ( <Header> That is header <Link to="/" css={logoLink}> <Logo src={publicURL} alt="logo" /> </Link> </Header> )} /> );
/src/components/sidebar.js import React from "react" import { Link, StaticQuery, graphql } from "gatsby" import styled from "styled-components" import { colors } from "../utils/vars" const Sidebar = styled.section` position: fixed; left: 0; width: 20%; height: 100%; display: flex; flex-direction: column; justify-content: center; background-color: ${colors.second}; color: ${colors.textMain}; ` const navItem = ` display: flex; align-items: center; margin: 0 1em 0 2em; padding: 0.5em 0; border-bottom: 0.05em solid ${colors.mainHalf}; postion: relative; color: ${colors.textBody}; text-decoration: none; &:before { content: ''; transition: 0.5s; width: 0.5em; height: 0.5em; position: absolute; left: 0.8em; border-radius: 50%; display: block; background-color: ${colors.main}; transform: scale(0); } &:last-child { border-bottom: none; } &:hover { &:before { transform: scale(1); } } ` export default () => ( <StaticQuery query={graphql` { allSitePage { edges { node { id, path } } } } `} render={({ allSitePage: { edges } }) => ( <Sidebar> { edges.map(({ node: { id, path } }) => ( <Link to={path} key={id} css={navItem} >{id}</Link> )) } </Sidebar> )} /> )

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдорд╛рд░реНрдЬрд┐рди рдкреНрд▓рдЧрдЗрди рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ createPages API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЗрдЬ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ Gatsby рдФрд░ Contentful рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ ред
рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдбреЗрдЯрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ [ { "id": "title", "type": "Symbol" }, { "id": "content", "type": "Text", }, { "id": "link", "type": "Symbol", }, { "id": "orderNumber", "type": "Integer", } ]
рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛:
yarn add dotenv gatsby-source-contentful gatsby-transformer-remark
/gatsby-config.js
if (process.env.NODE_ENV === "development") { require("dotenv").config(); } module.exports = { plugins: [ `gatsby-transformer-remark`, { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/`, } }, { resolve: `gatsby-plugin-typography`, options: { pathToConfigModule: `src/utils/typography`, }, }, { resolve: `gatsby-source-contentful`, options: { spaceId: process.env.CONTENTFUL_SPACE_ID, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN, }, }, `gatsby-plugin-sass`, `gatsby-plugin-styled-components`, ], }
, if (process.env.NODE_ENV === "development") { require("dotenv").config(); } module.exports = { plugins: [ `gatsby-transformer-remark`, { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/`, } }, { resolve: `gatsby-plugin-typography`, options: { pathToConfigModule: `src/utils/typography`, }, }, { resolve: `gatsby-source-contentful`, options: { spaceId: process.env.CONTENTFUL_SPACE_ID, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN, }, }, `gatsby-plugin-sass`, `gatsby-plugin-styled-components`, ], }
рдЕрдВрджрд░ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде / src / Pages рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛рдПрдВ рдФрд░ Gatsby рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ:
/gatsby-node.js
const path = require(`path`); /** * , * */ exports.createPages = ({ graphql, actions }) => { /** * * * */ const { createPage } = actions; return graphql(` { allContentfulArticle { edges { node { title link content { childMarkdownRemark { html } } } } } } `).then(({ data: { allContentfulArticle: { edges } } }) => { /** * * createPage() * */ edges.forEach(({ node }) => { createPage({ path: node.link, component: path.resolve(`./src/templates/index.js`), context: { slug: node.link } }); }); }); };
Gatsby-node.js рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ
рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рдЙрддреНрдкрдиреНрди рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╣реЛрдЧрд╛
/src/templates/index.js
import React from "react"; import { graphql } from "gatsby"; import Layout from "../components/layout"; export default ({ data: { allContentfulArticle: { edges: [ { node: { content: { childMarkdownRemark: { html } } } } ] } } }) => { return ( <Layout> <div dangerouslySetInnerHTML={{ __html: html }} /> </Layout> ); }; export const query = graphql` query($slug: String!) { allContentfulArticle(filter: { link: { eq: $slug } }) { edges { node { title link content { childMarkdownRemark { html } } } } } } `;
рдпрд╣рд╛рдВ <StaticQuery />
рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ $slug
рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдореЗрдВ рддрд░реНрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ import React from "react"; import { Link, StaticQuery, graphql } from "gatsby"; import styled from "styled-components"; import { colors } from "../utils/vars"; const Sidebar = styled.section` position: fixed; left: 0; width: 20%; height: 100%; display: flex; flex-direction: column; justify-content: center; background-color: ${colors.second}; color: ${colors.textMain}; `; const navItem = ` display: flex; align-items: center; margin: 0 1em 0 2em; padding: 0.5em 0; border-bottom: 0.05em solid ${colors.main50}; postion: relative; color: ${colors.textBody}; text-decoration: none; &:before { content: ''; transition: 0.5s; width: 0.5em; height: 0.5em; position: absolute; left: 0.8em; border-radius: 50%; display: block; background-color: ${colors.main}; transform: scale(0); } &:last-child { border-bottom: none; } &:hover { &:before { transform: scale(1); } } `; export default () => ( <StaticQuery query={graphql` { allContentfulArticle(sort: { order: ASC, fields: orderNumber }) { edges { node { title link orderNumber } } } } `} render={({ allContentfulArticle: { edges } }) => ( <Sidebar> {edges.map(({ node: { title, link, orderNumber } }) => ( <Link to={link} key={link} css={navItem}> {orderNumber}. {title} </Link> ))} </Sidebar> )} /> );

рдПрд╕рдИрдУ рдЕрдиреБрдХреВрд▓рди
рддрдХрдиреАрдХреА рдкрдХреНрд╖ рдкрд░, рд╕рд╛рдЗрдЯ рдХреЛ рддреИрдпрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рдореЗрдЯрд╛-рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
yarn add gatsby-plugin-react-helmet react-helmet
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реЗрд▓рдореЗрдЯ HTML рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП <head>...</head>
рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ Gatsby рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ SEO рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИред
/src/templates/index.js
import React from "react"; import { graphql } from "gatsby"; import { Helmet } from "react-helmet"; import Layout from "../components/layout"; export default ({ data: { allContentfulArticle: { edges: [ { node: { title, content: { childMarkdownRemark: { html } } } } ] } } }) => { return ( <Layout> <Helmet> <meta charSet="utf-8" /> <title>{title}</title> </Helmet> <div dangerouslySetInnerHTML={{ __html: html }} /> </Layout> ); }; export const query = graphql` query($slug: String!) { allContentfulArticle(filter: { link: { eq: $slug } }) { edges { node { title link content { childMarkdownRemark { html } } } } } } `;
рдЕрдм рд╕рд╛рдЗрдЯ рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣рдореЗрд╢рд╛ рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛, рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде <meta name="description" content=" ">
рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦреЛрдЬ рдкреГрд╖реНрда рдкрд░ рд▓реЗрдЦ рдХреНрдпрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рдПрд╕рдИрдУ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЕрдм рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рдкреНрд░рдмрдВрдзрдиреАрдп рд╣реИрдВ рдПрдХ рдЬрдЧрд╣ред

PWA рд╕реЗрдЯрдЕрдк
Gatsby рдХреЛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдкреГрдердХреНрдХрд░рдг рдФрд░ рдиреНрдпреВрдирддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдкреВрд░реНрд╡-рд▓реЛрдбрд┐рдВрдЧ, рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕рд╛рдЗрдЯ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдореИрдиреНрдпреБрдЕрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдпреЗ рдкреНрд░рджрд░реНрд╢рди рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдПрдХ рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рддреАрди рдмреБрдирд┐рдпрд╛рджреА рдорд╛рдирджрдВрдб рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ PWA рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- https рдкреНрд░реЛрдЯреЛрдХреЙрд▓
- рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред json
- рд╕реЗрд╡рд╛рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╕рд╛рдЗрдЯ рдкрд░ рдСрдлрд╝рд▓рд╛рдЗрди рдкрд╣реБрдБрдЪ
рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЛ Gatsby рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдореЗрди , рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ, рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╡рд┐рдХрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ Netlify рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ , рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ https рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рд╣рдо рд╢реЗрд╖ рдорджреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рджреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВрдЧреЗ:
yarn add gatsby-plugin-manifest gatsby-plugin-offline
рдФрд░ рдЙрдиреНрд╣реЗрдВ /src/gatsby-config.js рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
if (process.env.NODE_ENV === "development") { require("dotenv").config(); } module.exports = { plugins: [ { resolve: `gatsby-plugin-manifest`, options: { name: `GatsbyJS translated tutorial`, short_name: `GatsbyJS tutorial`, start_url: `/`, background_color: `#f7f0eb`, theme_color: `#a2466c`, display: `standalone`, icon: `public/favicon.ico`, include_favicon: true } }, `gatsby-plugin-offline`, `gatsby-transformer-remark`, { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/` } }, { resolve: `gatsby-plugin-typography`, options: { pathToConfigModule: `src/utils/typography` } }, { resolve: `gatsby-source-contentful`, options: { spaceId: process.env.CONTENTFUL_SPACE_ID, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN } }, `gatsby-plugin-sass`, `gatsby-plugin-styled-components`, `gatsby-plugin-react-helmet` ] };
, if (process.env.NODE_ENV === "development") { require("dotenv").config(); } module.exports = { plugins: [ { resolve: `gatsby-plugin-manifest`, options: { name: `GatsbyJS translated tutorial`, short_name: `GatsbyJS tutorial`, start_url: `/`, background_color: `#f7f0eb`, theme_color: `#a2466c`, display: `standalone`, icon: `public/favicon.ico`, include_favicon: true } }, `gatsby-plugin-offline`, `gatsby-transformer-remark`, { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/` } }, { resolve: `gatsby-plugin-typography`, options: { pathToConfigModule: `src/utils/typography` } }, { resolve: `gatsby-source-contentful`, options: { spaceId: process.env.CONTENTFUL_SPACE_ID, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN } }, `gatsby-plugin-sass`, `gatsby-plugin-styled-components`, `gatsby-plugin-react-helmet` ] };
рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдХреЗ рд╕реЗрд╡рд╛-рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд░рдгрдиреАрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЖрдк рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реЗрдм рджреБрдирд┐рдпрд╛ рдХреА рдирд╡реАрдирддрдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ https: // рдбреЛрдореЗрди рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд╛рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рдореИрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдмрд╛рдЬрд╛рд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЬреЗрдПрдПрдо-рд╕реНрдЯреИрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдерд╛ рдЬреЛ рдЗрди рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдм рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕рд╛рджрдЧреАред рдЧреИрдЯреНрд╕рдмреА рдЬреНрдпрд╛рджрд╛рддрд░ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдЗрдЯ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓рд╛рдЗрдЯрд╣рд╛рдЙрд╕ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП 100% рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЦреЛрдЬ рдЗрдВрдЬрди рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреА рдбрд┐рд▓реАрд╡рд░реА рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рджреНрд╡рд╛рд░рд╛) рдХрдо рд╕реЗ рдХрдо Google рдкрд░)ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░