Next.js学习笔记 | 青训营笔记

126 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天。Next.js是基于React的一个轻量级框架,能够实现服务端渲染和生成静态网站。

什么是CSR、SSR、SSG?

  • CSR——客户端渲染(Clinet-Side Rendering)。前后端分离,服务器压力较小,渲染在客户端进行。
  • SSR——服务器端渲染(Server-Side Rendering)。在浏览器中生成和操作DOM,将服务器端的响应返回给客户端。
  • SSG——静态站点生成(Static Site Generation)。在构建时将结果页面输出html到磁盘,每次访问将html返回给客户端,相当于一个静态资源。相较于SSR减轻了服务器daunt的压力,但每个用户访问的页面都相同。

SSR :渲染在服务器端完成,且代码耦合度较高,后续代码维护会比较麻烦

课程中提到脱水和注水的概念:在服务器端返回给模板页面的数据不匹配,如果要保持服务器端和页面数据的一致,会有脱水注水 的过程。

数据注入

  • getServerSideProps:SSR,区别于getInitialProps即使使用router跳转当前页,也只会在服务端执行逻辑
export const getserverSideProps = async (context) =>{
    const { articleId } = context.query;
    const { data } = await axios.get(` ${LOCALDOMAIN}/api/articleInfo`, {
        params : {articleId,
        },
});
return {
    props: data,//需要拿props包裹;
};

  • getStaticProps:SSG,在服务器端构建时执行。若使用router跳转当前页,会在客户端执行逻辑。

  • getInitialProps:在服务器端执行,只在页面层面进行绑定,采用同构,首次渲染服务器端渲染,路由跳转使用客户端路由。

Article-getInitialProps = async (context) =>{
    const { article1d } = context.query;
    const { data } = await axios.get(` ${LOCALDOMAIN}/api/articleInfo`, {
        params: {
            articleId,
        },
});
return data;
};
  • 客户端注入

Next.js客户端开发

创建好项目之后,可以引入布局Layout,实现每页的共享布局,例如,导航栏和页脚部分。

image.png

以首页为例,首页内容中的顶部(综合&关注)一栏也可以使用共享布局,但是按照官方文档给的方案并不能解决这个问题(没有固定在首页子DOM元素的顶部)。 image.png 原本是想在子页面中引入组件,但是太过繁琐,感觉代码复用比较高。 image.png

分析后发现,自己的需求就是每个页面布局,定义getLayout函数将children传递到对应的页面即可。

//_app.tsx
export type NextPageWithLayout = NextPage & {
  getLayout?: (page: React.ReactElement) => React.ReactNode
}

type AppPropsWithLayout = AppProps & {
  Component: NextPageWithLayout
}

export default function MyApp({ Component, pageProps }: AppPropsWithLayout) {
  const getLayout = Component.getLayout ?? ((page) => page)
  console.log(Component.getLayout, '2222')
  return <Layout>{getLayout(<Component {...pageProps} />)}</Layout>
}

//Home.tsx
Home.getLayout = function getLayout(page: React.ReactElement) {
  return <div>{page}</div>;
};

实现后的效果。 image.png

  • 样式部分与一般差异不大,需要注意的是样式有全局样式以及组件级别的样式。
  • 路由,在官方文档介绍的比较详细。

总结

Next作为SSR渲染有其独特的优势,对于初学者比较友好,也是基于React的框架。对于自己来说,因为是初学React有比较多的知识点不能串联起来,文章中的问题也是花了比较长的时间去解决,还是需要多练才能了解的更深刻。