Skip to content

Commit 56942b9

Browse files
Nathan ReidGuillaume Chau
authored andcommitted
add support for customizing the name of CSS modules property via the module attribute (#145)
1 parent 2e51055 commit 56942b9

File tree

3 files changed

+35
-7
lines changed

3 files changed

+35
-7
lines changed

packages/vue-component/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,26 @@ As an alternative to scoped styles, you can use CSS modules to scope your CSS to
9696
</script>
9797
```
9898

99+
By default, your styles will be assigned to the `$style` computed property. You can customize this by setting the module attribute. This also allows you to create multiple "modules" in one component file:
100+
101+
```html
102+
<style module="foo">
103+
.color {
104+
color: orange;
105+
}
106+
</style>
107+
<style module="bar">
108+
.color {
109+
color: purple;
110+
}
111+
</style>
112+
113+
<template>
114+
<div :class="foo.color">Foo Text</div>
115+
<div :class="bar.color">Bar Text</div>
116+
</template>
117+
```
118+
99119
Note: composing from other files is not supported by the built-in CSS modules processor. See the community packages.
100120

101121
### Language packages

packages/vue-component/plugin/tag-handler.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ VueComponentTagHandler = class VueComponentTagHandler {
312312

313313
// CSS Modules
314314
let isAsync = false;
315+
let defaultModuleName = '$style';
315316
if (styleTag.attribs.module) {
316317
if (global.vue.cssModules) {
317318
try {
@@ -328,7 +329,11 @@ VueComponentTagHandler = class VueComponentTagHandler {
328329
css = result.css;
329330
cssMap = result.map;
330331
if (result.cssModules) {
331-
cssModules = { ...(cssModules || {}), ...result.cssModules };
332+
const moduleName = typeof styleTag.attribs.module === 'string' ? styleTag.attribs.module : defaultModuleName;
333+
if (cssModules === undefined) {
334+
cssModules = {};
335+
}
336+
cssModules[moduleName] = { ...(cssModules[moduleName] || {}), ...result.cssModules };
332337
}
333338
if (result.js) {
334339
js += result.js;
@@ -344,18 +349,20 @@ VueComponentTagHandler = class VueComponentTagHandler {
344349
});
345350
}
346351
} else {
347-
const moduleName = typeof styleTag.attribs.module === 'string' ? styleTag.attribs.module : '';
348-
const scopedModuleName = moduleName ? `_${moduleName}` : '';
352+
const moduleName = typeof styleTag.attribs.module === 'string' ? styleTag.attribs.module : defaultModuleName;
353+
const scopedModuleName = moduleName !== defaultModuleName ? `__${moduleName}` : '';
349354
plugins.push(postcssModules({
350355
getJSON(cssFilename, json) {
351-
cssModules = { ...(cssModules || {}), ...json };
356+
if (cssModules === undefined)
357+
cssModules = {};
358+
cssModules[moduleName] = { ...(cssModules[moduleName] || {}), ...json };
352359
},
353360
generateScopedName(exportedName, filePath) {
354361
const path = require('path');
355362
let sanitisedPath = path.relative(process.cwd(), filePath).replace(/.*\{}[/\\]/, '').replace(/.*\{.*?}/, 'packages').replace(/\.[^\.\/\\]+$/, '').replace(/[\W_]+/g, '_');
356363
const filename = path.basename(filePath).replace(/\.[^\.\/\\]+$/, '').replace(/[\W_]+/g, '_');
357364
sanitisedPath = sanitisedPath.replace(new RegExp(`_(${filename})$`), '__$1');
358-
return `_${sanitisedPath}__${exportedName}`;
365+
return `_${sanitisedPath}${scopedModuleName}__${exportedName}`;
359366
},
360367
}));
361368
isAsync = true;

packages/vue-component/plugin/vue-compiler.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,10 +582,11 @@ function generateJs (vueId, inputFile, compileResult, isHotReload = false) {
582582

583583
// CSS Modules
584584
if(compileResult.cssModules) {
585+
const modules = Object.keys(compileResult.cssModules);
585586
const modulesCode = '__vue_options__.computed = __vue_options__.computed || {};\n' +
586-
`__vue_options__.computed.$style = function() {\n return ${JSON.stringify(compileResult.cssModules)}\n};\n`;
587+
modules.map(module=>`__vue_options__.computed['${module}'] = function() {\n return ${JSON.stringify(compileResult.cssModules[module])}\n};\n`).join('\n');
587588
js += modulesCode;
588-
console.log(modulesCode)
589+
// console.log(modulesCode);
589590
}
590591

591592
// Package context

0 commit comments

Comments
 (0)