Skip to content

Commit 0b9bc6f

Browse files
committed
refactor: reactify
1 parent 1a226e5 commit 0b9bc6f

File tree

1 file changed

+46
-42
lines changed

1 file changed

+46
-42
lines changed

packages/plugin-vue/src/index.ts

+46-42
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
} from 'vue/compiler-sfc'
1111
import type * as _compiler from 'vue/compiler-sfc'
1212
/* eslint-enable import/no-duplicates */
13+
import { computed, shallowRef } from 'vue'
1314
import { version } from '../package.json'
1415
import { resolveCompiler } from './compiler'
1516
import { parseVueRequest } from './utils/query'
@@ -101,7 +102,7 @@ export interface ResolvedOptions extends Options {
101102
}
102103

103104
export default function vuePlugin(rawOptions: Options = {}): Plugin {
104-
let options: ResolvedOptions = {
105+
const options = shallowRef<ResolvedOptions>({
105106
isProduction: process.env.NODE_ENV === 'production',
106107
compiler: null as any, // to be set in buildStart
107108
include: /\.vue$/,
@@ -112,49 +113,46 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
112113
sourceMap: true,
113114
cssDevSourcemap: false,
114115
devToolsEnabled: process.env.NODE_ENV !== 'production',
115-
}
116-
117-
function buildFilter() {
118-
return {
119-
filter: createFilter(options.include, options.exclude),
120-
customElementFilter:
121-
typeof options.customElement === 'boolean'
122-
? () => options.customElement as boolean
123-
: createFilter(options.customElement),
124-
refTransformFilter:
125-
options.reactivityTransform === false
126-
? () => false
127-
: options.reactivityTransform === true
128-
? createFilter(/\.(j|t)sx?$/, /node_modules/)
129-
: createFilter(options.reactivityTransform),
130-
}
131-
}
116+
})
132117

133-
let { filter, customElementFilter, refTransformFilter } = buildFilter()
118+
const filter = computed(() =>
119+
createFilter(options.value.include, options.value.exclude),
120+
)
121+
const customElementFilter = computed(() =>
122+
typeof options.value.customElement === 'boolean'
123+
? () => options.value.customElement as boolean
124+
: createFilter(options.value.customElement),
125+
)
126+
const refTransformFilter = computed(() =>
127+
options.value.reactivityTransform === false
128+
? () => false
129+
: options.value.reactivityTransform === true
130+
? createFilter(/\.(j|t)sx?$/, /node_modules/)
131+
: createFilter(options.value.reactivityTransform),
132+
)
134133

135134
return {
136135
name: 'vite:vue',
137136

138137
api: {
139138
get options() {
140-
return options
139+
return options.value
141140
},
142141
set options(value) {
143-
options = value
144-
;({ filter, customElementFilter, refTransformFilter } = buildFilter())
142+
options.value = value
145143
},
146144
version,
147145
},
148146

149147
handleHotUpdate(ctx) {
150-
if (options.compiler.invalidateTypeCache) {
151-
options.compiler.invalidateTypeCache(ctx.file)
148+
if (options.value.compiler.invalidateTypeCache) {
149+
options.value.compiler.invalidateTypeCache(ctx.file)
152150
}
153151
if (typeDepToSFCMap.has(ctx.file)) {
154152
return handleTypeDepChange(typeDepToSFCMap.get(ctx.file)!, ctx)
155153
}
156-
if (filter(ctx.file)) {
157-
return handleHotUpdate(ctx, options)
154+
if (filter.value(ctx.file)) {
155+
return handleHotUpdate(ctx, options.value)
158156
}
159157
},
160158

@@ -177,8 +175,8 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
177175
},
178176

179177
configResolved(config) {
180-
options = {
181-
...options,
178+
options.value = {
179+
...options.value,
182180
root: config.root,
183181
sourceMap: config.command === 'build' ? !!config.build.sourcemap : true,
184182
cssDevSourcemap: config.css?.devSourcemap ?? false,
@@ -189,14 +187,14 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
189187
},
190188

191189
configureServer(server) {
192-
options.devServer = server
190+
options.value.devServer = server
193191
},
194192

195193
buildStart() {
196-
const compiler = (options.compiler =
197-
options.compiler || resolveCompiler(options.root))
194+
const compiler = (options.value.compiler =
195+
options.value.compiler || resolveCompiler(options.value.root))
198196
if (compiler.invalidateTypeCache) {
199-
options.devServer?.watcher.on('unlink', (file) => {
197+
options.value.devServer?.watcher.on('unlink', (file) => {
200198
compiler.invalidateTypeCache(file)
201199
})
202200
}
@@ -226,7 +224,7 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
226224
if (query.src) {
227225
return fs.readFileSync(filename, 'utf-8')
228226
}
229-
const descriptor = getDescriptor(filename, options)!
227+
const descriptor = getDescriptor(filename, options.value)!
230228
let block: SFCBlock | null | undefined
231229
if (query.type === 'script') {
232230
// handle <script> + <script setup> merge via compileScript()
@@ -255,13 +253,13 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
255253
return
256254
}
257255

258-
if (!filter(filename) && !query.vue) {
256+
if (!filter.value(filename) && !query.vue) {
259257
if (
260258
!query.vue &&
261-
refTransformFilter(filename) &&
262-
options.compiler.shouldTransformRef(code)
259+
refTransformFilter.value(filename) &&
260+
options.value.compiler.shouldTransformRef(code)
263261
) {
264-
return options.compiler.transformRef(code, {
262+
return options.value.compiler.transformRef(code, {
265263
filename,
266264
sourceMap: true,
267265
})
@@ -274,26 +272,32 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin {
274272
return transformMain(
275273
code,
276274
filename,
277-
options,
275+
options.value,
278276
this,
279277
ssr,
280-
customElementFilter(filename),
278+
customElementFilter.value(filename),
281279
)
282280
} else {
283281
// sub block request
284282
const descriptor = query.src
285283
? getSrcDescriptor(filename, query) ||
286284
getTempSrcDescriptor(filename, query)
287-
: getDescriptor(filename, options)!
285+
: getDescriptor(filename, options.value)!
288286

289287
if (query.type === 'template') {
290-
return transformTemplateAsModule(code, descriptor, options, this, ssr)
288+
return transformTemplateAsModule(
289+
code,
290+
descriptor,
291+
options.value,
292+
this,
293+
ssr,
294+
)
291295
} else if (query.type === 'style') {
292296
return transformStyle(
293297
code,
294298
descriptor,
295299
Number(query.index || 0),
296-
options,
300+
options.value,
297301
this,
298302
filename,
299303
)

0 commit comments

Comments
 (0)