Timeless
花开成景,花落成诗
在需要首屏渲染速度优化的场景下,大家或多或少都听到过服务端同构渲染,本站也使用到了,仅以此文记录下当时查阅的资料。
在需要首屏渲染速度优化的场景下,大家或多或少都听到过服务端同构渲染,本站也使用到了,仅以此文记录下当时查阅的资料。
首先看下web页面渲染的历史:服务端渲染 -> 客户端渲染 -> 服务端同构渲染(Server Side Render)
其实早期的 Web页面渲染都是在服务端进行的,服务端渲染步骤:
以JSP开发技术为例:

然而,在网页越来越复杂的情况下,这种方式存在很多不足:
说到渲染方式,我们普遍使用最多的就是基于客户端渲染的前端框架,例如 Angular,React,Vue 等。使用它们开发 SPA 单页面应用时,具有如下优缺点:
优点
缺点
首先什么是同构?:一套代码运行在Node服务端又运行在客户端。
服务端同构渲染 SSR (Server-Side Rendering),是指在服务端完成页面的html 拼接处理, 然后再发送给浏览器,将不具有交互能力的html结构绑定事件和状态,在客户端展示为具有完整交互能力的应用程序。

基于React、Vue等框架,客户端渲染 和 服务器端渲染 的结合,核心解决 SEO 和 首屏渲染 慢的问题。
不过也要注意几个问题
beforeCreate和created,操作DOM、Window、Document对象或者使用三方 API 时必须保证运行不报错。目前前端流行的三种技术栈 React, Vue 和 Angular ,已经孵化出对应的服务端渲染框架,开箱即用。
React: Next.js
Vue: Nuxt.js
Angular: Nest.js
拿本站为例,使用的是Nuxt.js,作为Node.js中间件使用Renderer处理和服务所有 SSR 和资源请求,开发环境先Builder然后再渲染,生产环境直接使用nuxt build构建好的资源进行渲染。
const { Nuxt, Builder } = require('nuxt');
module.exports = options => {
const config = require('config/nuxt.front.js'));
config.dev = options.isDev;
const nuxt = new Nuxt(config);
if (options.isDev) {
new Builder(nuxt).build();
}
const middleware = async(ctx, next) => {
// Default 404
ctx.status = options.status || 200;
ctx.req.session = await ctx.session();
await nuxt.render(ctx.req, ctx.res);
let err = null;
return next().catch(e => {
err = e;
}).then(() => {
if (err) {
return Promise.reject(err);
}
// 如果后续执行逻辑有错误,则将错误返回
return new Promise((resolve, reject) => {
return { resolve, reject };
});
});
};
return middleware;
};
具体参考:Node.js从零开发博客(一)框架搭建
Power by Node.js + Nuxt.js,由 腾讯云提供服务, 已经稳稳地存活了 8年95天
Copyright © 2018 - 2026 Timeless. All rights reserved.桂ICP备18003656号-1桂公网安备45092102000147号
评论