SSR解决了什么问题?如何实现SSR?

112 阅读2分钟

SSR 即服务器端渲染(Server-Side Rendering),主要解决了以下几个方面的问题:

  • 首屏加载速度慢:传统的前端渲染需要先加载 HTML 骨架,再加载 JavaScript 文件,然后通过 JavaScript 渲染页面内容,这导致首屏加载时间较长。SSR 可以在服务器端直接生成完整的 HTML 页面,发送给客户端,减少了客户端渲染的时间,提高了首屏加载速度,提升用户体验。

  • SEO 优化:搜索引擎爬虫在抓取网页内容时,对于 JavaScript 动态渲染的页面可能无法很好地解析和获取内容,导致页面在搜索引擎中的排名较低。SSR 生成的是包含完整内容的 HTML 页面,便于搜索引擎爬虫抓取和索引,有利于提高网站的 SEO 性能。

  • 交互体验问题:在一些网络环境较差的情况下,前端渲染可能会出现长时间的白屏等待,用户无法进行任何交互。SSR 可以让用户更快地看到页面的基本内容,即使在 JavaScript 尚未完全加载和执行的情况下,也能有较好的视觉反馈,提升了交互体验。

以下是一个使用 Vue.js 和 Express 实现 SSR 的简单示例:

  1. 创建项目和安装依赖

    • 首先创建一个新的项目目录,初始化package.json文件。
    • 安装expressvuevue-server-renderer等依赖。
  2. 创建 Express 服务器

javascript

const express = require('express');
const app = express();
const port = 3000;

// 处理静态资源
app.use(express.static('public'));

// 渲染页面的路由
app.get('*', (req, res) => {
    // 这里后续将添加SSR的渲染逻辑
    res.send('Hello World');
});

app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});
  1. 创建 Vue 应用

    • 在项目中创建src目录,在其中创建main.js文件,用于创建 Vue 实例。

javascript

import Vue from 'vue';
import App from './App.vue';

// 创建Vue实例
export function createApp() {
    return new Vue({
        render: h => h(App)
    });
}
  1. 创建服务器端渲染逻辑

javascript

const { createRenderer } = require('vue-server-renderer');
const { createApp } = require('./src/main.js');

// 创建渲染器
const renderer = createRenderer();

app.get('*', async (req, res) => {
    try {
        // 创建Vue应用实例
        const app = createApp();
        // 将Vue应用渲染为HTML
        const html = await renderer.renderToString(app);
        // 返回渲染后的HTML
        res.send(`
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>SSR Example</title>
            </head>
            <body>
                <div id="app">${html}</div>
            </body>
            </html>
        `);
    } catch (error) {
        res.status(500).send('Internal Server Error');
    }
});
  1. 在客户端激活 Vue 应用

    • public目录下创建client.js文件,用于在客户端激活 Vue 应用,使其能够处理交互等功能。

javascript

import Vue from 'vue';
import App from './src/App.vue';

new Vue({
    render: h => h(App)
}).$mount('#app');
  1. 最后

    • index.html中引入client.js,确保在客户端能够正确激活 Vue 应用。

以上只是一个简单的 SSR 示例,实际项目中可能会涉及到更多的配置和优化,如路由处理、数据预取、样式处理等。