什么是服務器端渲染 (SSR)?
Vue.js 是構建客戶端應用程序的框架。默認情況下,可以在瀏覽器中輸出 Vue 組件,進行生成 DOM 和操作 DOM。然而,也可以將同一個組件渲染為服務器端的 HTML 字符串,將它們直接發送到瀏覽器,最后將這些靜態標記"激活"為客戶端上完全可交互的應用程序。
服務器渲染的 Vue.js 應用程序也可以被認為是"同構"或"通用",因為應用程序的大部分代碼都可以在服務器和客戶端上運行。
為什么使用服務器端渲染 (SSR)?
與傳統 SPA (單頁應用程序 (Single-Page Application)) 相比,服務器端渲染 (SSR) 的優勢主要在于:
- 更好的 SEO,由于搜索引擎爬蟲抓取工具可以直接查看完全渲染的頁面。
- 更快的內容到達時間 (time-to-content),特別是對于緩慢的網絡情況或運行緩慢的設備。無需等待所有的 JavaScript 都完成下載并執行,才顯示服務器渲染的標記,所以你的用戶將會更快速地看到完整渲染的頁面。通常可以產生更好的用戶體驗,并且對于那些「內容到達時間(time-to-content) 與轉化率直接相關」的應用程序而言,服務器端渲染 (SSR) 至關重要。
使用服務器端渲染 (SSR) 時還需要有一些權衡之處:
- 開發條件所限。瀏覽器特定的代碼,只能在某些生命周期鉤子函數 (lifecycle hook) 中使用;一些外部擴展庫 (external library) 可能需要特殊處理,才能在服務器渲染應用程序中運行。
- 涉及構建設置和部署的更多要求。與可以部署在任何靜態文件服務器上的完全靜態單頁面應用程序 (SPA) 不同,服務器渲染應用程序,需要處于 Node.js server 運行環境。
- 更多的服務器端負載。在 Node.js 中渲染完整的應用程序,顯然會比僅僅提供靜態文件的 server 更加大量占用 CPU 資源 (CPU-intensive - CPU 密集),因此如果你預料在高流量環境 (high traffic) 下使用,請準備相應的服務器負載,并明智地采用緩存策略。
服務器端渲染 vs 預渲染 (SSR vs Prerendering)
如果你調研服務器端渲染 (SSR) 只是用來改善少數營銷頁面(例如 /, /about, /contact 等)的 SEO,那么你可能需要預渲染。無需使用 web 服務器實時動態編譯 HTML,而是使用預渲染方式,在構建時 (build time) 簡單地生成針對特定路由的靜態 HTML 文件。優點是設置預渲染更簡單,并可以將你的前端作為一個完全靜態的站點。
項目(一)
在項目一中我們創建一個最原始的SSR項目,便于理解SSR的原理
首先創建一個文件夾ssr,然后進入ssr
$ cd ssr
$ npm init
創建server文件夾,創建一個app.js文件,下載相應的插件
$ npm i vue
$ npm i vue-server-renderer
$ npm i express
# vue vue-server-renderer 版本要一致
app.js文件內容為:
/**** app.js ***/
//創建一個 Vue 實例
const Vue = require('vue');
const express = require('express')();
const app = new Vue({
template: `<div>Hello World</div>`
});
//創建一個renderer
const renderer = require('vue-server-renderer').createRenderer();
//相應路由請求
express.get('/', (req, res) => {
//將Vue實例渲染為HTML
renderer.renderToString(app, (err, html) => {
if (err) throw err;
console.log("==html==", html);
res.send(
`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"></meta>
<title>SSR渲染頁面1</title>
</head>
<body>
${html}
</body>
</html>
`
);
});
//在 2.5.0 + ,如果沒有傳入回調函數,則會返回 Promise
// renderer.renderToString(app).then(html => {
// console.log(html);
// res.send(
// `
// <!DOCTYPE html>
// <html lang="en">
// <head>
// <meta charset="UTF-8"></meta>
// <title>SSR渲染頁面1</title>
// </head>
// <body>
// ${html}
// </body>
// </html>
// `
// );
// }).catch(err => {
// console.log(err);
//});
});
//服務器監聽地址
express.listen(8082, () => {
console.log('服務器已啟動');
});
ssr文件夾目錄結構:
/* ssr目錄結構 */
| - node_modules
- package.json
- package-lock.json
- server
| -app.js
啟動服務:
$ node app
打開瀏覽器,地址欄輸入:
http://localhost:8082
我們可以看到,頁面加載成功:
image.png
打開chrome開發者工具查看Network可以看到:
image.png
我們可以看到Vue實例中的模板已經被渲染到了html頁面并返回到了客戶端
服務端渲染的核心就在于:通過 vue-server-renderer 插件的renderToString()方法,將Vue實例轉換為字符串插入到html文件中