Skip to content

Commit

Permalink
feat(ssr) Implement afterNuxtRender context method
Browse files Browse the repository at this point in the history
  • Loading branch information
dovca committed May 24, 2021
1 parent f4a6b38 commit a11538e
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 2 deletions.
1 change: 1 addition & 0 deletions packages/types/app/index.d.ts
Expand Up @@ -72,6 +72,7 @@ export interface Context {
redirected: boolean
next: NextFunction
beforeRenderFns: Array<() => any>
afterRenderFns: Array<() => any>
fetchCounters: Record<string, number>
nuxt: {
layout: string
Expand Down
1 change: 1 addition & 0 deletions packages/vue-app/template/index.js
Expand Up @@ -183,6 +183,7 @@ async function createApp(ssrContext, config = {}) {
req: ssrContext ? ssrContext.req : undefined,
res: ssrContext ? ssrContext.res : undefined,
beforeRenderFns: ssrContext ? ssrContext.beforeRenderFns : undefined,
afterRenderFns: ssrContext ? ssrContext.afterRenderFns : undefined,
ssrContext
})

Expand Down
11 changes: 9 additions & 2 deletions packages/vue-app/template/server.js
Expand Up @@ -85,6 +85,8 @@ export default async (ssrContext) => {
ssrContext.next = createNext(ssrContext)
// Used for beforeNuxtRender({ Components, nuxtState })
ssrContext.beforeRenderFns = []
// Used for afterNuxtRender({ Components, nuxtState })
ssrContext.afterRenderFns = []
// Nuxt object (window.{{globals.context}}, defaults to window.__NUXT__)
ssrContext.nuxt = { <% if (features.layouts) { %>layout: 'default', <% } %>data: [], <% if (features.fetch) { %>fetch: {}, <% } %>error: null<%= (store ? ', state: null' : '') %>, serverRendered: true, routePath: '' }
<% if (features.fetch) { %>
Expand Down Expand Up @@ -120,16 +122,21 @@ export default async (ssrContext) => {
const beforeRender = async () => {
// Call beforeNuxtRender() methods
await Promise.all(ssrContext.beforeRenderFns.map(fn => promisify(fn, { Components, nuxtState: ssrContext.nuxt })))
<% if (store) { %>

ssrContext.rendered = () => {
// Call afterNuxtRender() methods
ssrContext.afterRenderFns.forEach(fn => fn({ Components, nuxtState: ssrContext.nuxt }))

<% if (store) { %>
// Add the state from the vuex store
ssrContext.nuxt.state = store.state
<% } %>

<% if (isFullStatic && store) { %>
// Stop recording store mutations
ssrContext.unsetMutationObserver()
<% } %>
}
<% } %>
}

const renderErrorPage = async () => {
Expand Down
1 change: 1 addition & 0 deletions packages/vue-app/template/utils.js
Expand Up @@ -259,6 +259,7 @@ export async function setContext (app, context) {
}
if (process.server) {
app.context.beforeNuxtRender = fn => context.beforeRenderFns.push(fn)
app.context.afterNuxtRender = fn => context.afterRenderFns.push(fn)
}
if (process.client) {
app.context.nuxtState = window.<%= globals.context %>
Expand Down
6 changes: 6 additions & 0 deletions test/dev/basic.ssr.test.js
Expand Up @@ -207,6 +207,12 @@ describe('basic ssr', () => {
expect(window.__NUXT__.test).toBe(true)
})

test('/special-state-after -> check window.__NUXT__.testAfter = true', async () => {
const window = await nuxt.server.renderAndGetWindow(url('/special-state-after'))
expect(window.document.title).toBe('Nuxt')
expect(window.__NUXT__.testAfter).toBe(true)
})

test('/error', async () => {
await expect(nuxt.server.renderRoute('/error', { req: {}, res: {} }))
.rejects.toThrow('Error mouahahah')
Expand Down
15 changes: 15 additions & 0 deletions test/fixtures/basic/pages/special-state-after.vue
@@ -0,0 +1,15 @@
<template>
<h1>Special state in `window.__NUXT__`</h1>
</template>

<script>
export default {
middleware ({ afterNuxtRender }) {
if (process.server) {
afterNuxtRender(({ nuxtState }) => {
nuxtState.testAfter = true
})
}
}
}
</script>

0 comments on commit a11538e

Please sign in to comment.