没有SSR的Vue SSR问题

时间:2020-08-06 16:15:50

标签: vue.js server-side-rendering vue-ssr

我正在使用自己的VSR SSR样板。

https://github.com/Djancyp/luna-vue-ssr-boilerplate

所有正常工作的页面均为SSR呈现。 我目前遇到的问题是,一旦将它们导入组件,就没有SSR组件出现故障。

服务器拖曳错误:

ReferenceError: document is not defined

我知道问题在于nodejs服务器上不存在文档。

我的问题是如何停止在服务器上不呈现任何SSR组件? -我尝试过No-SSR,但没有乐趣。

我的server-enty.ts

import createApp from './app'
const config = require('config')
const isDev = process.env.NODE_ENV !== 'production'

export default context => {
  return new Promise((resolve, reject) => {
    console.log('what the f server')
    const s = isDev && Date.now()
    const { app, router, store } = createApp(config)

    const { url } = context
    const { fullPath } = router.resolve(url).route

    if (fullPath !== url) {
      return reject({ url: fullPath })
    }
    router.push(url)
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()
      console.log(matchedComponents)
      if (!matchedComponents.length) {
        console.log('what the **** mate error')
        return reject({ code: 404 })
      }
      Promise.all(matchedComponents.map(({ asyncData }) => asyncData && asyncData({
        store,
        route: router.currentRoute
      }))).then(() => {
        isDev && console.log(`data pre-fetch: ${Date.now() - s}ms`)
        const meta = (app as any).$meta()
        context.meta = meta
        context.state = store.state
        resolve(app)
      }).catch(err => {
        console.log(err)
        return reject
      })
    }, reject)
  })
}

2 个答案:

答案 0 :(得分:0)

Vue-SSR在服务器端执行asyncDataserverPrefetch。从您的组件中删除这些代码,将代码移至created /'mount',它将停止在服务器端呈现。

我的假设是您正在document.asyncData中执行serverPrefetch

答案 1 :(得分:0)

Promise.all(matchedComponents.map(({ asyncData }) => asyncData && asyncData({
        store,
        route: router.currentRoute
      }))).then(() => {
        isDev && console.log(`data pre-fetch: ${Date.now() - s}ms`)
        const meta = (app as any).$meta()
        context.meta = meta
        context.state = store.state
        resolve(app)
      }).catch(err => {
        console.log(err)
        return reject
      })
    }, reject)

问题是如果异步模板不存在,我会拒绝。

Promise.all(matchedComponents.map(({ asyncData }) => asyncData && asyncData({
        store,
        route: router.currentRoute
      }))).then(() => {
        isDev && console.log(`data pre-fetch: ${Date.now() - s}ms`)
        const meta = (app as any).$meta()
        context.meta = meta
        context.state = store.state
        resolve(app)
      }).catch(err => {
        console.log(err)
        return reject
      })
    })

这解决了问题,但需要稍微改进一下代码。

感谢帮助人员。