Я уже некоторое время работаю над проектом SvelteKit. Всегда возникала проблема: если я перезагружаю маршрут, отличный от домашней страницы, я получаю ошибку 500. Я новичок в веб-разработке.
Итак, я просматриваю все поисковые запросы, которые приходят мне в голову, например, «SvelteKit прерывается при перезагрузке». В конце концов я наткнулся на эту [ветку GitHub][1], которая наиболее близка к людям, выражающим подобную проблему, из всех, что я видел.
Я обнаружил, что перезагрузка не обязательно является виновником. Если я перейду на определенную страницу вручную, введя URL-адрес, я получу ту же ошибку. Мне также не удалось найти темы, обсуждающие это.
Логично, что это происходит на бумаге. Страницы не существуют, пока кто-то не перейдет к ним с помощью маршрутизатора. Маршрутизатор монтирует страницу, а функция onMount
во всех связанных компонентах создает страницу на месте на стороне клиента. Я это понимаю. В настоящее время это приложение является чисто клиентским и использует клиентские объекты, такие как localStorage, поэтому такие серверные функции, как load
, мне не помогли, поскольку они не могут получить доступ к localStorage.
Последней каплей для меня стало то, что я понял, что если я буду входить и выходить из одного и того же маршрута, некоторые данные будут сохраняться в фоновом режиме через объекты истории, которые медленно искажают поведение страницы.
Мой вопрос: как мне заставить SvelteKit перезагрузить эти страницы, не устраивая при этом истерик?
Я сам опубликовал ответ, так как работал над решением. Он еще не принят, потому что я не могу принять свой ответ уже 2 дня, но в основном он правильный. Я попытался выловить сообщение об ошибке, но точная ошибка была очень противоречивой. На ранних этапах разработки сообщение о смерти всегда было window is not defined
, но мне удалось сузить проблемные компоненты и избежать ошибки или выдать ошибку с лучшим сообщением.
Вот краткое изложение результатов для ясности:
+page.server.js
рядом с +page.svelte
, который реализует функцию load
. Учебник по загрузке данных страницы на Learn.svelte.devif (browser)
перед кодом, использующим данные из браузера. Это может включать window
, localStorage
и другие. Я не уверен, где найти полный список этих свойств, но localStorage
— это свойство окна, поэтому вполне логично, что оба свойства пропадут одновременно.При вводе здесь моего вопроса StackOverflow показал мне аналогичные ошибки:
Я не видел этих тем раньше, потому что они не появлялись в моих результатах поиска, только когда я набирал этот вопрос и вводил заголовок, чтобы получить рекомендации StackOverflow. Спасибо StackOverflow!
После выполнения большого количества вызовов if (browser)
мне удалось правильно перезагрузить один из моих маршрутов. Проведение этого для каждого маршрута должно занять очень много времени. Но я думаю, это моя текущая директива. У него очень неуклюжая последовательность перезагрузки, которая на самом деле выглядит очень многообещающе для забывания любых данных, которые SvelteKit решил сохранить, хотя я еще не проверял это на предмет проблемы повреждения.
Проблема остается в том, что я понятия не имею, что происходит. Это не проблема моего проекта, и похоже, что утверждения if (browser)
были правильным решением. Я все равно собираюсь опубликовать эту тему, потому что думаю, что она намного более понятна, чем существующие темы.
Остается вопрос, как SvelteKit понимает автоматическую перезагрузку страницы, когда он сталкивается с достаточным количеством операторов if. Круто, но странно.
Что такое сообщение об ошибке?