Gatsby: рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рдЪрд░?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдирд╡ре░ 2018  ┬╖  1рдЯрд┐рдкреНрдкрдгреА  ┬╖  рд╕реНрд░реЛрдд: gatsbyjs/gatsby

рд╕рд╛рд░рд╛рдВрд╢

рдХреНрдпрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдЪрд░ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рдЬрд╛рдПрдЧрд╛? рдореИрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдХ URL рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред URL рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдореЗрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред

рдХреНрдпрд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ? рдЗрд╕рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рд╣рд╛рде рд▓рдЧрддрд╛ рд╣реИред

question or discussion

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

рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрд╕реНрдЯрдо рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ lodash.template https://lodash.com/docs/4.17.11#template рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)

рдпрд╣рд╛рдБ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╛рдЗрд▓ sample.md рджрд┐рдпрд╛ рдЧрдпрд╛:

---
title: Sample
---

## Hello World

This is a [link](%URL%/sub-path), and so is [this](%URL%/sub-path)

рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЗрдП рдЗрд╕реЗ src/utils/template.js ) рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦреЗрдВ

export default function template(content, data) {
  return content.replace(/%(.+)%/g, (match, key) => {
    const value = data[key]
    if (typeof value !== 'undefined') {
      return value
    }
    return match // guards against some unintentional prefix
  });
}

рдЕрдм рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд╡рд╛рдпрд░рд┐рдВрдЧ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ _use_ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред data рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рд╕реЗ рднреА рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд╝рдХ, рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдлрд╝рд╛рдЗрд▓, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░, рдЖрджрд┐)ред

import React from 'react'

import template from '../utils/template';

const URL = 'https://google.com'; // this can be from wherever

export default function SomeMarkdownPage({ data }) {
  // data is from GraphQL, presume the parent is data.markdown
  return (
    <div dangerouslySetInnerHTML={{
      __html: template(data.markdown.html, {
        URL
      })
    }} />
  )
}

рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рднреА рд╣реИ рдХреНрдпрд╛? рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЧреИрдЯреНрд╕рдмреА-рдЯрд┐рдкреНрдкрдгреА-рдкреНрд▓рдЧрдЗрди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореМрдЬреВрдж рд╣реИ! рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛!

рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ рдЕрдЧрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрдЧреЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЧреИрдЯреНрд╕рдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрд╕реНрдЯрдо рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ lodash.template https://lodash.com/docs/4.17.11#template рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)

рдпрд╣рд╛рдБ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╛рдЗрд▓ sample.md рджрд┐рдпрд╛ рдЧрдпрд╛:

---
title: Sample
---

## Hello World

This is a [link](%URL%/sub-path), and so is [this](%URL%/sub-path)

рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЗрдП рдЗрд╕реЗ src/utils/template.js ) рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦреЗрдВ

export default function template(content, data) {
  return content.replace(/%(.+)%/g, (match, key) => {
    const value = data[key]
    if (typeof value !== 'undefined') {
      return value
    }
    return match // guards against some unintentional prefix
  });
}

рдЕрдм рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд╡рд╛рдпрд░рд┐рдВрдЧ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ _use_ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред data рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рд╕реЗ рднреА рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд╝рдХ, рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдлрд╝рд╛рдЗрд▓, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░, рдЖрджрд┐)ред

import React from 'react'

import template from '../utils/template';

const URL = 'https://google.com'; // this can be from wherever

export default function SomeMarkdownPage({ data }) {
  // data is from GraphQL, presume the parent is data.markdown
  return (
    <div dangerouslySetInnerHTML={{
      __html: template(data.markdown.html, {
        URL
      })
    }} />
  )
}

рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рднреА рд╣реИ рдХреНрдпрд╛? рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЧреИрдЯреНрд╕рдмреА-рдЯрд┐рдкреНрдкрдгреА-рдкреНрд▓рдЧрдЗрди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореМрдЬреВрдж рд╣реИ! рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛!

рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ рдЕрдЧрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрдЧреЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЧреИрдЯреНрд╕рдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

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

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

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

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

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

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