diff --git a/packages/nuxt3/src/webpack/plugins/vue/server.ts b/packages/nuxt3/src/webpack/plugins/vue/server.ts index d257b95a38..f4e6aacdd1 100644 --- a/packages/nuxt3/src/webpack/plugins/vue/server.ts +++ b/packages/nuxt3/src/webpack/plugins/vue/server.ts @@ -9,63 +9,64 @@ export default class VueSSRServerPlugin { apply (compiler) { validate(compiler) + compiler.hooks.make.tap('VueSSRServerPlugin', (compilation: any) => { + compilation.hooks.processAssets.tapAsync('VueSSRServerPlugin', (assets, cb) => { + const stats = compilation.getStats().toJson() + const [entryName] = Object.keys(stats.entrypoints) + const entryInfo = stats.entrypoints[entryName] - compiler.hooks.emit.tapAsync('vue-server-plugin', (compilation, cb) => { - const stats = compilation.getStats().toJson() - const [entryName] = Object.keys(stats.entrypoints) - const entryInfo = stats.entrypoints[entryName] - - if (!entryInfo) { - // #5553 - return cb() - } - - const entryAssets = entryInfo.assets.filter(isJS) - - if (entryAssets.length > 1) { - throw new Error( - 'Server-side bundle should have one single entry file. ' + - 'Avoid using CommonsChunkPlugin in the server config.' - ) - } - - const [entry] = entryAssets - if (!entry || typeof entry !== 'string') { - throw new Error( - `Entry "${entryName}" not found. Did you specify the correct entry option?` - ) - } - - const bundle = { - entry, - files: {}, - maps: {} - } - - stats.assets.forEach((asset) => { - if (isJS(asset.name)) { - const queryPart = extractQueryPartJS(asset.name) - if (queryPart !== undefined) { - bundle.files[asset.name] = asset.name.replace(queryPart, '') - } else { - bundle.files[asset.name] = asset.name - } - } else if (asset.name.match(/\.js\.map$/)) { - bundle.maps[asset.name.replace(/\.map$/, '')] = asset.name - } else { - // Do not emit non-js assets for server - delete compilation.assets[asset.name] + if (!entryInfo) { + // #5553 + return cb() } + + const entryAssets = entryInfo.assets.filter(isJS) + + if (entryAssets.length > 1) { + throw new Error( + 'Server-side bundle should have one single entry file. ' + + 'Avoid using CommonsChunkPlugin in the server config.' + ) + } + + const [entry] = entryAssets + if (!entry || typeof entry !== 'string') { + throw new Error( + `Entry "${entryName}" not found. Did you specify the correct entry option?` + ) + } + + const bundle = { + entry, + files: {}, + maps: {} + } + + stats.assets.forEach((asset) => { + if (isJS(asset.name)) { + const queryPart = extractQueryPartJS(asset.name) + if (queryPart !== undefined) { + bundle.files[asset.name] = asset.name.replace(queryPart, '') + } else { + bundle.files[asset.name] = asset.name + } + } else if (asset.name.match(/\.js\.map$/)) { + bundle.maps[asset.name.replace(/\.map$/, '')] = asset.name + } else { + // Do not emit non-js assets for server + delete assets[asset.name] + } + }) + + const src = JSON.stringify(bundle, null, 2) + + assets[this.options.filename] = { + source: () => src, + size: () => src.length + } + + cb() }) - - const src = JSON.stringify(bundle, null, 2) - - compilation.assets[this.options.filename] = { - source: () => src, - size: () => src.length - } - - cb() - }) + } } }