Skip to content

Commit

Permalink
perf: reduce memory usage during rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
meteorlxy committed Aug 28, 2022
1 parent 406fa67 commit ea0a2b2
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 19 deletions.
11 changes: 7 additions & 4 deletions packages/bundler-vite/src/build/build.ts
Expand Up @@ -68,16 +68,19 @@ export const build = async (
const { createVueApp } = await importFile<{
createVueApp: CreateVueAppFunction
}>(serverEntryPath)
// create vue ssr app
const { app: vueApp, router: vueRouter } = await createVueApp()
const { renderToString } = await import('vue/server-renderer')

// pre-render pages to html files
for (const page of app.pages) {
if (spinner) {
spinner.text = `Rendering pages ${chalk.magenta(page.path)}`
}
if (spinner) spinner.text = `Rendering pages ${chalk.magenta(page.path)}`
await renderPage({
app,
page,
createVueApp,
vueApp,
vueRouter,
renderToString,
ssrTemplate,
output: clientOutput.output,
outputEntryChunk: clientEntryChunk,
Expand Down
17 changes: 10 additions & 7 deletions packages/bundler-vite/src/build/renderPage.ts
@@ -1,7 +1,9 @@
import type { CreateVueAppFunction } from '@vuepress/client'
import type { App, Page } from '@vuepress/core'
import { fs, renderHead } from '@vuepress/utils'
import type { OutputAsset, OutputChunk, RollupOutput } from 'rollup'
import { ssrContextKey } from 'vue'
import type { App as VueApp } from 'vue'
import type { Router } from 'vue-router'
import type { SSRContext } from 'vue/server-renderer'
import { renderPagePrefetchLinks } from './renderPagePrefetchLinks.js'
import { renderPagePreloadLinks } from './renderPagePreloadLinks.js'
Expand All @@ -12,35 +14,36 @@ import { resolvePageChunkFiles } from './resolvePageChunkFiles.js'
export const renderPage = async ({
app,
page,
createVueApp,
vueApp,
vueRouter,
renderToString,
ssrTemplate,
output,
outputEntryChunk,
outputCssAsset,
}: {
app: App
page: Page
createVueApp: CreateVueAppFunction
vueApp: VueApp
vueRouter: Router
renderToString: (input: VueApp, context: SSRContext) => Promise<string>
ssrTemplate: string
output: RollupOutput['output']
outputEntryChunk: OutputChunk
outputCssAsset: OutputAsset | undefined
}): Promise<void> => {
// create vue ssr app
const { app: vueApp, router: vueRouter } = await createVueApp()

// switch to current page route
await vueRouter.push(page.path)
await vueRouter.isReady()

// create vue ssr context with default values
delete vueApp._context.provides[ssrContextKey]
const ssrContext: SSRContext = {
lang: 'en',
head: [],
}

// render current page to string
const { renderToString } = await import('vue/server-renderer')
const pageRendered = await renderToString(vueApp, ssrContext)

// resolve page chunks
Expand Down
7 changes: 6 additions & 1 deletion packages/bundler-webpack/src/build/build.ts
Expand Up @@ -91,6 +91,9 @@ export const build = async (
const { createVueApp } = await importFileDefault<{
createVueApp: CreateVueAppFunction
}>(serverEntryPath)
// create vue ssr app
const { app: vueApp, router: vueRouter } = await createVueApp()
const { renderToString } = await import('vue/server-renderer')

// pre-render pages to html files
for (const page of app.pages) {
Expand All @@ -100,7 +103,9 @@ export const build = async (
await renderPage({
app,
page,
createVueApp,
vueApp,
vueRouter,
renderToString,
ssrTemplate,
allFilesMeta,
initialFilesMeta,
Expand Down
17 changes: 10 additions & 7 deletions packages/bundler-webpack/src/build/renderPage.ts
@@ -1,7 +1,9 @@
import type { CreateVueAppFunction } from '@vuepress/client'
import type { App, Page } from '@vuepress/core'
import type { VuepressSSRContext } from '@vuepress/shared'
import { fs, renderHead } from '@vuepress/utils'
import { ssrContextKey } from 'vue'
import type { App as VueApp } from 'vue'
import type { Router } from 'vue-router'
import type { SSRContext } from 'vue/server-renderer'
import { renderPagePrefetchLinks } from './renderPagePrefetchLinks.js'
import { renderPagePreloadLinks } from './renderPagePreloadLinks.js'
Expand All @@ -25,7 +27,9 @@ interface PageRenderContext extends SSRContext, VuepressSSRContext {
export const renderPage = async ({
app,
page,
createVueApp,
vueApp,
vueRouter,
renderToString,
ssrTemplate,
allFilesMeta,
initialFilesMeta,
Expand All @@ -34,29 +38,28 @@ export const renderPage = async ({
}: {
app: App
page: Page
createVueApp: CreateVueAppFunction
vueApp: VueApp
vueRouter: Router
renderToString: (input: VueApp, context: SSRContext) => Promise<string>
ssrTemplate: string
allFilesMeta: FileMeta[]
initialFilesMeta: FileMeta[]
asyncFilesMeta: FileMeta[]
moduleFilesMetaMap: ModuleFilesMetaMap
}): Promise<void> => {
// create vue ssr app
const { app: vueApp, router: vueRouter } = await createVueApp()

// switch to current page route
await vueRouter.push(page.path)
await vueRouter.isReady()

// create vue ssr context with default values
delete vueApp._context.provides[ssrContextKey]
const ssrContext: PageRenderContext = {
_registeredComponents: new Set(),
lang: 'en',
head: [],
}

// render current page to string
const { renderToString } = await import('vue/server-renderer')
const pageRendered = await renderToString(vueApp, ssrContext)

// resolve client files that used by this page
Expand Down

0 comments on commit ea0a2b2

Please sign in to comment.