Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/plugin-vue/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,10 @@ export async function transformMain(
// target can be overridden by oxc config target
// @ts-ignore Rolldown-specific
...options.devServer?.config.oxc,
jsx: {
...options.devServer?.config.oxc?.jsx,
refresh: false,
},
lang: 'ts',
sourcemap: options.sourceMap,
},
Expand Down
11 changes: 11 additions & 0 deletions playground/vue-refresh-bug/RefreshBug.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<template>
<p class="refresh-bug">This should render without $RefreshSig$ errors</p>
</template>

<script setup lang="ts">
import { useSlots } from 'vue'

// useSlots() triggers Oxc's React refresh pass because oxc keys off
// the "use" prefix, treating it like a React hook.
const slots = useSlots()
</script>
23 changes: 23 additions & 0 deletions playground/vue-refresh-bug/__tests__/vue-refresh-bug.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { expect, test } from 'vitest'
import { browserErrors, browserLogs, isBuild, page } from '~utils'

test('should render without React refresh injection', async () => {
expect(await page.textContent('.refresh-bug')).toMatch(
'This should render without $RefreshSig$ errors',
)
})

test.runIf(!isBuild)(
'should not inject $RefreshSig$ or $RefreshReg$ into Vue SFCs',
async () => {
for (const log of browserLogs) {
expect(log).not.toMatch(/\$RefreshSig\$/)
expect(log).not.toMatch(/\$RefreshReg\$/)
}

for (const error of browserErrors) {
expect(error.message).not.toMatch(/\$RefreshSig\$/)
expect(error.message).not.toMatch(/\$RefreshReg\$/)
}
},
)
7 changes: 7 additions & 0 deletions playground/vue-refresh-bug/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<div id="app"></div>
<script type="module">
import { createApp } from 'vue'
import RefreshBug from './RefreshBug.vue'

createApp(RefreshBug).mount('#app')
</script>
17 changes: 17 additions & 0 deletions playground/vue-refresh-bug/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "@vitejs/test-vue-refresh-bug",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "catalog:"
},
"devDependencies": {
"@vitejs/plugin-vue": "workspace:*"
}
}
16 changes: 16 additions & 0 deletions playground/vue-refresh-bug/vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { defineConfig } from 'vite'
import vuePlugin from '@vitejs/plugin-vue'

export default defineConfig({
plugins: [vuePlugin()],
// simulate what @vitejs/plugin-react does:
// it sets config.oxc.jsx.refresh = true globally
oxc: {
jsx: {
refresh: true,
},
},
build: {
minify: false,
},
})
12 changes: 11 additions & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.