diff --git a/README.md b/README.md index ba5389f..b41b56b 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,33 @@ - - # Introduction -This is a babel plugin to transform all your string classes into css-module classes automatically. +This is a babel plugin to transform all your string classes into css-module classes automatically. + +Its lets you use css-module classes without style object. +It is faster to write, improves code readability and supports multiple css-module using [named-module](#introducing-named-css-modules) -Its lets you write css-module classes just like normal classes (without using style objects). Its faster to write and improves code readability. -You can import multiple css-modules with different names and then use it as [named-module](#introducing-named-css-modules). supports \*sass/scss modules also. +Also supports \*sass/scss modules. -*\*you may need to use sass-loader with webpack* +_\*you may need to use sass-loader with webpack_ # Installation -Install the plugin using npm: +- Install the plugin with npm: + ```sh -npm install --save-dev jsx-css-module-transforms +npm install --save-dev jsx-css-module-transforms ``` -after installing, If you are using babel, add this to your plugins: + - If you are using babel, add this to your plugins: + ```jsonc // .babelrc { - "plugins": [ - "module:jsx-css-module-transforms", - ] + "plugins": ["module:jsx-css-module-transforms"] } ``` -Or, for Webpack, modify the babel-loader options to include the plugin: +- For Webpack, modify the babel-loader options to include the plugin: ```js // webpack.config.js @@ -46,8 +46,9 @@ module.exports = { } ``` -> Note: *The plugin expects source code with **JSX**, plugins that executes before might transform JSX even before it reaches to the plugin. -> If plugin isn't working or throwing unexpected errors, try keeping it at the beginning of the list.* +> Note: _The plugin relies on the **JSX** syntax. Other plugins that executes early might transform JSX +> before it reaches to the plugin which might cause some problems. jsx-css-module-transforms plugin needs +> to be placed before(ideally, at the beginning) other plugins that transform JSX._ # Usage @@ -56,36 +57,43 @@ We can import the css-module like normal css import without any import variable. ```jsx import "./m1.module.css" ``` -The plugin will automatically change this import statement to use style object, -which will then be used to access the css-module classes. + +The plugin will automatically change the import statement to include style object, +which will be used to access the css-module classes. ```jsx import _style from "./m1.module.css" // modified ``` -If we now want to use the css-module, we have to write all our css classes using style object that we just imported: +If we want to use the css-module, we need to write all our css classes using +style object that we just imported: ```jsx import _style from "./m1.module.css" function Component() { - return

.....

+ return

...

} ``` -This sometimes can get too verbose and hurts **code readibility**. It would be nice if we could write our classes as strings and not having to deal with any style objects. -*remember, because of style objects we need to introduce template strings and object notations within our `className` attribute.* +This sometimes can get too verbose and hurts **code readibility**. +It would be nice if we could write classnames within a string and not +having to deal with any style objects. + + +With the help of plugin, we don't have to use style object anymore, instead we can specify our classes by just using strings: -With the help of the plugin, we don't have to use style object anymore, instead we can specify our classes just using strings: ```jsx import "./m1.module.css" function Component() { - return

.....

+ return

...

} ``` -This looks more readable and is faster to write as well. -The plugin will modify our code to use css-module and its style object automatically without us having to do anything: + +This looks more readable and is faster to write as well. +__jsx-css-modules-transforms__ will modify the code to use css-module and its style object automatically without +us having to do anything: ```jsx // modified @@ -96,15 +104,20 @@ function Component() { } ``` -**By default, If plugin found any `'*.module.css'` import, it will transform all our css classes to use style objects.** +The transformed code uses object bracket-notation instead of dot-notation as this allows +us to use `-` (dash) within our classnames (eg. `className="foo-bar"`). -If we want to use global css classes, we need to add `':g'` at the end of the class. This will tell plugin not to transform these classes and keep them as is: +## Global Styles + +By default, If plugin finds **any** `'*.module.css'` import, it will transform **all** the css classes +to use style objects. To use global css classnames, we need to add `':g'` at the end of the classname. +This tells plugin not to transform these classes and keep them as is: ```jsx import "./m1.module.css" function Component() { - return

....

+ return

...

} ``` @@ -113,25 +126,26 @@ function Component() { import _style from "./m1.module.css" function Component() { - return

....

+ return

...

} ``` -In this example, `'bar'` might be declared in the global stylesheet while `'foo'` and `'baz'` are scoped to the imported module. +In this example, `'bar'` might be declared in the global style-sheet, while `'foo'` and `'baz'` are +scoped to the imported css module. + -*The transformed code will use object indexing instead of dot-notation, this helps us to use dashes within our class names (eg. `className="foo-bar baz"`) or else, we would have to use camel-case pattern while using css classes.* +## Usage With Already Imported CSS-Module -## Usage With Already Imported CSS-Module +If you are already using CSS-Modules, the plugin will transform string (containing classnames) +that is given to any `className` attr. For example: -If you were already been using css-module with style objects, the plugin will see it and transform other css-classes accordingly. -for example: ```jsx import style from "./component.module.css" function Component() { return ( -
-

....

+
+

...

) } @@ -143,47 +157,51 @@ import style from "./component.module.css" function Component() { return ( -
-

....

+
+

...

) } ``` - # Introducing Named CSS-Modules -In most cases, we would be using single css-module inside our components but sometimes -it might make sense to import bunch of css-modules and use them together. +In most cases, we would be using single CSS-Module inside a component but sometimes, +It might make sense to create reusable CSS-Modules and apply them in multiple different components. -We can give names to our css-module imports, and then use it to apply specific css classes from different modules - -eg. we can import two module and use them like: +In order to work with named CSS-Modules, we need to give names to each css-module import +by adding `:` at the end of the path: ```jsx -// original - import "./layout.module.css:layout" -import "./component.module.css:comp" +import "./component.module.css:com" +``` +To access CSS-Module class, simply add `:` at the end of the classname that specifies which CSS-Module +to use for the class: + +```jsx function Component() { return ( -
-

...

-
+
    +
  • ...
  • +
  • ...
  • +
) } +``` +Transformed code would look like this: -// modified - +```jsx import _layout from "./layout.module.css" -import _comp from "./component.module.css" +import _com from "./component.module.css" function Component() { return ( -
-

-
+
    +
  • ...
  • +
  • ...
  • +
) } ```