我正在使用自己的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)
})
}
答案 0 :(得分:0)
Vue-SSR在服务器端执行asyncData
和serverPrefetch
。从您的组件中删除这些代码,将代码移至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
})
})
这解决了问题,但需要稍微改进一下代码。
感谢帮助人员。