SPA:单页面应用
优点:交互体验好,无刷新。有利于前后端分离,减轻服务器压力。
缺点:不利于SEO,首次加载过慢
解决办法:SSR(服务端渲染解决)
(CSR)客户端渲染:客户端发送请求后,先加载index.html文件,但上面的数据还没渲染,当加载完js代码和vue后数据才成功渲染到html上,一切都是在浏览器进行执行的。
(SSR)服务器渲染:客户端发送请求后,服务器渲染好html页面,直接返回给浏览器。
SEO:使用程序获取网页内容,根据一套特定规则分析网页内容。
爬虫:使用程序获取并分析网页内容的行为,称之为爬虫。(发送请求,解析数据)
/**
* 任何服务端技术都可以做爬虫
* Java、PHP、Python、Ruby、。。。。Node.js。。。
*/
const http = require('http')
// 1. 获取网页内容
// http.get('http://127.0.0.1:5500/csr.html', (res) => {
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
console.log(rawData)
})
})
// 单页面应用为什么不利于SEO?因为爬虫不管你js代码的解析,只会获取到这个链接请求的页面,然而spa的页面只有一个模板没有内容。
// 2. 分析
vue服务端渲染
(专注于,使用 Node.js server 的服务器端单页面应用程序渲染,也可以使用奇其他服务端进行渲染,但需要等过的配置:https://ssr.vuejs.org/zh/guide/non-node.html)
简单示例:
npm install vue vue-server-renderer --save
渲染一个 Vue 实例
// 第 1 步:创建一个 Vue 实例
const Vue = require('vue')
const app = new Vue({
template: `
<div>
<h1>{{ message }}</h1>
</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)
})
// 在 2.5.0+,如果没有传入回调函数,则会返回 Promise:
// renderer.renderToString(app).then(html => {
// console.log(html)
// }).catch(err => {
// console.error(err)
// })
与服务器集成
npm install express --save
const express = require('express')
const Vue = require('vue')
const renderer = require('vue-server-renderer').createRenderer()
const app = express()
app.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>
`)
})
})
app.listen(3000, () => console.log('Server running at port 3000.'))
想达到生产级别这些远远还不够,需要继续阅读书写更多配置。想了解服务器端的详细配置可以看官方提供的工程:链接
想快速上手请使用nuxt.js框架