面试题答案
一键面试优化思路
-
代码拆分:
- 使用动态导入(
import()
)来实现路由组件的懒加载。在 SvelteKit 中,路由文件默认会被打包到主 bundle 中,通过懒加载可以将这些路由组件拆分出来,只有在需要的时候才加载。例如,对于一个嵌套路由src/routes/products/[productId]/+page.svelte
,可以将其组件进行懒加载。在src/routes/products/[productId]/+layout.js
中:
export const load = async () => { const { default: ProductPage } = await import('./+page.svelte'); return { component: ProductPage }; };
- 使用动态导入(
-
缓存数据:
- 在加载数据时,利用 SvelteKit 的
load
函数的缓存机制。如果相同的数据在不同的路由加载中需要,SvelteKit 会自动缓存这些数据,避免重复请求。例如,假设在多个嵌套路由中都需要获取用户信息,可以在顶层路由的load
函数中获取用户信息:
// src/routes/+layout.js export const load = async () => { const user = await fetch('/api/user').then(res => res.json()); return { user }; };
然后在嵌套路由中可以直接使用这个缓存的
user
数据,而不需要再次请求。 - 在加载数据时,利用 SvelteKit 的
-
避免不必要的重渲染:
- 使用
$$restProps
来避免传递不必要的 props 导致子组件重渲染。例如,在父组件向嵌套路由组件传递 props 时,如果有些 props 对于子组件来说并不影响其渲染逻辑,可以将这些 props 放在$$restProps
中。
<!-- src/routes/products/+layout.svelte --> <script> export let data; const { user, ...rest } = data; </script> <svelte:component this={data.component} {$$restProps: rest} />
- 同时,在子组件中使用
$: derived
来创建响应式数据,只在真正依赖的数据变化时才更新组件。例如,在src/routes/products/[productId]/+page.svelte
中:
<script> import { derived } from'svelte/store'; export let data; const product = data.product; const productPrice = derived(product, $product => $product.price * 1.1); </script> <p>Product price with tax: {productPrice}</p>
- 使用
-
路由预取:
- 在适当的地方使用 SvelteKit 的预取功能。例如,可以在用户悬停在导航链接上时,预取对应的路由数据。在
src/routes/+layout.svelte
中:
<script> import { prefetch } from '@sveltejs/kit'; let isHovering = false; const handleHover = () => { isHovering = true; prefetch('/products'); }; const handleLeave = () => { isHovering = false; }; </script> <a href="/products" on:mouseenter={handleHover} on:mouseleave={handleLeave}>Products</a>
这样当用户真正点击进入
/products
路由时,数据已经预取好,加载速度会更快。 - 在适当的地方使用 SvelteKit 的预取功能。例如,可以在用户悬停在导航链接上时,预取对应的路由数据。在