From b641e1b96fd607687a8dc06f35501a9d7b1a5cdf Mon Sep 17 00:00:00 2001 From: Duo Duo Date: Wed, 9 Dec 2020 13:58:29 +0800 Subject: [PATCH 1/2] fix: make ssr-plugin compatible with wp4/5(#11718) --- src/server/webpack-plugin/client.js | 14 ++++++++++++++ src/server/webpack-plugin/server.js | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/server/webpack-plugin/client.js b/src/server/webpack-plugin/client.js index ae2a2498672..f889d7b2e01 100644 --- a/src/server/webpack-plugin/client.js +++ b/src/server/webpack-plugin/client.js @@ -19,6 +19,20 @@ export default class VueSSRClientPlugin { const initialFiles = uniq(Object.keys(stats.entrypoints) .map(name => stats.entrypoints[name].assets) .reduce((assets, all) => all.concat(assets), []) + .map(function (file) { + if (typeof file === "string") { + return file; + } + + if ( + Object.prototype.toString.call(file) === "[object Object]" && + file.name + ) { + return file.name; + } + + throw new Error(`file structure is not correct: ${file}`); + }) .filter((file) => isJS(file) || isCSS(file))) const asyncFiles = allFiles diff --git a/src/server/webpack-plugin/server.js b/src/server/webpack-plugin/server.js index 305b4bab58b..ccd68fc86e1 100644 --- a/src/server/webpack-plugin/server.js +++ b/src/server/webpack-plugin/server.js @@ -20,7 +20,21 @@ export default class VueSSRServerPlugin { return cb() } - const entryAssets = entryInfo.assets.filter(isJS) + const entryAssets = entryInfo.assets + .map(function (file) { + if (typeof file === "string") { + return file; + } + + if ( + Object.prototype.toString.call(file) === "[object Object]" && + file.name + ) { + return file.name; + } + + throw new Error(`file structure is not correct: ${file}`); + }).filter(isJS) if (entryAssets.length > 1) { throw new Error( From 7b1e90afa39a2b8cbafde50d8ffa3aa4a22a4210 Mon Sep 17 00:00:00 2001 From: Duo Duo Date: Wed, 9 Dec 2020 16:03:22 +0800 Subject: [PATCH 2/2] fix: make ssr-build-plugin compatible with webpack4/5 (fix #11718) --- src/server/template-renderer/index.js | 4 ++-- src/server/webpack-plugin/server.js | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index c8927b2de2c..ea8585c571d 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -55,7 +55,7 @@ export default class TemplateRenderer { this.inject = options.inject !== false // if no template option is provided, the renderer is created // as a utility object for rendering assets like preload links and scripts. - + const { template } = options this.parsedTemplate = template ? typeof template === 'string' @@ -224,7 +224,7 @@ export default class TemplateRenderer { if (this.clientManifest) { const initial = this.preloadFiles.filter(({ file }) => isJS(file)) const async = (this.getUsedAsyncFiles(context) || []).filter(({ file }) => isJS(file)) - const needed = [initial[0]].concat(async, initial.slice(1)) + const needed = [].concat(initial[0] ? [initial[0]] : [], async, initial.slice(1)); return needed.map(({ file }) => { return `` }).join('') diff --git a/src/server/webpack-plugin/server.js b/src/server/webpack-plugin/server.js index ccd68fc86e1..ccb9cdd9624 100644 --- a/src/server/webpack-plugin/server.js +++ b/src/server/webpack-plugin/server.js @@ -59,6 +59,9 @@ export default class VueSSRServerPlugin { stats.assets.forEach(asset => { if (isJS(asset.name)) { bundle.files[asset.name] = compilation.assets[asset.name].source() + if (asset.info && asset.info.related && asset.info.related.sourceMap) { + bundle.maps[asset.info.related.sourceMap.replace(/\.map$/, '')] = JSON.parse(compilation.assets[asset.info.related.sourceMap].source()); + } } else if (asset.name.match(/\.js\.map$/)) { bundle.maps[asset.name.replace(/\.map$/, '')] = JSON.parse(compilation.assets[asset.name].source()) }