Sapper перезагружает страницу [slug] без html, только json на странице

Новичок в Sapper и Svelte использовал другие фреймворки.

Я создал сайт автора в sapper, который перечисляет книги автора на главной странице, а затем страницу конкретной книги, на которую ссылаются элементы книги - страница книги находится в books/[slug].sveltebooks/[slug].js на стороне сервера).

Переход на страницу книги по ссылке (расположенной в другом компоненте) отображается отлично - никаких проблем.

Если я перезагружу или введу URL-адрес книги напрямую, html не будет: на странице отображается json для элемента книги. Инспектор показывает только тег pre, заполненный json.

Сайт создан по образцу демонстрационного сайта, созданного из шаблона накопительного пакета данных (и измененного на его основе).

Есть идеи, что здесь происходит? Интересно, что мне не хватает?

Мысли оценены. При необходимости я могу предоставить более подробную информацию и репозиторий на github.


person rickb    schedule 13.12.2020    source источник


Ответы (1)


Проблема в том, что у вас есть перекрывающиеся маршруты - ваш маршрут API и ваша страница находятся в / books / slug-go-here. Когда вы перемещаетесь на стороне клиента, Sapper заменяет новый компонент Svelte и ничего не запрашивает с сервера. Когда вы идете туда напрямую, браузер запрашивает / books / slug-go-here и получает JSON от вашего API.

Чтобы исправить это, вы должны переименовать свой серверный маршрут в [slug].json.js и загрузить /books/slug-goes-here.json в свой компонент. Таким образом, у вас есть два разных маршрута: / books / slug-go-here возвращает HTML-страницу, а /books/slug-goes-here.json возвращает данные JSON для этой страницы.

<!-- [slug].svelte -->
<script context="module">
    export async function preload({ params }) {
        // this is the component located at books/[slug]
        // it requests books/[slug].json to get its data
        const res = await this.fetch(`books/${params.slug}.json`);
        const data = await res.json();

        // etc
    }
</script>
person Geoff Rich    schedule 13.12.2020
comment
Woohoo !! Это сработало. Я видел это наименование в примере, и оно не совсем щелкнуло. Спасибо. - person rickb; 14.12.2020
comment
Собственно, у меня есть еще один вопрос: допустим, мне нужен файл .js сервера, параллельный корневому файлу /src/routes/index.svelte. Предположительно, это будет называться /src/routes/index.json.js, верно? Я пробую это, но мне кажется, что я не могу сослаться на это из файла index.svelte - я пробовал fetch('json'), fetch('/json'), fetch('json.js') и т. Д., Но он всегда возвращает «404». Есть ли способ сделать это? Мое текущее решение заключалось в том, чтобы переместить файл .js в папку «книги», а затем я могу ссылаться на него как на books.json. Это работает, но не кажется оптимальным. - person rickb; 14.12.2020
comment
Ой - неважно. Я понял: fetch('index.json'). Вперед. - person rickb; 14.12.2020