接下来我们以 Vue SSR 的官方文档为参考,来学习一下它的基本用法。
渲染一个 Vue 实例
目标:
- 了解如何使用 VueSSR 将一个 Vue 实例渲染为 HTML 字符串
首先我们来学习一下服务端渲染中最基础的工作:模板渲染。
说白了就是如何在服务端使用 Vue 的方式解析替换字符串。
在它的官方文档中其实已经给出了示例代码,下面我们来把这个案例的实现过程以及其中含义演示一下。
mkdir demo01
cd demo01
npm install vue vue-server-renderer
demo01/index.js
:
// 第 1 步:创建一个 Vue 实例
const Vue = require("vue");
const app = new Vue({
template: `<div>{{ message }}</div>`,
data: {
message: "Hello World",
},
});
// 第 2 步:创建一个 renderer
const renderer = require("vue-server-renderer").createRenderer();
// 第 3 步:将 Vue 实例渲染为 HTML
renderer.renderToString(app, (err, html) => {
if (err) throw err;
console.log(html);
// => <div data-server-rendered="true">Hello World</div>
});
// 在 2.5.0+,如果没有传入回调函数,则会返回 Promise:
renderer
.renderToString(app)
.then((html) => {
console.log(html);
})
.catch((err) => {
console.error(err);
});
与服务器集成
在 Node.js 服务器中使用时相当简单直接,例如 Express。
首先安装 Express 到项目中:
npm i express
然后使用 Express 创建一个基本的 Web 服务:
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(3000, () => console.log("app listening at http://localhost:port"));
启动 Web 服务:
nodemon index.js
在 Web 服务中渲染 Vue 实例:
const Vue = require("vue");
const server = require("express")();
const renderer = require("vue-server-renderer").createRenderer();
server.get("*", (req, res) => {
const app = new Vue({
data: {
url: req.url,
},
template: `<div>访问的 URL 是: {{ url }}</div>`,
});
renderer.renderToString(app, (err, html) => {
if (err) {
res.status(500).end("Internal Server Error");
return;
}
res.end(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello</title>
<meta charset="UTF-8">
</head>
<body>${html}</body>
</html>
`);
});
});
server.listen(8080);