vue服务端渲染操作简单入门实例分析
本文实例讲述了vue服务端渲染操作。分享给大家供大家参考,具体如下:
想到要学习vue-ssr的同学,自不必多说,一定是熟悉了vue,并且多多少少做过几个项目。然后学习vue服务端渲染无非解决首屏渲染的白屏问题以及SEO友好。
话不多说,笔者也是研究多日才搞明白这个服务端渲染到底是杂么回事!!!
一,首先实现下官网的基本案例
随便建一个目录,然后执行npm init初始化项目,生成工程文件package.json;创建server.js;然后按照vue-ssr官方链接:https://ssr.vuejs.org/zh/basic.html教程里面介绍的server.js,复制教程里面代码,如下
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></head> <body>${html}</body> </html> `) }) }) server.listen(8080)
显然需要按照上面引入的依赖vue,express和vue-server-renderer,安装完毕,在终端执行,node server.js,打开浏览器,http://localhost:8080/,不出意外会是乱码,因为官网的返回的html字符串里面没有 <meta charset="utf-8">,而加上这个 就好了。
当然还可以引入一个模板文件,同样是官网的案例,此时的server.js为
const Vue = require('vue') const server = require('express')() const renderer = require('vue-server-renderer').createRenderer({ template: require('fs').readFileSync('./index.template.html', 'utf-8') }) 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(html) }) }) server.listen(8080)
模板文件index.template.html
<!DOCTYPE html> <html lang="en"> <head><title>Hello</title></head> <body> <!-- 下面这个注释必须有 --> <!--vue-ssr-outlet--> </body> </html>
上面注释根据官网教程,是vue注入的位置标记。然后同样执行,node server.js就可以了。
是不是很简单,还可以创建一个对象来改变模板的标题和meta,这个时候的server.js和模板文件代码分别是
const Vue = require('vue') const server = require('express')() const renderer = require('vue-server-renderer').createRenderer({ template: require('fs').readFileSync('./index.template.html', 'utf-8') }) server.get('*', (req, res) => { const context = { title: 'hello', meta: ` <meta ...> <meta ...> `,url:req.url } const app = new Vue({ data: { url: req.url }, template: `<div>访问的 URL 是: {{ url }}</div>` }) renderer.renderToString(app, context,(err, html) => { if (err) { res.status(500).end('Internal Server Error') return } res.end(html) }) }) server.listen(8080)
<!DOCTYPE html> <html lang="en"> <head> <title>{{title}}</title> {{{meta}}} </head> <body> <!-- 下面这个注释必须有 --> <!--vue-ssr-outlet--> </body> </html>
这里说下我的理解,vue服务端渲染实际是一套代码的两次应用,所谓的一套代码就是拿出server.js外面去的vm实例,上面之所以简单是因为我们在server内部创建的vm实例,一旦将vm拿出去,在server.js外部引入,那么涉及的就麻烦了。
这里分两条线说,一个是在server.js外面创建一个app.js;结果是无法引入到server中;而这个也不是关注的重点;
另一条线是使用vue-loader创建一个vm实例,然后引入到server中,整个vue渲染就在解决这个问题,解决引入的问题,解决引入之后与前端混合的问题。下面贴上简单案例的实现代码。
因为不能直接应用.vue文件以及外部的js文件,所以需要借助webpack,借助webpack将vue实例,转译为node可用代码,以及对前端代码进行转译。
二,以vue init webpack-simple vuessr0 为基础的vue-ssr案例
1)用vue-cli也就是vue脚手架建了一个简单模板,命令:vue init webpack-simple vuessr0,相信对此都比较熟悉,建好后的结构如下
之后改造一下,创建几个文件app.js,entry-client.js,entry-server.js,创建build目录,删除自动生成的webpack.config.js文件,改之后的目录结构为
各个文件的作用,entry-server.js将vm实例,转译为node可用代码;
entry-client.js和传统前端处理一致。
好吧,github链接地址为:https://github.com/mstzhen/vue-ssr;我实在有点懒了。
需要说明的是,webpack将一份文件打包为两份,前端入口文件的作用是挂载到id上面,后端入口文件以及后端文件负责注入。
首先安装依赖:npm install
;
然后依次
npm run build:client npm run build:server npm run dev
8080端口访问即可。
最后,本文只是对vue服务端官网最简单那个实例的实现。没有使用vue-router,没有vuex,更没有服务端数据请求。希望对正在学习vue服务端学习的小伙伴有所帮助。
错误之处,请指出。
相关文章
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
这篇文章主要为大家详细介绍了Vue.js基础指令实例,各种数据绑定、表单渲染大总结,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07vue+elementui 表格分页限制最大页码数的操作代码
这篇文章主要介绍了vue+elementui 表格分页限制最大页码数的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2024-08-08vue3在自定义hooks中使用useRouter报错的解决方案
这篇文章主要介绍了vue3在自定义hooks中使用useRouter报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-08-08Element plus中el-input框回车触发页面刷新问题以及解决办法
在el-form表单组件中el-input组件输入内容后按下Enter键刷新了整个页面,下面这篇文章主要给大家介绍了关于Element plus中el-input框回车触发页面刷新问题以及解决办法,需要的朋友可以参考下2024-03-03vue中v-for循环数组,在方法中splice删除数组元素踩坑记录
这篇文章主要介绍了vue中v-for循环数组,在方法中splice删除数组元素踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06
最新评论