Skip to content

Commit 85612fe

Browse files
committed
fix(plugin-vue): ensure descriptor in case main request is cached
1 parent 38de2c9 commit 85612fe

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

packages/plugin-vue/src/handleHotUpdate.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export async function handleHotUpdate({
1919
read,
2020
server
2121
}: HmrContext): Promise<ModuleNode[] | void> {
22-
const prevDescriptor = getDescriptor(file, false)
22+
const prevDescriptor = getDescriptor(file, server.config.root, false, false)
2323
if (!prevDescriptor) {
2424
// file hasn't been requested yet (e.g. async component)
2525
return

packages/plugin-vue/src/index.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,11 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
167167
if (query.src) {
168168
return fs.readFileSync(filename, 'utf-8')
169169
}
170-
const descriptor = getDescriptor(filename)!
170+
const descriptor = getDescriptor(
171+
filename,
172+
options.root,
173+
options.isProduction
174+
)!
171175
let block: SFCBlock | null | undefined
172176
if (query.type === 'script') {
173177
// handle <scrip> + <script setup> merge via compileScript()
@@ -219,7 +223,11 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
219223
)
220224
} else {
221225
// sub block request
222-
const descriptor = getDescriptor(filename)!
226+
const descriptor = getDescriptor(
227+
filename,
228+
options.root,
229+
options.isProduction
230+
)!
223231
if (query.type === 'template') {
224232
return transformTemplateAsModule(code, descriptor, options, this, ssr)
225233
} else if (query.type === 'style') {

packages/plugin-vue/src/utils/descriptorCache.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import fs from 'fs'
12
import path from 'path'
23
import slash from 'slash'
34
import hash from 'hash-sum'
@@ -45,16 +46,24 @@ export function setPrevDescriptor(
4546

4647
export function getDescriptor(
4748
filename: string,
48-
errorOnMissing = true
49+
root: string,
50+
isProduction: boolean | undefined,
51+
createIfNotFound = true
4952
): SFCDescriptor | undefined {
5053
if (cache.has(filename)) {
5154
return cache.get(filename)!
5255
}
53-
if (errorOnMissing) {
54-
throw new Error(
55-
`${filename} has no corresponding SFC entry in the cache. ` +
56-
`This is a @vitejs/plugin-vue internal error, please open an issue.`
56+
if (createIfNotFound) {
57+
const { descriptor, errors } = createDescriptor(
58+
filename,
59+
fs.readFileSync(filename, 'utf-8'),
60+
root,
61+
isProduction
5762
)
63+
if (errors) {
64+
throw errors[0]
65+
}
66+
return descriptor
5867
}
5968
}
6069

0 commit comments

Comments
 (0)