Gatsby без GraphQL

Создано: 24-02-2020

Большинство примеров в документах Gatsby и в интернете в целом сосредоточены на использовании source плагинов для управления данными на Gatsby сайтах. Однако source плагины (или даже узлы Gatsby) не являются строго необходимыми для извлечения данных на Gatsby сайт! Также можно использовать подход “неструктурированных данных" на Gatsby сайтах, не требующий GraphQL.

Примечание: для наших целей здесь “неструктурированные данные" означают данные, "обрабатываемые вне слоя данных Gatsby" (мы используем данные непосредственно, а не преобразуем их в узлы Gatsby).

Подход: извлечение данных и использование Gatsby API createPages

Примечание: этот пример взят из репозитория, построенного специально для моделирования того, как использовать этот подход "неструктурированных данных". Просмотр полного репозитория на GitHub.

В вашем Gatsby проекте файл gatsby-node.js, извлекает необходимые данные, и передает его в экшен createPage внутри API createPages:

exports.createPages = async ({ actions: { createPage } }) => {
  // `getPokemonData` - это функция, которая получает наши данные
  const allPokemon = await getPokemonData(["pikachu", "charizard", "squirtle"])

  // Создает страницу со списком всех Pokémon.
  createPage({
    path: `/`,
    component: require.resolve("./src/templates/all-pokemon.js"),
    context: { allPokemon }, // highlight-line
  })

  // Создает страницу для каждого Pokémon.
  allPokemon.forEach(pokemon => {
    createPage({
      path: `/pokemon/${pokemon.name}/`, // highlight-line
      component: require.resolve("./src/templates/pokemon.js"),
      context: { pokemon }, // highlight-line
    })
  })
}

В выделенных строках данные передаются в шаблон страницы, где они могут быть доступны в качестве пропов:

// highlight-next-line
export default ({ pageContext: { pokemon } }) => (
  <div style={{ width: 960, margin: "4rem auto" }}>
    {/* highlight-start */}
    <h1>{pokemon.name}</h1>
    <img src={pokemon.sprites.front_default} alt={pokemon.name} />
    {/* highlight-end */}
    <h2>Abilities</h2>
    <ul>
      {/* highlight-start */}
      {pokemon.abilities.map(ability => (
        <li key={ability.name}>
          <Link to={`./pokemon/${pokemon.name}/ability/${ability.name}`}>
            {ability.name}
            {/* highlight-end */}
          </Link>
        </li>
      ))}
    </ul>
    <Link to="/">Back to all Pokémon</Link>
  </div>
)

Когда использование "неструктурированных данных" может иметь смысл?

Вы можете найти этот подход полезным, когда использование слоя данных Gatsby кажется вам слишком тяжелым для вашего проекта.

Плюсы использования неструктурированных данных

Компромиссы предшествующего слоя данных Gatsby

Использование слоя данных Gatsby дает следующие преимущества:

Подробнее о GraphQL in Gatsby.

Работа вне слоя данных также означает отказ от оптимизации, обеспечиваемой плагинами transformer, такими как:

Еще одна сложность, добавляемая при работе с неструктурированными данными, заключается в том, что ваш код еще более разрастается, когда вы извлекаете данные из нескольких мест.

Рекомендация Gatsby

Если вы создаете небольшой сайт, одним из эффективных способов его создания является извлечение неструктурированных данных, как описано в этом руководстве, с помощью API createPages, а затем, если сайт становится более сложным позже, вы переходите к созданию более сложных сайтов, или вы хотите преобразовать свои данные, выполните следующие действия:

  1. Проверьте библиотеку [Plugin Library] (https://www.gatsbyjs.org/plugins/), чтобы узнать, существуют ли исходные плагины и/или плагины-трансформеры, которые вы хотите использовать
  2. Если они не существуют, прочитайте руководство Creating Plugins и подумайте о создании собственного!

Дальнейшее чтение

ИСТОЧНИКИ:

Перевод статьи (примерный!) Gatsby without GraphQL