Next.js 是一款非常流行的 React 框架,它在保持 React 一贯高效的同时,还具备数据预取和懒加载的特性。本文将介绍 Next.js 中的数据预取和懒加载的最佳实践,并附带详细的示例代码。
什么是数据预取?什么是懒加载?
在普通的 React 应用中,当用户访问一个动态页面时,数据往往是在组件渲染完成后再通过异步请求获取的。这种方式虽然简单,但用户体验、SEO 和性能等方面都存在一些缺陷。
数据预取能够解决这些问题,它是指在页面渲染之前就提前获取数据。一般而言,数据预取也分为两种方式:
- 服务器端渲染(Server Side Rendering,SSR):在服务端获取数据后,再将组件渲染成 HTML,最终将渲染好的 HTML 返回给客户端。
- 静态生成(Static Generation):在编译时即将所有可能用到的数据提前获取后,生成一个 HTML 静态文件,之后每次访问都可直接提供这个文件。
通常我们会针对每次访问都必定会用到的数据进行预取,而不会把一些需要特定点击后才会触发的数据提前获取。
懒加载则是指当组件可视范围进入浏览器视窗时,才开始加载组件的内容。这种方式能够提高网站的性能和速度,避免一开始就把所有的资源都加载,导致最终页面渲染特别慢。
Next.js 中的数据预取和懒加载
Next.js 中支持的两种数据预取方式,也就是数据获取方法,分别是 getStaticProps 和 getServerSideProps。前者是属于静态生成,后者则是属于服务器渲染,获取数据后通过 Props 传递到组件当中进行渲染。
getStaticProps
在使用 getStaticProps 时,我们需要在页面组件文件名的基础上添加一个与之对应的 .js
文件,如下所示:
-- -------------------- ---- ------- ------ - --------- - ---- ------------- -------- ----------- - ----- ------ - ----------- ----- - ------ ------- - - ----- -- ------------------- - ------ --------------------- - ------ - ----- ---------------- -------------------- ------ - - ------ ----- -------- ---------------- - ------ - ------ --- --------- ----- - - ------ ----- -------- ---------------- ------ -- - ----- --- - ----- ---------------------------------------------------------------- ----- ---- - ----- ---------- ------ - ------ - ------- - - - ------ ------- ----
上例中,我们首先导入 useRouter 和在函数内创建一个 Post 组件。然后判断当前路由是否处于回退模式中,如果是,则返回一个 Loading 文案。
getStaticPaths 和 getStaticProps 两个方法,构成了 Next.js 利用静态生成方式来预取数据的核心逻辑。其中,getStaticPaths 方法用于指定构建时需要生成哪些路由,而 getStaticProps 则是真正去请求数据的方法。
在 getStaticPaths 中,我们可以传入一些参数进行获取,同时还需要通过 fallback 字段告诉 Next.js 是否支持 SSR 模式下的 fallback。fallback 取值有三种,分别是:
- true: 当请求不存在的路由时,Next.js 可以在服务端渲染这个请求,然后再通过静态页面的方式存储一份到磁盘上。
- false: 当请求不存在的路由时,Next.js 可以直接返回 404。
- 'blocking': 当请求不存在的路由时,Next.js 可以在服务器渲染期间暂停页面渲染直到数据获取完成。
在 getStaticProps 中,我们可以像上例中一样,使用 fetch 或 axios 等工具来通过网络请求获取数据,并将获取到的数据通过 props 传入 Post 组件进行渲染。
getServerSideProps
相对于 getStaticProps,getServerSideProps 则是在服务器端对数据进行预取,并将数据通过 Props 传递进行渲染的一种方式。使用方法与 getStaticProps 区别不大,在此不再赘述。
Next.js 中的懒加载
我们可以通过使用 React.lazy 和 Suspense 两个内置功能来实现 Next.js 的懒加载。 示例代码如下:
-- -------------------- ---- ------- ------ ------ - ----- -------- - ---- ------- ----- ---------------- - ------- -- ------------------------------------- -------- ------------- - ------ - ----- --------- --------------------------------- ----------------- -- ----------- ------ - - ------ ------- -----------
在上例中,首先我们先引入了 React.lazy 和 Suspense。然后,我们在组件 MyComponent 中通过 lazy 的方式引入了一个组件 component.js。最后,在 Suspense 标签中将引入的组件用于渲染,并在 fallback 中指定加载时的提示。
总结
通过以上的示例代码,我们可以看到 Next.js 中数据预取和懒加载的实现方式,以及如何将其与 React.lazy 和 Suspense 等 React 内置功能结合实现懒加载。 Next.js 的这些优质功能让前端工程师在实现高效动态页面时更加高效,提高了开发体验和用户体验,非常值得开发者进行尝试。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a6220d48841e98942ac0dd