组件的动态导入
接下来,让我们关注那些不需要在初始页面加载时使用的 React 组件。
React 组件同样可以通过动态导入方式加载,但这里我们需要结合 next/dynamic
使用,以确保它能像普通 React 组件一样工作。
我们将使用这种方法来延迟加载包含 Hello World
代码示例的模态框。通过这种方式,我们还能从初始页面加载中移除另外两个第三方库。
打开 pages/index.js
文件,在文件开头添加从 next/dynamic
导入 dynamic
的语句:
import dynamic from 'next/dynamic';
同时删除这行代码:
import CodeSampleModal from '../components/CodeSampleModal';
现在可以通过以下方式将其作为动态组件导入(添加在文件开头):
const CodeSampleModal = dynamic(() => import('../components/CodeSampleModal'), {
ssr: false,
});
CodeSampleModal
将成为 ../components/CodeSampleModal
返回的默认组件。它的行为与常规 React 组件一致,可以像往常一样向其传递 props。
由于我们不需要在服务端渲染该组件,我们使用 ssr: false
来禁用它。
接下来,我们希望延迟加载该组件,直到用户需要时才加载。为此,我们可以将组件包裹在条件判断中,检查模态框是否应该打开,如果是则加载该组件。
按如下方式包裹 CodeSampleModal
组件:
{
isModalOpen && (
<CodeSampleModal
isOpen={isModalOpen}
closeModal={() => setIsModalOpen(false)}
/>
);
}
现在,当 isModalOpen
首次被切换为 true
时,才会请求所需的 JavaScript 资源。
经过这些优化后,核心性能指标应该会有所改善。让我们在 Chrome DevTools 中再次运行 Lighthouse 报告来验证。
现在只剩下两个优化建议:
- 使用 HTTP2:要解决这个问题,我们可以部署到支持 HTTP2 的平台(例如 Vercel)。
- 图片元素没有明确的
width
和height
属性:这实际上是 Lighthouse 的一个 bug,不会影响网站性能。
延伸阅读
- Next.js: 动态导入文档