diff --git a/packages/plugin-vue-jsx/index.js b/packages/plugin-vue-jsx/index.js index ac8e554c77ee59..ea36b0b1d91219 100644 --- a/packages/plugin-vue-jsx/index.js +++ b/packages/plugin-vue-jsx/index.js @@ -2,8 +2,9 @@ const babel = require('@babel/core') const jsx = require('@vue/babel-plugin-jsx') const importMeta = require('@babel/plugin-syntax-import-meta') -const { createFilter } = require('@rollup/pluginutils') +const { createFilter, normalizePath } = require('@rollup/pluginutils') const hash = require('hash-sum') +const path = require('path') const ssrRegisterHelperId = '/__vue-jsx-ssr-register-helper' const ssrRegisterHelperCode = @@ -39,6 +40,7 @@ function ssrRegisterHelper(comp, filename) { * @returns {import('vite').Plugin} */ function vueJsxPlugin(options = {}) { + let root = '' let needHmr = false let needSourceMap = true @@ -63,6 +65,7 @@ function vueJsxPlugin(options = {}) { configResolved(config) { needHmr = config.command === 'serve' && !config.isProduction needSourceMap = config.command === 'serve' || !!config.build.sourcemap + root = config.root }, resolveId(id) { @@ -226,9 +229,10 @@ function vueJsxPlugin(options = {}) { } if (ssr) { + const normalizedId = normalizePath(path.relative(root, id)) let ssrInjectCode = `\nimport { ssrRegisterHelper } from "${ssrRegisterHelperId}"` + - `\nconst __moduleId = ${JSON.stringify(id)}` + `\nconst __moduleId = ${JSON.stringify(normalizedId)}` for (const { local } of hotComponents) { ssrInjectCode += `\nssrRegisterHelper(${local}, __moduleId)` } diff --git a/packages/plugin-vue/src/main.ts b/packages/plugin-vue/src/main.ts index 98bca03db6f081..b6dfd03714cefd 100644 --- a/packages/plugin-vue/src/main.ts +++ b/packages/plugin-vue/src/main.ts @@ -8,6 +8,7 @@ import { setDescriptor } from './utils/descriptorCache' import { PluginContext, TransformPluginContext } from 'rollup' +import { normalizePath } from '@rollup/pluginutils' import { resolveScript } from './script' import { transformTemplateInMain } from './template' import { isOnlyTemplateChanged, isEqualBlock } from './handleHotUpdate' @@ -143,13 +144,16 @@ export async function transformMain( // SSR module registration by wrapping user setup if (ssr) { + const normalizedFilename = normalizePath( + path.relative(options.root, filename) + ) output.push( `import { useSSRContext as __vite_useSSRContext } from 'vue'`, `const _sfc_setup = _sfc_main.setup`, `_sfc_main.setup = (props, ctx) => {`, ` const ssrContext = __vite_useSSRContext()`, ` ;(ssrContext.modules || (ssrContext.modules = new Set())).add(${JSON.stringify( - filename + normalizedFilename )})`, ` return _sfc_setup ? _sfc_setup(props, ctx) : undefined`, `}` diff --git a/packages/vite/src/node/ssr/ssrManifestPlugin.ts b/packages/vite/src/node/ssr/ssrManifestPlugin.ts index 93d2d19a503ee4..d137f727b51847 100644 --- a/packages/vite/src/node/ssr/ssrManifestPlugin.ts +++ b/packages/vite/src/node/ssr/ssrManifestPlugin.ts @@ -1,3 +1,5 @@ +import { relative } from 'path' +import { normalizePath } from '@rollup/pluginutils' import { ResolvedConfig } from '..' import { Plugin } from '../plugin' import { chunkToEmittedCssFileMap } from '../plugins/css' @@ -21,7 +23,9 @@ export function ssrManifestPlugin(config: ResolvedConfig): Plugin { : chunkToEmittedCssFileMap.get(chunk) const assetFiles = chunkToEmittedAssetsMap.get(chunk) for (const id in chunk.modules) { - const mappedChunks = ssrManifest[id] || (ssrManifest[id] = []) + const normalizedId = normalizePath(relative(config.root, id)) + const mappedChunks = + ssrManifest[normalizedId] || (ssrManifest[normalizedId] = []) if (!chunk.isEntry) { mappedChunks.push(base + chunk.fileName) }