Vue 3中的SSR技术应用实践,提升应用的SEO效果
1. 什么是SSR?
在介绍Vue 3中的SSR技术应用实践前,我们先来了解下什么是SSR。
简单来说,SSR(Server Side Rendering),中文翻译为服务器端渲染,是指将Vue应用在服务端渲染成HTML字符串,然后将其直接返回到浏览器端,浏览器端直接展示,相比于传统SPA(Single Page Application,单页应用程序)仅渲染视图,而数据需要通过API请求动态获取的方式呈现,SSR渲染直接返回html字符串节省了浏览器端仅展示视图耗费的时间。因此,在用户体验和SEO优化方面有很大的优势。
2. Vue 3中的SSR
Vue 3相较于Vue 2有很多的新特性,其中SSR技术在Vue 3中得到了极大地增强。Vue 3中提供了一个新的API createSSRApp,用于创建一个与普通web应用程序相似的应用程序,但使用了服务器端渲染(SSR)来提供更好的SEO、性能和更多的交互机会。这使得SSR已经不再被看作是一个很新的概念,而是被认为是web应用程序的一个重要组成部分。
2.1. 创建Vue 3 SSR应用
要在Vue 3中创建一个SSR应用程序,需要使用createSSRApp API。下面是一个简单的示例,用于创建一个简单的SSR应用程序:
// main.js
import { createSSRApp } from 'vue'
import App from './App.vue'
export function createApp() {
const app = createSSRApp(App)
return { app }
}
这个示例导入了createSSRApp和App组件并导出了createApp函数。createApp函数创建了一个app实例并返回。
2.2. Vue Server Renderer
为了将Vue应用程序渲染为HTML字符串,需要使用一个叫做Vue Server Renderer的包。Vue Server Renderer是Vue.js官方提供的一种将Vue组件渲染为HTML字符串的工具,它使用VNode (Virtual DOM 的一个子集)来渲染组件。
// server.js
import { createApp } from './main'
import { renderToString } from '@vue/server-renderer'
const { app } = createApp()
const html = await renderToString(app)
console.log(html)
上面的代码中,我们导入了createApp函数和renderToString方法。然后,我们通过调用createApp函数创建了app实例,并将其传递到renderToString方法中。renderToString方法将应用程序实例渲染为字符串。
2.3. Vue 3 SSR的优势
Vue.js 3中的SSR可以提供一些真正的优势,像这些:
-更好的SEO,因为搜索引擎可以看到渲染后的HTML代码。
-更好的性能,因为在用户到达页面之前,服务器就已经渲染了页面,
-更多的交互机会,因为渲染后的页面已经有了完整的HTML和CSS,用户可以立即与它交互而不需要等待加载其他资源。
3. Vue 3 SSR应用的配置
为了实现SSR,需要对Vue 3应用程序进行一些配置。下面我们将介绍几个主要的配置选项。
3.1. Webpack配置
要将Vue 3应用程序构建为SSR应用程序,需要对Webpack配置进行一些调整。
首先,需要使用webpack-node-externals插件来排除服务器端代码中已经包含的包。这个插件将从webpack的externals配置中排除node_modules中的所有模块,这些模块将被视为node模块。这个插件可以让Webpack在构建时忽略这些包,从而提高构建速度。
此外,需要在webpack配置文件中使用vue-loader插件。
Vue-loader是一个用于Webpack的插件,可以将Vue组件转换为JavaScript模块。在webpack配置中包括该插件。
这里提供一个简单的webpack.config.js文件示例:
const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')
const nodeExternals = require('webpack-node-externals')
module.exports = {
target: 'node',
entry: './src/server.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'server.js'
},
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
// ... other rules
]
},
plugins: [
new VueLoaderPlugin()
]
}
3.2. 服务器端路由配置
在SSR应用程序中,所有路由应该是服务器端路由,因此需要将服务器端路由添加到应用程序中。
// server.js
import express from 'express'
import { createApp } from './main'
import { renderToString } from '@vue/server-renderer'
const app = express()
app.get('*', async (req, res) => {
const { app } = createApp()
const html = await renderToString(app)
res.send(`
Vue 3 SSR App
${html}
`)
})
app.listen(3000, () => {
console.log('Server started at http://localhost:3000')
})
在服务器端代码中,我们使用express来创建服务器并添加一个通配符路由*。当用户访问任何路由时,我们都会创建一个app实例并将其传递到renderToString方法中。然后,我们将渲染后的HTML字符串作为响应发送回浏览器。
3.3. 服务端数据预取
服务端数据预取是一个重要的概念,可以用于在服务器端获取数据以用于渲染组件。在Vue.js 3中,可以通过设置asyncData、fetch或onServerPrefetch方法来执行服务端数据预取。
// App.vue
import { ref, onBeforeMount, onServerPrefetch } from 'vue'
export default {
setup() {
const posts = ref([])
onBeforeMount(async () => {
// This code will be called on client and server-side
await fetchPosts()
})
onServerPrefetch(async () => {
// This code will only be called on the server-side
await fetchPosts()
})
async function fetchPosts() {
const response = await fetch('/api/posts')
posts.value = await response.json()
}
return { posts }
}
}
在上面的代码中,我们使用onServerPrefetch方法来执行服务端数据预取,fetchPosts函数则用于获取/posts路由返回的JSON数据。
4. SSR的SEO优化
在Vue 3中使用SSR可以帮助我们优化SEO,因为服务器端渲染后的HTML代码可以被搜索引擎轻松地抓取和分析。但是,仅渲染HTML字符串并不能完全解决SEO问题。这里有一些常见的SEO错误,需要注意一下。
-首先,由于SSR只是一种技术,因此需要一些其他的SEO工具或技术来确保网站获得更好的排名。
-在渲染HTML时,我们应该确保避免使用JavaScript和CSS内联样式。搜索引擎最终还是会采用页面中的内容作为排名因素。
-确保每个页面的标题和元描述标签包含有关页面内容的信息。这可以帮助搜索引擎理解页面的主题,并使其更有可能排名。
-使用有意义的URL和页面名称。一些搜索引擎的爬虫会根据URL中的信息来理解页面内容。
结论
Vue 3中的SSR技术可以在保持传统SPA的交互性能的同时提高SEO,为网站的搜索引擎收录做出贡献。为了实现SSR,需要对Vue 3应用程序进行一些配置。我们可以使用createSSRApp-API创建SSR应用程序,并使用Vue Server Renderer将Vue组件渲染为HTML字符串。除此之外,我们还可以执行服务端数据预取以优化SEO。