Как правильно сбросить Router cache в Nextjs 14

Фреймворк - Nextjs 14 (app dir) Я пишу приложение полностью на ssr.

Логика работы приложения: На странице (page) я получаю данные из server action (там вызывается фетч с куками для заголовков и просто возвращает данные) и опускаю эти данные через пропсы на клиентский компонент для дальнейшей работы с ними. Сам RSC установлен как force-dynamic.

Пример: На странице я получаю список статей, опускаю их на клиент и отрисовываю. На клиенте есть кнопка «добавить статью» которая редиректит меня на страницу для создания статьи. После заполнения данных и подтверждения вызывается server action внутри которого выполняется fetch с сохранением и после этого меня возвращает на первую страницу.

Проблема: Я не понимаю как правильно обновить кеш начальной страницы после добавления статьи на другой странице. Т.е. я просто не понимаю логику того, как это должно работать. Изначально я ставил router.refresh в useEffect->return,[] и это работало, но вызывать рефреш страницы при каждом анмаунте мне кажется не правильным подходом, т.к. страница рефрешится не только после изменений, а при каждом выходе из нее (а это раздражает, ведь из за router.refresh() прыгают шрифты на секунду). Далее я попытался делать рефреш на странице добавления статьи перед редиректом и это тоже работало и вообще не понятно почему. В документации указано что рефреш обновляет только текущий роут, коим является на данный момент страница создания статьи. Была так же попытка использовать revalidatePath в server action после выполнения fetch запроса. И это тоже работает при чем вообще не важно что я укажу в этой функции. RevalidatePath принимает url, от чего я ожидаю что именно этот урл он и сбросит, но нет. Я могу указать там хоть пустую строку и он всеравно будет каким то образом рефрешить, даже если указать несуществующий урл.

Вопрос: От этого всего у меня полнейший диссонанс, я не могу быть уверен в стабильности ни одного из выше перечисленных решений, т.к. я не понимаю логику их работы. Я бы хотел узнать как мне ПРАВИЛЬНО сбрасывать кеш в данном случае? Если не использовать ничего из выше перечисленного, то данные на странице будут кешироваться 30 секунд, что для меня катастрофично.

Код server action

'use server';

export const fetchArticles = async (): Promise<ArticlesResp> => {
 const { data } = await protectedFetch(`url`);
 return data;
};

Код главной страницы

async function Page() {
  const articles = await fetchArticles();

  return (
    <section className="grid-default flex flex-col pt-14 font-body">
      <div className="my-6">
        <ArticlesModule articles={articles} />
      </div>
    </section>
  );
}

export const dynamic = 'force-dynamic';
export default Page;

Код главного клиентского компонента

'use client';

function ArticlesModule({ articles = [] }) {
  const router = useRouter();

  useEffect(
    () => () => {
      router.refresh();
    },
    [],
  );

  return (
    <div className="flex flex-col gap-y-10">
     <div>
       {articles.map(({id, name) => (<div key={id}>{name}</div>)
     </div>
      <button onClick={() => router.push('/addArtice')}>Добавить статью</button>
    </div>
  );
}

export { ArticlesModule };

Код клиентского компонента для создания статьи

'use client';

function CreateArticlesModule() {
  const router = useRouter();

  cosnt handleSave = async () => {
    const resp = await fetchSaveArticle();
    // Возвращаем обратно на главную страницу
    if (resp.ok) router.push('/');
  }
  
  return (
    <div className="flex flex-col gap-y-10">
      <button onClick={handleSave}>Сохранить</button>
    </div>
  );
}

Код приведен примерный, т.к. разбора кода не нужно, мне необходимо только понять в какой момент, где, и как правильно очистить router cache.


Ответы (0 шт):