面试题答案
一键面试预取策略优化性能
- 使用
<link rel="prefetch">
- 在Qwik应用中,可以在HTML的
<head>
部分手动添加<link rel="prefetch">
标签来预取资源。例如,如果知道用户很可能从当前页面导航到/about
页面,并且该页面依赖于about.js
脚本,可以这样写:
<link rel="prefetch" href="/about.js">
- Qwik框架也可能提供一些机制来自动化这个过程,比如根据路由配置来动态生成预取标签。在路由配置文件(假设是
routes.js
)中,可以定义当访问某个路由时预取相关资源。例如:
import { defineRoutes } from '@builder.io/qwik-city'; export default defineRoutes([ { path: '/', component: () => import('./HomePage'), prefetch: () => import('./HomePageAssets.js') }, { path: '/about', component: () => import('./AboutPage'), prefetch: () => import('./AboutPageAssets.js') } ]);
- 在Qwik应用中,可以在HTML的
- JavaScript 动态预取
- 可以使用
window.fetch
结合PriorityHints
来进行动态预取。例如,当用户悬停在某个导航链接上时,可以触发预取操作:
const navLink = document.getElementById('about - link'); navLink.addEventListener('mouseenter', () => { fetch('/about - page - data.json', { priority: 'high' }); });
- 可以使用
预渲染策略优化性能
- 服务器端预渲染(SSR)
- 在Qwik应用中,利用服务器端预渲染可以在服务器将HTML发送到客户端之前就渲染好页面。Qwik - City提供了SSR支持。首先,确保在项目中正确配置了SSR,例如在
vite.config.ts
中:
import { qwikCity } from '@builder.io/qwik - city/vite'; import { defineConfig } from 'vite'; export default defineConfig(() => { return { plugins: [qwikCity()], ssr: { noExternal: ['@builder.io/qwik - city'] } }; });
- 对于导航场景,当用户请求某个页面时,服务器会预渲染该页面及其依赖的组件,使得客户端收到的是已经部分渲染好的HTML,减少首次渲染时间。
- 在Qwik应用中,利用服务器端预渲染可以在服务器将HTML发送到客户端之前就渲染好页面。Qwik - City提供了SSR支持。首先,确保在项目中正确配置了SSR,例如在
- 静态站点生成(SSG)
- 如果应用的部分页面内容变化不频繁,可以采用静态站点生成。在Qwik中,可以使用
qwik - build
命令生成静态HTML文件。例如,对于博客页面,可以在构建时生成每个文章页面的静态HTML。这对于导航到这些静态页面时,能直接提供渲染好的内容,提升性能。
- 如果应用的部分页面内容变化不频繁,可以采用静态站点生成。在Qwik中,可以使用
根据用户行为配置预加载资源
- 基于导航历史
- 分析用户的导航历史记录,如果发现用户经常从
/products
页面导航到/product - details/:id
页面,可以在/products
页面预取/product - details
页面所需的通用资源,如样式表、基础脚本等。可以通过在客户端存储用户导航历史(例如使用localStorage
),然后在页面加载时根据历史记录决定预取哪些资源。
- 分析用户的导航历史记录,如果发现用户经常从
- 基于用户角色
- 如果应用有不同的用户角色(如管理员、普通用户),不同角色可能会访问不同的页面。例如,管理员可能经常访问
/admin/dashboard
,而普通用户不会。可以根据用户登录时确定的角色,在用户登录成功后预取对应角色可能访问页面的资源。
- 如果应用有不同的用户角色(如管理员、普通用户),不同角色可能会访问不同的页面。例如,管理员可能经常访问
根据页面结构配置预加载资源
- 父子页面关系
- 如果有一个父页面
/parent
包含多个子页面/parent/child1
,/parent/child2
等。在/parent
页面加载时,可以预取子页面可能共享的资源,如公共样式、部分脚本。例如,如果子页面都使用同一个图表库,可以在父页面预取该图表库的脚本:
<link rel="prefetch" href="/chart - library.js">
- 如果有一个父页面
- 页面依赖关系
- 分析页面的依赖,例如一个页面依赖于某个API获取数据,并且该API请求开销较大。可以在页面加载时预取该API数据。假设页面需要从
/api/products
获取产品列表,可以在页面加载时:
const prefetchProducts = async () => { const response = await fetch('/api/products'); const data = await response.json(); // 这里可以存储数据供后续使用 }; prefetchProducts();
- 分析页面的依赖,例如一个页面依赖于某个API获取数据,并且该API请求开销较大。可以在页面加载时预取该API数据。假设页面需要从