vue#createSSRApp TypeScript Examples
The following examples show how to use
vue#createSSRApp.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: app.ts From vite-plugin-ssr with MIT License | 6 votes |
function createApp(pageContext: PageContext) {
const { Page, pageProps } = pageContext
const PageWithLayout = defineComponent({
render() {
return h(
PageShell,
{},
{
default() {
return h(Page, pageProps || {})
},
},
)
},
})
const app = createSSRApp(PageWithLayout)
// Make `pageContext` available from any Vue component
setPageContext(app, pageContext)
return app
}
Example #2
Source File: ssr.test.ts From vue-i18n-next with MIT License | 6 votes |
test('composition mode', async () => {
const i18n = createI18n({
legacy: false,
locale: 'en',
messages: {}
})
const App = defineComponent({
setup() {
const { t } = useI18n({
locale: 'ja',
inheritLocale: false,
messages: {
ja: { hello: 'こんにちは!' },
en: { hello: 'hello!' }
}
})
return () => h('p', t('hello'))
}
})
const app = createSSRApp(App)
app.use(i18n)
expect(await renderToString(app)).toMatch(`<p>こんにちは!</p>`)
})
Example #3
Source File: ssr.test.ts From vue-i18n-next with MIT License | 6 votes |
test('legacy mode', async () => {
const i18n = createI18n({
locale: 'ja',
messages: {
ja: { hello: 'こんにちは!' },
en: { hello: 'hello!' }
}
})
// NOTE: template: `<p>{{ $t('hello') }}</p>`
const App = () => h('p', i18n.global.t('hello'))
const app = createSSRApp(App)
app.use(i18n)
expect(await renderToString(app)).toMatch(`<p>こんにちは!</p>`)
})
Example #4
Source File: ssr.test.ts From vue-i18n-next with MIT License | 6 votes |
test('component: i18n-t', async () => {
const i18n = createI18n({
legacy: false,
locale: 'en',
messages: {}
})
const App = defineComponent({
setup() {
useI18n({
locale: 'ja',
inheritLocale: false,
messages: {
ja: { hello: 'こんにちは!' },
en: { hello: 'hello!' }
}
})
return () => h(resolveComponent('i18n-t'), { tag: 'p', keypath: 'hello' })
}
// template: `<i18n-t tag="p" keypath="hello"/>`
})
const app = createSSRApp(App)
app.use(i18n)
expect(await renderToString(app)).toMatch(`<p>こんにちは!</p>`)
})
Example #5
Source File: app.ts From vite-plugin-ssr with MIT License | 5 votes |
function createApp(pageContext: PageContext) {
const { Page } = pageContext
let rootComponent: Component
const PageWithWrapper = defineComponent({
data: () => ({
Page: markRaw(Page),
pageProps: markRaw(pageContext.pageProps || {}),
}),
created() {
rootComponent = this
},
render() {
return h(
PageShell,
{},
{
default: () => {
return h(this.Page, this.pageProps)
},
},
)
},
})
const app = createSSRApp(PageWithWrapper)
// We use `app.changePage()` to do Client Routing, see `_default.page.client.js`
objectAssign(app, {
changePage: (pageContext: PageContext) => {
Object.assign(pageContextReactive, pageContext)
rootComponent.Page = markRaw(pageContext.Page)
rootComponent.pageProps = markRaw(pageContext.pageProps || {})
},
})
// When doing Client Routing, we mutate pageContext (see usage of `app.changePage()` in `_default.page.client.js`).
// We therefore use a reactive pageContext.
const pageContextReactive = reactive(pageContext)
// Make `pageContext` accessible from any Vue component
setPageContext(app, pageContextReactive)
return app
}
Example #6
Source File: entry-client.ts From vite-ssr with MIT License | 5 votes |
viteSSR: ClientHandler = async function viteSSR(
App,
{
routes,
base,
routerOptions = {},
pageProps = { passToPage: true },
debug = {},
...options
},
hook
) {
if (pageProps && pageProps.passToPage) {
addPagePropsGetterToRoutes(routes)
}
const app = createSSRApp(App)
const url = new URL(window.location.href)
const routeBase = base && withoutSuffix(base({ url }), '/')
const router = createRouter({
...routerOptions,
history: createWebHistory(routeBase),
routes: routes as RouteRecordRaw[],
})
const context: Context = await createClientContext({
...options,
url,
spaRedirect: (location) => router.push(location),
})
provideContext(app, context)
let entryRoutePath: string | undefined
let isFirstRoute = true
router.beforeEach((to) => {
if (isFirstRoute || (entryRoutePath && entryRoutePath === to.path)) {
// The first route is rendered in the server and its state is provided globally.
isFirstRoute = false
entryRoutePath = to.path
to.meta.state = context.initialState
}
})
if (hook) {
await hook({
app,
router,
initialRoute: router.resolve(getFullPath(url, routeBase)),
...context,
})
}
app.use(router)
if (debug.mount !== false) {
// this will hydrate the app
await router.isReady()
// @ts-ignore
app.mount(`#${__CONTAINER_ID__}`, true)
// it is possible to debug differences of SSR / Hydrated app state
// by adding a timeout between rendering the SSR version and hydrating it later
// window.setTimeout(() => {
// console.log('The app has now hydrated');
// router.isReady().then(() => {
// app.mount('#app', true);
// });
// }, 5000);
}
}
Example #7
Source File: index.spec.ts From css-render with MIT License | 4 votes |
describe('ssr', () => {
describe('render to string', () => {
const Child = defineComponent({
setup () {
c('div', {
color: 'red'
}).mount({
id: 'mount-id',
ssr: useSsrAdapter()
})
},
render () {
return h('div', null, 'Child')
}
})
const App = defineComponent({
render () {
return h(Child)
}
})
const app = createSSRApp(App)
const { collect } = setup(app)
it('should work', (done) => {
renderToString(app).then((v) => {
expect(collect() + v).toMatchSnapshot()
done()
})
})
})
describe('useSsrAdapter', () => {
const Child = defineComponent({
setup () {
c('div', {
color: 'red'
}).mount({
id: 'mount-id',
ssr: useSsrAdapter()
})
},
render () {
return h('div', null, 'Child')
}
})
const App = defineComponent({
render () {
return h(Child)
}
})
const app = createSSRApp(App)
const { collect } = setup(app)
it('should work', (done) => {
renderToString(app).then((v) => {
expect(collect() + v).toMatchSnapshot()
done()
})
})
})
// uncomment after vue fixes the stream ssr bug
// describe('render to stream', () => {
// it('should work', (done) => {
// const app = createSSRApp({
// render () {
// return [
// h(Foo),
// h(Suspense, null, {
// default: () => h(Bar),
// ssFallback: () => 'suspense'
// }),
// h(Foo)
// ]
// }
// })
// const Foo = {
// setup () {
// c('div', {
// color: 'foo'
// }).mount({
// id: 'foo',
// ssr: ssrAdapter
// })
// },
// render: () => h('div', 'foo')
// }
// const Bar = {
// async setup () {
// c('div', {
// color: 'bar'
// }).mount({
// id: 'bar',
// ssr: ssrAdapter
// })
// await new Promise((resolve) => setTimeout(resolve, 1000))
// },
// render: () => {
// return [h('div', 'bar'), h(Foo)]
// }
// }
// const { collect } = setup(app)
// const rs = renderToStream(app)
// let html = ''
// rs.on('data', (chunk) => {
// html += `${collect()}\n${chunk.toString() as string}`
// })
// rs.on('end', () => {
// expect(html).toMatchSnapshot()
// done()
// })
// })
// })
})