From 8468aebacc7c6c020abf89f8d0b55e05dc2c0f6f Mon Sep 17 00:00:00 2001 From: ygj6 Date: Tue, 12 Jan 2021 18:56:15 +0800 Subject: [PATCH 1/2] fix(ssr): vue-ssr-webpack-plugin compatible with webpack 4/5 close #11718 --- src/server/template-renderer/index.js | 2 +- src/server/webpack-plugin/client.js | 8 ++++++++ src/server/webpack-plugin/server.js | 13 ++++++++++++- src/server/webpack-plugin/util.js | 11 +++++++++-- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index c8927b2de2c..921d3c0c7fa 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -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/client.js b/src/server/webpack-plugin/client.js index ae2a2498672..b0185bf8c74 100644 --- a/src/server/webpack-plugin/client.js +++ b/src/server/webpack-plugin/client.js @@ -1,6 +1,7 @@ const hash = require('hash-sum') const uniq = require('lodash.uniq') import { isJS, isCSS, onEmit } from './util' +import { isObject } from 'shared/util' export default class VueSSRClientPlugin { constructor (options = {}) { @@ -19,6 +20,13 @@ export default class VueSSRClientPlugin { const initialFiles = uniq(Object.keys(stats.entrypoints) .map(name => stats.entrypoints[name].assets) .reduce((assets, all) => all.concat(assets), []) + .map(file => { + if (isObject(file) && file.name) { + return file.name; + } else { + return 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..f5847dd6dac 100644 --- a/src/server/webpack-plugin/server.js +++ b/src/server/webpack-plugin/server.js @@ -1,4 +1,5 @@ import { validate, isJS, onEmit } from './util' +import { isObject } from 'shared/util' export default class VueSSRServerPlugin { constructor (options = {}) { @@ -20,7 +21,14 @@ export default class VueSSRServerPlugin { return cb() } - const entryAssets = entryInfo.assets.filter(isJS) + const entryAssets = entryInfo.assets + .map(file => { + if ( isObject(file) && file.name) { + return file.name; + } else { + return file; + } + }).filter(isJS) if (entryAssets.length > 1) { throw new Error( @@ -45,6 +53,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()) } diff --git a/src/server/webpack-plugin/util.js b/src/server/webpack-plugin/util.js index 94a204a22b2..e35d7cb6c08 100644 --- a/src/server/webpack-plugin/util.js +++ b/src/server/webpack-plugin/util.js @@ -9,8 +9,15 @@ export const validate = compiler => { warn('webpack config `target` should be "node".') } - if (compiler.options.output && compiler.options.output.libraryTarget !== 'commonjs2') { - warn('webpack config `output.libraryTarget` should be "commonjs2".') + if (compiler.options.output) { + // Webpack < 5.0.0 + if (compiler.options.output.libraryTarget && compiler.options.output.libraryTarget !== 'commonjs2') { + warn('webpack config `output.libraryTarget` should be "commonjs2".') + } + // Webpack >= 5.0.0 + else if (compiler.options.output.library && compiler.options.output.library.type !== 'commonjs2') { + warn('webpack config `output.libraryTarget` should be "commonjs2".') + } } if (!compiler.options.externals) { From fb53121db23e827ad428e1728a99863e745a1db2 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Tue, 30 Mar 2021 11:21:47 +0200 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Lachlan Miller --- src/server/template-renderer/index.js | 2 +- src/server/webpack-plugin/client.js | 4 ++-- src/server/webpack-plugin/server.js | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index 921d3c0c7fa..75c5c317e2f 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -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 = [].concat(initial[0] ? [initial[0]] : [], 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/client.js b/src/server/webpack-plugin/client.js index b0185bf8c74..b2a89de58af 100644 --- a/src/server/webpack-plugin/client.js +++ b/src/server/webpack-plugin/client.js @@ -22,9 +22,9 @@ export default class VueSSRClientPlugin { .reduce((assets, all) => all.concat(assets), []) .map(file => { if (isObject(file) && file.name) { - return file.name; + return file.name } else { - return file; + return file } }) .filter((file) => isJS(file) || isCSS(file))) diff --git a/src/server/webpack-plugin/server.js b/src/server/webpack-plugin/server.js index f5847dd6dac..737a90318e0 100644 --- a/src/server/webpack-plugin/server.js +++ b/src/server/webpack-plugin/server.js @@ -24,9 +24,9 @@ export default class VueSSRServerPlugin { const entryAssets = entryInfo.assets .map(file => { if ( isObject(file) && file.name) { - return file.name; + return file.name } else { - return file; + return file } }).filter(isJS) @@ -54,7 +54,7 @@ export default class VueSSRServerPlugin { 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()); + 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())