diff --git a/packages/plugin-vue/src/index.ts b/packages/plugin-vue/src/index.ts index 322d0553..477eda57 100644 --- a/packages/plugin-vue/src/index.ts +++ b/packages/plugin-vue/src/index.ts @@ -387,6 +387,10 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin { getTempSrcDescriptor(filename, query) : getDescriptor(filename, options.value)! + if (query.src) { + this.addWatchFile(filename) + } + if (query.type === 'template') { return transformTemplateAsModule( code, diff --git a/playground/vue-external/src-import/SrcImport.vue b/playground/vue-external/src-import/SrcImport.vue new file mode 100644 index 00000000..3e753e18 --- /dev/null +++ b/playground/vue-external/src-import/SrcImport.vue @@ -0,0 +1,4 @@ + + + + diff --git a/playground/vue-external/src-import/css.module.css b/playground/vue-external/src-import/css.module.css new file mode 100644 index 00000000..09b5c09f --- /dev/null +++ b/playground/vue-external/src-import/css.module.css @@ -0,0 +1,7 @@ +.one { + background: yellow; +} + +.two { + border: solid 1px red; +} diff --git a/playground/vue-external/src-import/script.ts b/playground/vue-external/src-import/script.ts new file mode 100644 index 00000000..1a9f7ec3 --- /dev/null +++ b/playground/vue-external/src-import/script.ts @@ -0,0 +1,19 @@ +import { defineComponent } from 'vue' +import SrcImportStyle from './srcImportStyle.vue' +import SrcImportStyle2 from './srcImportStyle2.vue' +import SrcImportModuleStyle from './srcImportModuleStyle.vue' +import SrcImportModuleStyle2 from './srcImportModuleStyle2.vue' + +export default defineComponent({ + components: { + SrcImportStyle, + SrcImportStyle2, + SrcImportModuleStyle, + SrcImportModuleStyle2, + }, + setup() { + return { + msg: 'hello from script src!', + } + }, +}) diff --git a/playground/vue-external/src-import/srcImportModuleStyle.vue b/playground/vue-external/src-import/srcImportModuleStyle.vue new file mode 100644 index 00000000..15969778 --- /dev/null +++ b/playground/vue-external/src-import/srcImportModuleStyle.vue @@ -0,0 +1,4 @@ + + + + diff --git a/playground/vue-external/src-import/srcImportStyle2.vue b/playground/vue-external/src-import/srcImportStyle2.vue new file mode 100644 index 00000000..eaf25b7c --- /dev/null +++ b/playground/vue-external/src-import/srcImportStyle2.vue @@ -0,0 +1,4 @@ + + diff --git a/playground/vue-external/src-import/style.css b/playground/vue-external/src-import/style.css new file mode 100644 index 00000000..98bb04dc --- /dev/null +++ b/playground/vue-external/src-import/style.css @@ -0,0 +1,3 @@ +.external-src-imports-style { + color: tan; +} diff --git a/playground/vue-external/src-import/style2.css b/playground/vue-external/src-import/style2.css new file mode 100644 index 00000000..d929aeea --- /dev/null +++ b/playground/vue-external/src-import/style2.css @@ -0,0 +1,3 @@ +.external-src-imports-script { + color: #0088ff; +} diff --git a/playground/vue-external/src-import/template.html b/playground/vue-external/src-import/template.html new file mode 100644 index 00000000..61842d54 --- /dev/null +++ b/playground/vue-external/src-import/template.html @@ -0,0 +1,7 @@ +

External SFC Src Imports

+
{{ msg }}
+
This should be tan
+ + + + diff --git a/playground/vue/Main.vue b/playground/vue/Main.vue index 1e15285f..b25b54e9 100644 --- a/playground/vue/Main.vue +++ b/playground/vue/Main.vue @@ -18,6 +18,7 @@ +
this should be red
@@ -48,6 +49,7 @@ import CssModules from './CssModules.vue' import Assets from './Assets.vue' import CustomBlock from './CustomBlock.vue' import SrcImport from './src-import/SrcImport.vue' +import ExternalSrcImport from '#external/src-import/SrcImport.vue' import Slotted from './Slotted.vue' import ScanDep from './ScanDep.vue' import TsImport from './TsImport.vue' diff --git a/playground/vue/__tests__/vue.spec.ts b/playground/vue/__tests__/vue.spec.ts index d7ec3e74..13ff034f 100644 --- a/playground/vue/__tests__/vue.spec.ts +++ b/playground/vue/__tests__/vue.spec.ts @@ -280,6 +280,38 @@ describe('src imports', () => { }) }) +describe('external src imports', () => { + test('script src with ts', async () => { + expect(await page.textContent('.external-src-imports-script')).toMatch( + 'hello from script src', + ) + editFile('../vue-external/src-import/script.ts', (code) => + code.replace('hello from script src', 'updated'), + ) + await untilUpdated( + () => page.textContent('.external-src-imports-script'), + 'updated', + ) + }) + + test('style src', async () => { + const el = await page.$('.external-src-imports-style') + expect(await getColor(el)).toBe('tan') + editFile('../vue-external/src-import/style.css', (code) => + code.replace('color: tan', 'color: red'), + ) + await untilUpdated(() => getColor(el), 'red') + }) + + test('template src import hmr', async () => { + const el = await page.$('.external-src-imports-style') + editFile('../vue-external/src-import/template.html', (code) => + code.replace('should be tan', 'should be red'), + ) + await untilUpdated(() => el.textContent(), 'should be red') + }) +}) + describe('custom blocks', () => { test('should work', async () => { expect(await page.textContent('.custom-block')).toMatch('こんにちは') diff --git a/playground/vue/vite.config.ts b/playground/vue/vite.config.ts index 7b971526..1abc0069 100644 --- a/playground/vue/vite.config.ts +++ b/playground/vue/vite.config.ts @@ -8,6 +8,8 @@ export default defineConfig({ alias: { '/@': __dirname, '@': __dirname, + '#external': resolve(__dirname, '../vue-external'), + '/#external': resolve(__dirname, '../vue-external'), }, }, plugins: [