From 022fb1de350c9ed1236bc3558e2b695c510e736f Mon Sep 17 00:00:00 2001 From: Jinjiang Date: Fri, 7 Jul 2023 15:58:12 +0800 Subject: [PATCH 1/4] feat: support external scoped style --- packages/plugin-vue/src/index.ts | 29 ++++++++++++++++++++++++++ packages/plugin-vue/src/utils/query.ts | 1 + 2 files changed, 30 insertions(+) diff --git a/packages/plugin-vue/src/index.ts b/packages/plugin-vue/src/index.ts index d2109370..a625c00a 100644 --- a/packages/plugin-vue/src/index.ts +++ b/packages/plugin-vue/src/index.ts @@ -9,6 +9,8 @@ import type { SFCTemplateCompileOptions, } from 'vue/compiler-sfc' import type * as _compiler from 'vue/compiler-sfc' +import type { ExistingRawSourceMap } from 'rollup' +import type { RawSourceMap } from 'source-map' /* eslint-enable import/no-duplicates */ import { resolveCompiler } from './compiler' import { parseVueRequest } from './utils/query' @@ -201,6 +203,12 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin { } const { filename, query } = parseVueRequest(id) + + // external scoped style + if (!query.vue && query.scoped) { + return fs.readFileSync(filename, 'utf-8') + } + // select corresponding block for sub-part virtual modules if (query.vue) { if (query.src) { @@ -230,10 +238,31 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin { transform(code, id, opt) { const ssr = opt?.ssr === true const { filename, query } = parseVueRequest(id) + if (query.raw || query.url) { return } + + if (!query.vue && query.scoped) { + // external scoped style + const result = options.compiler.compileStyle({ + filename, + source: code, + id: `data-v-${query.id}`, + scoped: true, + isProd: options.isProduction, + }) + return { + code: result.code, + map: result.map as Omit< + RawSourceMap, + 'version' + > as ExistingRawSourceMap, + } + } + if (!filter(filename) && !query.vue) { + // transform ref necessarily if ( !query.vue && refTransformFilter(filename) && diff --git a/packages/plugin-vue/src/utils/query.ts b/packages/plugin-vue/src/utils/query.ts index 66fe103c..29417a22 100644 --- a/packages/plugin-vue/src/utils/query.ts +++ b/packages/plugin-vue/src/utils/query.ts @@ -7,6 +7,7 @@ export interface VueQuery { raw?: boolean url?: boolean scoped?: boolean + id?: string } export function parseVueRequest(id: string): { From d6a2d8064c8e347aeae3405dcded2620456be7fb Mon Sep 17 00:00:00 2001 From: Jinjiang Date: Fri, 7 Jul 2023 18:01:34 +0800 Subject: [PATCH 2/4] test: add test cases for pre-compiled components --- playground/vue/Main.vue | 6 ++ playground/vue/__tests__/vue.spec.ts | 12 ++++ .../pre-compiled/external-cssmodules.vue.js | 59 ++++++++++++++++++ .../vue/pre-compiled/external-scoped.vue.js | 62 +++++++++++++++++++ playground/vue/pre-compiled/external.css | 3 + .../vue/pre-compiled/external.module.css | 6 ++ playground/vue/pre-compiled/foo.vue.js | 55 ++++++++++++++++ playground/vue/pre-compiled/foo.vue__0.css | 3 + 8 files changed, 206 insertions(+) create mode 100644 playground/vue/pre-compiled/external-cssmodules.vue.js create mode 100644 playground/vue/pre-compiled/external-scoped.vue.js create mode 100644 playground/vue/pre-compiled/external.css create mode 100644 playground/vue/pre-compiled/external.module.css create mode 100644 playground/vue/pre-compiled/foo.vue.js create mode 100644 playground/vue/pre-compiled/foo.vue__0.css diff --git a/playground/vue/Main.vue b/playground/vue/Main.vue index 1fbea3df..2821d5da 100644 --- a/playground/vue/Main.vue +++ b/playground/vue/Main.vue @@ -28,6 +28,9 @@ + + +