Gatsby createPages с одним файлом JSON не обновляет изменения данных

avatar
mdash
8 августа 2021 в 15:42
314
2
0

Я пытаюсь динамически создавать страницы из одного файла JSON с помощью Gatsby без использования GraphQL.

Файл works.json выглядит следующим образом:

[
  {
    "title": "Client Name",
    "slug": "client-name",
    "abstract": "some description in here",
    "src": "img01",
    ...
  },
  {
    "title": "Client Name 2",
    "slug": "client-name-2",
    "abstract": "some description in here",
    "src": "img02",
    ...
  },
  ...
]

Затем я создал правильное действие для gatsby-node.js следующим образом:

exports.createPages = ({ actions: { createPage } }) => {
  const projects = require("./src/data/works.json")
  projects.forEach(project => {
    createPage({
      path: `/project/${project.id}`,
      component: require.resolve("./src/templates/project.js"),
      context: project,
    })
  })
}

Все работает довольно хорошо, и все данные отображаются в соответствии с тем, как я разработал шаблон за исключением того, что если я изменю любую строку в works.json, на отображаемой странице ничего не изменится.

Чтобы увидеть изменения, мне нужно убить gatsby development server, очистить .cache с помощью gatsby clean и перезапустить gatsby develop.

Я что-то делаю не так? Мне кажется странным, что createPages не работает динамически при изменении данных, так как Гэтсби обнаруживает изменение и сам обновляется...

Я использую gatsby: 2.25.3

Источник

Ответы (2)

avatar
Ferran Buireu
12 августа 2021 в 16:50
0

Все изменения в источниках данных требуют остановки и перезапуска сервера, поскольку Gatsby необходимо снова проанализировать и обработать данные (чтобы снова создать свои узлы), статические данные генерируются в каждом процессе build или develop, поэтому вам нужно будет запускать его каждый раз.

Однако вам может помочь функция Обновление содержимого. Гэтсби предоставляет переменную среды с именем ENABLE_GATSBY_REFRESH_ENDPOINT, которая однажды была установлена, изменив вашу команду разработки на:

"develop": "ENABLE_GATSBY_REFRESH_ENDPOINT=true gatsby develop",

Когда для переменной задано значение true, она предоставляет веб-перехватчик /__refresh, который может получать POST запросов на обновление исходного контента. Этот незащищенный веб-перехватчик может активироваться всякий раз, когда удаленные данные изменяются:

.
curl -X POST http://localhost:8000/__refresh

Вы можете автоматизировать это с помощью кнопки или любой другой реализации по вашему желанию.

avatar
LekoArts
9 августа 2021 в 05:44
0

Gatsby будет обновлять изменения, когда вы используете GraphQL, поскольку затем он может отслеживать вносимые вами изменения. Это предполагаемое использование Gatsby, и редко бывают причины не использовать GraphQL.

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

Подробнее о недостатках можно прочитать здесь: https://www.gatsbyjs.com/docs/creating-and-modifying-pages#trade-offs-of-querying-for-all-fields-in -the-context-object-of-gatsby-nodejs

mdash
9 августа 2021 в 07:12
0

Я не вижу причин, по которым ты не обновляешься. Даже если процесс, вероятно, дольше, почему я не вижу свои изменения в режиме разработки? Я должен изменить свой контекст? Мне нужно реорганизовать код?