diff --git a/packages/types/config/render.d.ts b/packages/types/config/render.d.ts index b16d00618e..ac60d62bc4 100644 --- a/packages/types/config/render.d.ts +++ b/packages/types/config/render.d.ts @@ -68,6 +68,7 @@ export interface NuxtOptionsRender { ) => string[] } injectScripts?: boolean + asyncScripts?: boolean resourceHints?: boolean ssr?: boolean ssrLog?: boolean | 'collapsed' diff --git a/packages/vue-renderer/src/renderers/modern.js b/packages/vue-renderer/src/renderers/modern.js index a7551f981c..71c06dd715 100644 --- a/packages/vue-renderer/src/renderers/modern.js +++ b/packages/vue-renderer/src/renderers/modern.js @@ -51,7 +51,7 @@ export default class ModernRenderer extends SSRRenderer { return scripts } - const scriptPattern = /]*?src="([^"]*?)" defer><\/script>/g + const scriptPattern = /]*?src="([^"]*?)" defer( async)?><\/script>/g const modernScripts = scripts.replace(scriptPattern, (scriptTag, jsFile) => { const legacyJsFile = jsFile.replace(this.publicPath, '') diff --git a/packages/vue-renderer/src/renderers/ssr.js b/packages/vue-renderer/src/renderers/ssr.js index a8b29cd6d6..5f0063f2d2 100644 --- a/packages/vue-renderer/src/renderers/ssr.js +++ b/packages/vue-renderer/src/renderers/ssr.js @@ -42,7 +42,11 @@ export default class SSRRenderer extends BaseRenderer { } renderScripts (renderContext) { - return this.addAttrs(renderContext.renderScripts(), 'script') + let renderedScripts = this.addAttrs(renderContext.renderScripts(), 'script') + if (this.options.render.asyncScripts) { + renderedScripts = renderedScripts.replace(/defer>/g, 'defer async>') + } + return renderedScripts } renderStyles (renderContext) { @@ -190,7 +194,11 @@ export default class SSRRenderer extends BaseRenderer { const statePath = urlJoin(url, 'state.js') const stateUrl = urlJoin(staticAssetsBase, statePath) staticAssets.push({ path: statePath, src: stateScript }) - APP += `` + if (this.options.render.asyncScripts) { + APP += `` + } else { + APP += `` + } preloadScripts.push(stateUrl) } else { APP += `` diff --git a/test/dev/basic.ssr.test.js b/test/dev/basic.ssr.test.js index 92d1f5c58e..fef1410991 100644 --- a/test/dev/basic.ssr.test.js +++ b/test/dev/basic.ssr.test.js @@ -414,6 +414,11 @@ describe('basic ssr', () => { expect(html).toContain('Auto discovered component!') }) + test('/ (normal