diff --git a/packages/vue-component/README.md b/packages/vue-component/README.md
index b099f69..d108130 100644
--- a/packages/vue-component/README.md
+++ b/packages/vue-component/README.md
@@ -96,6 +96,26 @@ As an alternative to scoped styles, you can use CSS modules to scope your CSS to
```
+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:
+
+```html
+
+
+
+
+ Foo Text
+ Bar Text
+
+```
+
Note: composing from other files is not supported by the built-in CSS modules processor. See the community packages.
### Language packages
diff --git a/packages/vue-component/plugin/tag-handler.js b/packages/vue-component/plugin/tag-handler.js
index 17898c4..17ecdc6 100644
--- a/packages/vue-component/plugin/tag-handler.js
+++ b/packages/vue-component/plugin/tag-handler.js
@@ -312,6 +312,7 @@ VueComponentTagHandler = class VueComponentTagHandler {
// CSS Modules
let isAsync = false;
+ let defaultModuleName = '$style';
if (styleTag.attribs.module) {
if (global.vue.cssModules) {
try {
@@ -328,7 +329,11 @@ VueComponentTagHandler = class VueComponentTagHandler {
css = result.css;
cssMap = result.map;
if (result.cssModules) {
- cssModules = { ...(cssModules || {}), ...result.cssModules };
+ const moduleName = typeof styleTag.attribs.module === 'string' ? styleTag.attribs.module : defaultModuleName;
+ if (cssModules === undefined) {
+ cssModules = {};
+ }
+ cssModules[moduleName] = { ...(cssModules[moduleName] || {}), ...result.cssModules };
}
if (result.js) {
js += result.js;
@@ -344,18 +349,20 @@ VueComponentTagHandler = class VueComponentTagHandler {
});
}
} else {
- const moduleName = typeof styleTag.attribs.module === 'string' ? styleTag.attribs.module : '';
- const scopedModuleName = moduleName ? `_${moduleName}` : '';
+ const moduleName = typeof styleTag.attribs.module === 'string' ? styleTag.attribs.module : defaultModuleName;
+ const scopedModuleName = moduleName !== defaultModuleName ? `__${moduleName}` : '';
plugins.push(postcssModules({
getJSON(cssFilename, json) {
- cssModules = { ...(cssModules || {}), ...json };
+ if (cssModules === undefined)
+ cssModules = {};
+ cssModules[moduleName] = { ...(cssModules[moduleName] || {}), ...json };
},
generateScopedName(exportedName, filePath) {
const path = require('path');
let sanitisedPath = path.relative(process.cwd(), filePath).replace(/.*\{}[/\\]/, '').replace(/.*\{.*?}/, 'packages').replace(/\.[^\.\/\\]+$/, '').replace(/[\W_]+/g, '_');
const filename = path.basename(filePath).replace(/\.[^\.\/\\]+$/, '').replace(/[\W_]+/g, '_');
sanitisedPath = sanitisedPath.replace(new RegExp(`_(${filename})$`), '__$1');
- return `_${sanitisedPath}__${exportedName}`;
+ return `_${sanitisedPath}${scopedModuleName}__${exportedName}`;
},
}));
isAsync = true;
diff --git a/packages/vue-component/plugin/vue-compiler.js b/packages/vue-component/plugin/vue-compiler.js
index 5e10406..a73a3dd 100644
--- a/packages/vue-component/plugin/vue-compiler.js
+++ b/packages/vue-component/plugin/vue-compiler.js
@@ -582,10 +582,11 @@ function generateJs (vueId, inputFile, compileResult, isHotReload = false) {
// CSS Modules
if(compileResult.cssModules) {
+ const modules = Object.keys(compileResult.cssModules);
const modulesCode = '__vue_options__.computed = __vue_options__.computed || {};\n' +
- `__vue_options__.computed.$style = function() {\n return ${JSON.stringify(compileResult.cssModules)}\n};\n`;
+ modules.map(module=>`__vue_options__.computed['${module}'] = function() {\n return ${JSON.stringify(compileResult.cssModules[module])}\n};\n`).join('\n');
js += modulesCode;
- console.log(modulesCode)
+ // console.log(modulesCode);
}
// Package context