Skip to content

Commit dac8075

Browse files
authored
fix(plugin-vue): make cssm code tree shakeable (#6353)
1 parent 91be66b commit dac8075

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

packages/plugin-vue/src/main.ts

+22-12
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ async function genStyleCode(
299299
attachedProps: [string, string][]
300300
) {
301301
let stylesCode = ``
302-
let hasCSSModules = false
302+
let cssModulesMap: Record<string, string> | undefined
303303
if (descriptor.styles.length) {
304304
for (let i = 0; i < descriptor.styles.length; i++) {
305305
const style = descriptor.styles[i]
@@ -320,12 +320,13 @@ async function genStyleCode(
320320
`<style module> is not supported in custom elements mode.`
321321
)
322322
}
323-
if (!hasCSSModules) {
324-
stylesCode += `\nconst cssModules = {}`
325-
attachedProps.push([`__cssModules`, `cssModules`])
326-
hasCSSModules = true
327-
}
328-
stylesCode += genCSSModulesCode(i, styleRequest, style.module)
323+
const [importCode, nameMap] = genCSSModulesCode(
324+
i,
325+
styleRequest,
326+
style.module
327+
)
328+
stylesCode += importCode
329+
Object.assign((cssModulesMap ||= {}), nameMap)
329330
} else {
330331
if (asCustomElement) {
331332
stylesCode += `\nimport _style_${i} from ${JSON.stringify(
@@ -344,22 +345,31 @@ async function genStyleCode(
344345
])
345346
}
346347
}
348+
if (cssModulesMap) {
349+
const mappingCode =
350+
Object.entries(cssModulesMap).reduce(
351+
(code, [key, value]) => code + `"${key}":${value},\n`,
352+
'{\n'
353+
) + '}'
354+
stylesCode += `\nconst cssModules = ${mappingCode}`
355+
attachedProps.push([`__cssModules`, `cssModules`])
356+
}
347357
return stylesCode
348358
}
349359

350360
function genCSSModulesCode(
351361
index: number,
352362
request: string,
353363
moduleName: string | boolean
354-
): string {
364+
): [importCode: string, nameMap: Record<string, string>] {
355365
const styleVar = `style${index}`
356366
const exposedName = typeof moduleName === 'string' ? moduleName : '$style'
357367
// inject `.module` before extension so vite handles it as css module
358368
const moduleRequest = request.replace(/\.(\w+)$/, '.module.$1')
359-
return (
360-
`\nimport ${styleVar} from ${JSON.stringify(moduleRequest)}` +
361-
`\ncssModules["${exposedName}"] = ${styleVar}`
362-
)
369+
return [
370+
`\nimport ${styleVar} from ${JSON.stringify(moduleRequest)}`,
371+
{ [exposedName]: styleVar }
372+
]
363373
}
364374

365375
async function genCustomBlockCode(

0 commit comments

Comments
 (0)