请问vuejs ssr是怎么把异步的数据获取并渲染出来的
发布于 7 年前 作者 bjdfs 11493 次浏览 来自 问答

官网的HN2.0例子中用了vuex,因为我还不懂vuex,所以写的demo里边没有用这个,然后问题就是我从firebase获取的数据不能做到服务端渲染,每次我渲染出来返回的html都没有从接口获取来的数据,我的理解是因为接口是异步获取的,所以渲染不出来,可是为毛官网的例子也是从接口获取的数据可以通过服务端渲染?

6 回复
  const context = { url: req.url }
  const renderStream = renderer.renderToStream(context)

谢谢回复哈我也是这么写的,可是我渲染出来的html没有接口返回的内容,我在网上搜到prefetch这个关键字,可还是不太明白

@bjdfs

// server-entry.js 
import Vue from 'vue'
import App from './App.vue'
 
const app = new Vue(App)
 
// the default export should be a function 
// which will receive the context of the render call 
export default context => {
  // data pre-fetching 
  return app.fetchServerData(context.url).then(() => {
    return app
  })
}

你说的是这个吧

  • 在组件内实现一个preFetch接口,用来获取组件想要的数据
  • 服务端渲染时,先根据路由获取对应的组件,再调用组件.preFetch来获取数据
  • 服务端获取完数据后,开始将数据写入全局state,并用<script>标签的形式写进response
  • 渲染完毕后客户端拿到初始数据和SSR好的DOM,开始hydate检查是否有漏掉的操作没执行,执行完毕后结束流程

所以preFetch只是个约定好的接口的,你用其他名字也没毛病。

至于为毛要实现这个接口,因为在服务端环境中,拿到的不是组件实例而是组件的"构造函数",导致根本就拿不到组件内的this,更别提methods和this.$store.state了,因此必须分离成在组件外部的一个接口,服务端直接调用这个接口并传入全局state即可。

我写过一些SSR的文章,有兴趣可以看一看

回到顶部