我试图了解 SvelteKit 如何在不同的场景中呈现我的网络应用程序,我对 load()
有点困惑。
我创建了一个带有加载函数的页面,该函数调用外部 API 并将响应用作组件的 prop。在 .svelte-kit/output/prerendered/pages/mypage.html
中,我可以看到它在构建步骤中获取了数据,并使用响应预渲染了我的 html。
然后,当我在我的网络应用程序中导航到该页面时,网络选项卡告诉我它在呈现它之前调用了外部 API。那么,预渲染的意义何在?
SvelteKit 文档说:
A component that defines a page or a layout can export a load function that runs before the component is created. This function runs both during server-side rendering and in the client, and allows you to fetch and manipulate data before the page is rendered, thus preventing loading spinners.
我不明白这个。如果我每次导航到页面时都调用 API,我该如何防止加载微调器?什么时候应该使用预呈现的 html?
在客户端和服务器中呈现的整个概念对我来说没有意义。在我看来,如果数据是静态的,我想在服务器上预呈现,但如果它发生变化,那么我想在每次访问该页面时调用 API(可能使用缓存)。但我为什么要两者都做?
最佳答案
But why would I want to do both?
因为服务器端渲染在第一次加载时往往更快。
当用户直接访问站点时,服务器端呈现的版本在某些条件下会更快地显示内容,例如如果呈现页面更复杂,则在慢速网络或动力不足的硬件上。
完全预渲染的版本甚至更快,因为甚至服务器都不必执行任何渲染或等待请求。
在直接访问预渲染路由时首次加载时,您将获得预渲染页面,其中包含在构建期间请求的数据。但是 load
被设计为同时在客户端和服务器上运行,因此无论页面是否预呈现,它都会运行。
这意味着您可以在直接加载页面时快速获取陈旧数据,而在客户端导航到页面时获取速度较慢但新鲜的数据。
我认为对于真正的静态页面,您想要使用的不是页面load
,而是GET
endpoint。或服务器加载函数(在 +page.server.ts/js
中),它只会在服务器上运行,因此对于预渲染页面,它只会在构建期间运行一次。
关于svelte - 应该如何使用 load(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73234052/