Skip to content

Commit 326b382

Browse files
committed
feat(plugin-vue): latest ref transform support
1 parent 83aa68b commit 326b382

File tree

2 files changed

+50
-12
lines changed

2 files changed

+50
-12
lines changed

packages/plugin-vue/src/index.ts

+49-12
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import {
1414
SFCBlock,
1515
SFCScriptCompileOptions,
1616
SFCStyleCompileOptions,
17-
SFCTemplateCompileOptions
17+
SFCTemplateCompileOptions,
18+
shouldTransformRef,
19+
transformRef
1820
} from '@vue/compiler-sfc'
1921
import { parseVueRequest } from './utils/query'
2022
import { getDescriptor } from './utils/descriptorCache'
@@ -54,6 +56,17 @@ export interface Options {
5456
*/
5557
customElement?: boolean | string | RegExp | (string | RegExp)[]
5658

59+
/**
60+
* Enable Vue ref transform (experimental).
61+
* **requires Vue \>= 3.2.5**
62+
* - `true`: transform will be enabled for all vue,js(x),ts(x) files
63+
* - `string | RegExp`: apply to vue + only matched files
64+
* - `false`: disable in all cases
65+
*
66+
* @default false
67+
*/
68+
refTransform?: boolean | string | RegExp | (string | RegExp)[]
69+
5770
/**
5871
* @deprecated the plugin now auto-detects whether it's being invoked for ssr.
5972
*/
@@ -66,22 +79,33 @@ export interface ResolvedOptions extends Options {
6679
}
6780

6881
export default function vuePlugin(rawOptions: Options = {}): Plugin {
82+
const {
83+
include = /\.vue$/,
84+
exclude,
85+
customElement = /\.ce\.vue$/,
86+
refTransform = false
87+
} = rawOptions
88+
89+
const filter = createFilter(include, exclude)
90+
91+
const customElementFilter =
92+
typeof customElement === 'boolean'
93+
? () => customElement
94+
: createFilter(customElement)
95+
96+
const refTransformFilter =
97+
refTransform === false
98+
? () => false
99+
: refTransform === true
100+
? createFilter(/\.(j|t)sx?$/)
101+
: createFilter(refTransform)
102+
69103
let options: ResolvedOptions = {
70104
isProduction: process.env.NODE_ENV === 'production',
71105
...rawOptions,
72106
root: process.cwd()
73107
}
74108

75-
const filter = createFilter(
76-
rawOptions.include || /\.vue$/,
77-
rawOptions.exclude
78-
)
79-
80-
const customElementFilter =
81-
typeof rawOptions.customElement === 'boolean'
82-
? () => rawOptions.customElement as boolean
83-
: createFilter(rawOptions.customElement || /\.ce\.vue$/)
84-
85109
return {
86110
name: 'vite:vue',
87111

@@ -154,7 +178,20 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
154178

155179
transform(code, id, ssr = !!options.ssr) {
156180
const { filename, query } = parseVueRequest(id)
157-
if ((!query.vue && !filter(filename)) || query.raw) {
181+
if (query.raw) {
182+
return
183+
}
184+
if (!filter(filename) && !query.vue) {
185+
if (
186+
refTransformFilter(filename) &&
187+
!query.vue &&
188+
shouldTransformRef(code)
189+
) {
190+
return transformRef(code, {
191+
filename,
192+
sourceMap: true
193+
})
194+
}
158195
return
159196
}
160197

packages/plugin-vue/src/script.ts

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export function resolveScript(
4343
id: descriptor.id,
4444
isProd: options.isProduction,
4545
inlineTemplate: !options.devServer,
46+
refTransform: options.refTransform !== false,
4647
templateOptions: resolveTemplateCompilerOptions(descriptor, options, ssr)
4748
})
4849

0 commit comments

Comments
 (0)