路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务

大约两年前曾经分享过基于Vue的SSR框架Nuxt的简单使用《基于Vue.js的SSR方案之Nuxt.js》,今天因为有SSR需求又重新做了一些尝试。

由于目前在做的是一个能够动态构建页面的平台产品,当前现状是构建产物全为静态资源,路由由前端渲染,且为动态创建。也由于众所周知的原因,国内网站不做SSR基本不可能被搜索引擎收录,于是有了此文,简单记录一下结合Nuxt和Vue做的一些尝试。

我们都知道,以往做SSR,页面路径、TDK等信息可能根本不需要特殊处理,而我们现状是产出物根本没有友好的页面路径与TDK(因为前期主要考虑业务系统,路径大多随机生成)。解决了以上问题之后,考虑产品产出物现状是通过数据动态创建路由,而Nuxt默认则是通过约定大于配置的形式,创建文件夹即路由,又碰到问题。

带着问题找方案,重新翻阅Nuxt文档,发现有_.vue做完全匹配的形式,有点类似vue-router的通配符——*,既然路由入口不能动态创建,是不是直接全匹配再渲染?考虑到目前的动态路由在最初也考虑过通过通配符的形式进行匹配,但因为这样支持不了以路由name进行跳转,转而选择了动态添加路由规则。介于暂时没有更好的方案,就再次对通配符的方式进行尝试,发现想法基本行得通,但根据name跳转的需求还需要结合数据进行path=>name的映射,好在SSR的形式可以在页面加载完之前就把映射关系输出到组件,效率基本没有损耗,后续针对路由跳转方法做一些拦截处理即可,这里不再赘述。

解决了动态路由问题,就是页面内容,我们页面内容是由后台数据决定,所以这里又祭出Nuxt的asyncData,前置做请求,然后打入组件,页面结构不固定,根据得到的数据,进行render渲染(取代静态template),后续就是一些额外信息的注入等,下面是示例代码。

export default {

head() {

return {

title: this.path,

meta: [

{ hid: 'keyword', name: 'keyword', content: '测试关键字' },

{ hid: 'description', name: 'description', content: '测试描述' }

]

}

},

asyncData({ req }) {

return Promise.resolve({

meta: {

views: [

{

name: 'about',

path: '/about',

body: 'test'

},

{

name: 'index',

path: '/index',

body: 'index'

}

]

},

path: req.url

})

},

computed: {

view() {

return this.meta.views.find(view => view.path === this.path)

}

},

render(h) {

return h('div', this.view.body)

}

}

启动服务,访问地址http://localhost:3000/about,得到如下结构

dbd4c23de3a00fa27379a9a7565f5702.pngNuxt 动态路由 about

访问地址http://localhost:3000/index,得到如下结构,似乎满足了我们的诉求

nuxt-dynamic-ssr-index.pngNuxt 动态路由 index

基于Nuxt构建动态路由SSR服务

nuxt-build-dynamic-router-ssr

微信打赏

支付宝打赏

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值