在NUXT下根据数据结构挖取想要动态渲染的数据

Nuxt.js 是一个基于 Vue.js
的服务端渲染(SSR)框架,它可以帮助开发者更高效地构建高性能、可搜索引擎优化的前端应用。相较于传统的单页面应用(SPA),Nuxt.js
生成的 HTML 文件更具利于搜索引擎优化,并加快了首屏加载时间。

但是道理我都懂,那么如何去爬取它渲染的页面数据呢。
已知有三种数据:

  • 静态渲染数据: 就是直接请求写在HTML源码文件的数据,这部分我们可以用XML解析器去直接解析抓取。
  • 异步渲染数据:通过 Network 控制台查看请求抓取即可。
  • 动态渲染数据:这部分的数据储存在一个 <script id="__NUXT_DATA__" /> 标签里面,我们依照上面的方法,读取 <script id="__NUXT_DATA__" /> 的内容可以发现,这是一个无序数组。根据观察可以发现,他的结构为 Array<{ [key]: valueIndex extends number } | value extends any>。那么方法就显而易见了。我们写一个支持任意层级的对象挖掘函数 digObject<T>(object: Array | Object, matchFunction: (obj: any) =>boolean[, cache: Array<T>]): Array<T>来对无序数组进行挖掘。

我们着重讲一下动态渲染数据的数据获取方式,我们以 这样一个页面 为例子来实验一下:

在这里插入图片描述
如图,这个网页是一个标准的用NUXT渲染的页面,其中红框部分就用到了动态渲染,而我们需要获取的是绿色部分的列表。我们先看略看一下NUXT_DATA的内容:

const s = document.getElementById('__NUXT_DATA__');
const data = JSON.parse(s.innerHTML);
console.log(data);

我们就发现了这样的一个数据结构:
在这里插入图片描述
仔细对比一下就会发现这就是我们要的对象,那我们根据数据特征: 含有key为 SID的对象去挖掘,就可以找到我们想要的东西了。

那我们很简单就写出了一下代码:

const s = document.getElementById('__NUXT_DATA__')
const data = JSON.parse(s.innerHTML)
const digObject = (ob, matchCall, cache = [])=>{
    if (matchCall(ob)) return cache.push(ob),cache;
    if (typeof ob != 'object') return cache;
    if (!ob) return cache;
    Array.isArray(ob) ? ob.map(v=>{
        if(matchCall(v)) return cache.push(v);
        if(typeof v === 'object') digObject(v, matchCall, cache);
    }) : digObject(Object.values(ob), matchCall, cache);
    return cache;
};
// 查找拥有 SID 为键名的对象。
const call = v => v && Object.keys(v).length> 0 && Object.keys(v).some(k=>['SID'].indexOf(k)>-1);

const res = digObject(data, call)
// 把对象的 valueIndex 换成 value
res.map(v=> Object.entries(v).map(kv=>v[kv[0]]=data[kv[1]]))
console.log("res:", res);

看,很简单不是吗 ^ w ^ !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nuxt 中,数据有两种方式:静态生成和服务端渲染。下面分别介绍这两种方式的正确的数据请求方法。 1. 静态生成 (generate) 在 nuxt.config.js 文件中配置 generate 属性,指定需要生成的静态页面和对应的数据来源。例如: ```js export default { generate: { routes: [ '/posts/1', '/posts/2', '/posts/3' ] } } ``` 如果需要根据接口动态生成静态页面,则可以在 generate 属性中使用 async 函数获数据。例如: ```js export default { generate: { routes: async () => { const { data } = await axios.get('https://api.example.com/posts') return data.map(post => `/posts/${post.id}`) } } } ``` 2. 服务端渲染 (SSR) 在页面组件中,通过 asyncData 方法获数据。例如: ```js export default { async asyncData({ params }) { const { data } = await axios.get(`https://api.example.com/posts/${params.id}`) return { post: data } } } ``` 需要注意的是,asyncData 方法只会在服务端执行,不会在客户端执行。在客户端执行的是 mounted 方法。因此,如果需要在客户端获数据,可以在 mounted 方法中发起请求。例如: ```js export default { async asyncData({ params }) { const { data } = await axios.get(`https://api.example.com/posts/${params.id}`) return { post: data } }, mounted() { axios.get(`https://api.example.com/posts/${this.$route.params.id}`).then(({ data }) => { console.log(data) }) } } ``` 以上就是 Nuxt 中正确的数据请求方法。需要根据具体的业务场景选择不同的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值