diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index 502b6fa6d1d..2a0ada84ea7 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -28,6 +28,7 @@ export type RenderOptions = { basedir?: string; shouldPreload?: Function; shouldPrefetch?: Function; + shouldRenderAsyncScripts?: boolean; clientManifest?: ClientManifest; serializer?: Function; runInNewContext?: boolean | 'once'; @@ -42,6 +43,7 @@ export function createRenderer ({ cache, shouldPreload, shouldPrefetch, + shouldRenderAsyncScripts, clientManifest, serializer }: RenderOptions = {}): Renderer { @@ -51,6 +53,7 @@ export function createRenderer ({ inject, shouldPreload, shouldPrefetch, + shouldRenderAsyncScripts, clientManifest, serializer }) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index c8927b2de2c..74926bf16ad 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -16,6 +16,7 @@ type TemplateRendererOptions = { clientManifest?: ClientManifest; shouldPreload?: (file: string, type: string) => boolean; shouldPrefetch?: (file: string, type: string) => boolean; + shouldRenderAsyncScripts?: boolean; serializer?: Function; }; @@ -221,9 +222,11 @@ export default class TemplateRenderer { } renderScripts (context: Object): string { + const shouldRenderAsyncScripts = this.options.shouldRenderAsyncScripts !== false + if (this.clientManifest) { const initial = this.preloadFiles.filter(({ file }) => isJS(file)) - const async = (this.getUsedAsyncFiles(context) || []).filter(({ file }) => isJS(file)) + const async = ((shouldRenderAsyncScripts && this.getUsedAsyncFiles(context)) || []).filter(({ file }) => isJS(file)) const needed = [initial[0]].concat(async, initial.slice(1)) return needed.map(({ file }) => { return `` diff --git a/test/ssr/ssr-template.spec.js b/test/ssr/ssr-template.spec.js index d30f096668a..70af1d02eee 100644 --- a/test/ssr/ssr-template.spec.js +++ b/test/ssr/ssr-template.spec.js @@ -378,7 +378,7 @@ describe('SSR: template option', () => { // manifest chunk should be first `` + // async chunks should be before main chunk - `` + + (options.noAsyncScripts ? ``: ``) + `` + `` @@ -442,6 +442,25 @@ describe('SSR: template option', () => { }) }) + it('bundleRenderer + renderToStream + clientManifest + shouldRenderAsyncScripts', done => { + createRendererWithManifest('split.js', { + runInNewContext, + shouldRenderAsyncScripts: false + }, renderer => { + const stream = renderer.renderToStream({ state: { a: 1 }}) + let res = '' + stream.on('data', chunk => { + res += chunk.toString() + }) + stream.on('end', () => { + expect(res).toContain(expectedHTMLWithManifest({ + noAsyncScripts: true + })) + done() + }) + }) + }) + it('bundleRenderer + renderToString + clientManifest + inject: false', done => { createRendererWithManifest('split.js', { runInNewContext,