这是我参与「第五届青训营」伴学笔记创作活动的第11天。
一、本堂课重点内容
本节课的重点介绍了Next.js实战项目开发的知识,并希望能够通过学习具备开发C端WEB应用开发的能力。(其中C端指面向所有用户、B端指面向内网用户)
二、详细知识点介绍
CSR、SSR、SSG
CSR
客户端渲染(Client- Side Rendering)。常见B端WEB应用开发模式,前后端分离,服务器压力相对更轻,渲染工作在客户端进行,服务器直接返回不加工的HTML用户在后续访问操作——B端应用,服务器响应时不返回body具体内容。
SSR
- SSR(Server- Side Rendering)。服务器端渲染,这种模式下Java, PHP负责渲染的逻辑,而前端只负责UI和交互,代码耦合度高,且模板语言中混杂编程语言对于一些复杂的功能,维护起来很痛苦。
- 同构SSR:前后端一体化,一套React代码在服务器上运行一遍,到达浏览器又运行一遍。前端后端都要参与渲染,而且首次渲染出的HTML要一样。
SSG
静态站点生成(Static Site Generation), 在构建的时候直接把结果页面输出html到磁盘,每次访问直接把html返回给客户端,相当于一个静态资源。
SSR, SSG的优势-利于SEO
更短的首屏时间:SSR / SSG只需要请求一个HTML文件就能展现出页面(不需要请求所有文件),虽然在服务器上会调取接口,但服务器之间的通信要远比客户端快,甚至是同一台服务器上的本地接口调取。因为不再需要请求大量js文件,这就使得SSR / SSG可以拥有更短的首屏时间。
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