Files
vuepress/packages/@vuepress/core/lib/app/serverEntry.js
T
2018-09-16 14:46:02 +08:00

39 lines
1.2 KiB
JavaScript

import Vue from 'vue'
import { createApp } from './app'
import pageComponents from '@internal/page-components'
import layoutComponents from '@internal/layout-components'
export default context => new Promise((resolve, reject) => {
const { app, router } = createApp(true /* isServer */)
const { url } = context
const { fullPath } = router.resolve(url).route
if (fullPath !== url) {
return reject({ url: fullPath })
}
router.push(url)
// In SSR, if a component is not registered with the component option,
// vue-server-renderer will not able to resolve it.
//
// Build also works after deleting this, but the content of all pages
// will not appear to the output html, which is not conducive to SEO.
const asyncComponentLoadingPromises = [
...getComponentArr(pageComponents),
...getComponentArr(layoutComponents)
].map(({ name, loadFn }) => {
return loadFn().then(comp => {
Vue.component(name, comp.default)
})
})
router.onReady(() => {
Promise.all(asyncComponentLoadingPromises).then(() => resolve(app))
})
})
function getComponentArr (components) {
return Object.keys(components).map(name => ({ name, loadFn: components[name] }))
}