text: 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] }))
  }
  