面试题答案
一键面试1. 预加载策略
- 静态资源预加载:利用
<link rel="preload">
标签在页面加载时提前加载一些关键资源,如图片、字体等。例如,在页面头部添加<link rel="preload" href="/path/to/image.jpg" as="image">
,这样当用户导航到需要该图片的页面时,加载速度会更快。理由是浏览器可以在空闲时间提前获取资源,减少导航后的等待时间。 - 路由预加载:在 Next.js 中,可以使用
next/router
的prefetch
方法。比如在父组件中,当用户进行某些操作(如鼠标悬停在 Link 上)时,可以调用router.prefetch('/parent/child/grandchild')
来提前加载目标路由的代码。这是因为预加载可以将目标路由相关的代码提前下载到本地,当用户真正点击 Link 进行导航时,能够快速渲染页面,提升用户体验。
2. 代码分割
- 动态导入:在 Next.js 中,页面默认是基于路由进行代码分割的。对于复杂嵌套路由,可以进一步对页面内的组件进行动态导入。例如,如果
grandchild
页面有一些大型组件,可以使用动态导入const BigComponent = dynamic(() => import('./BigComponent'))
。这样在grandchild
页面加载时,只有核心代码会被加载,大型组件的代码会在需要渲染该组件时才加载,减少初始加载的代码量,提高导航性能。理由是避免一次性加载过多不必要的代码,加快页面初始渲染速度。 - 按路由段分割:对于多层嵌套路由,可以按照路由段进行更细粒度的代码分割。比如
/parent
、/parent/child
、/parent/child/grandchild
可以分别打包成不同的代码块。Next.js 本身在一定程度上支持这种分割,但可以通过配置进一步优化。这样每个路由段只有在需要时才加载,提高导航效率,因为每次导航只需要加载相关路由段的代码,而不是整个应用的代码。
3. 其他优化
- 减少不必要的重新渲染:确保 Link 组件及其父组件在导航时不会进行不必要的重新渲染。可以使用
React.memo
包裹组件,例如const MyLink = React.memo(({ href, children }) => <Link href={href}>{children}</Link>)
。这样当 Link 的 props 没有变化时,组件不会重新渲染,提高性能。理由是减少不必要的渲染开销,特别是在频繁导航时。 - 优化 CSS:对于嵌套路由对应的页面,确保 CSS 是按需加载和优化的。可以使用 CSS Modules 或类似的方案,避免全局 CSS 导致的样式冲突和不必要的加载。例如,每个页面的 CSS 只包含该页面所需的样式,减少样式文件的大小,提高加载速度。因为加载更少的 CSS 可以减少渲染阻塞,加快页面显示。