[ Next.js开发 | 青训营笔记 ]

102 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第11天。

一、本堂课重点内容

本节课的重点介绍了Next.js实战项目开发的知识,并希望能够通过学习具备开发C端WEB应用开发的能力。(其中C端指面向所有用户、B端指面向内网用户)

二、详细知识点介绍

CSR、SSR、SSG

CSR

客户端渲染(Client- Side Rendering)。常见B端WEB应用开发模式,前后端分离,服务器压力相对更轻,渲染工作在客户端进行,服务器直接返回不加工的HTML用户在后续访问操作——B端应用,服务器响应时不返回body具体内容。 image.png

SSR

  • SSR(Server- Side Rendering)。服务器端渲染,这种模式下Java, PHP负责渲染的逻辑,而前端只负责UI和交互,代码耦合度高,且模板语言中混杂编程语言对于一些复杂的功能,维护起来很痛苦。
  • 同构SSR:前后端一体化,一套React代码在服务器上运行一遍,到达浏览器又运行一遍。前端后端都要参与渲染,而且首次渲染出的HTML要一样。 image.png

SSG

静态站点生成(Static Site Generation), 在构建的时候直接把结果页面输出html到磁盘,每次访问直接把html返回给客户端,相当于一个静态资源。 image.png

SSR, SSG的优势-利于SEO

更短的首屏时间:SSR / SSG只需要请求一个HTML文件就能展现出页面(不需要请求所有文件),虽然在服务器上会调取接口,但服务器之间的通信要远比客户端快,甚至是同一台服务器上的本地接口调取。因为不再需要请求大量js文件,这就使得SSR / SSG可以拥有更短的首屏时间。 image.png

Next.js的定义

  • Next.js是一个构建于Node.js之上的开源Web开发框架,支持基于React的Web应用程序功能,例如服务端渲染和生成静态网站。
  • 上手快,能力集全,而且覆盖了足够多的性能优化和生态。对于新同学掌握前后端一体化的开发模式很友好。

三、实践练习例子

尝试将项目在服务器部署

const Koa = require('koa')
const next = require('next')
const Router = require('koa-router')
 
const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
 
app.prepare()
  .then(() => {
    const server = new Koa()
    const router = new Router()
    router.get('/', async ctx => {
      await app.render(ctx.req, ctx.res, '/', ctx.query)
      ctx.respond = false
    })
    router.get('/about', async ctx => {
      await app.render(ctx.req, ctx.res, '/about', ctx.query)
      ctx.respond = false
    })
    router.get('/products/:id', async ctx => {
      const {id} = ctx.params
      await app.render(ctx.req, ctx.res, `/products/${id}`, ctx.query)
      ctx.respond = false
    })
    router.get('/case', async ctx => {
      await app.render(ctx.req, ctx.res, '/case', ctx.query)
      ctx.respond = false
    })
    router.get('/contact', async ctx => {
      await app.render(ctx.req, ctx.res, '/contact', ctx.query)
      ctx.respond = false
    })
    router.get('/view/:type/:id', async ctx => {
      const {id, type} = ctx.params
      await app.render(ctx.req, ctx.res, `/view`, {id, type})
      ctx.respond = false
    })
    server.use(async (ctx, next) => {
      ctx.res.statusCode = 200
      await next()
    })
    server.use(router.routes())
    server.listen(port, () => {
      console.log(`> Ready on http://localhost:${port}`)
    })
  })
 

四、引用参考

菜鸟教程、csdn