|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- # babel-plugin-emotion
-
- > Babel plugin for the minification and optimization of emotion styles.
-
- `babel-plugin-emotion` is highly recommended, but not required in version 8 and
- above of `emotion`.
-
- ## Features
-
- <table>
- <thead>
- <tr>
- <th>Feature/Syntax</th>
- <th>Native</th>
- <th>Babel Plugin Required</th>
- <th>Notes</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><code>css``</code></td>
- <td align="center">✅</td>
- <td align="center"></td>
- <td></td>
- </tr>
- <tr>
- <td><code>css(...)</code></td>
- <td align="center">✅</td>
- <td align="center"></td>
- <td>Generally used for object styles.</td>
- </tr>
- <tr>
- <td>components as selectors</td>
- <td align="center"></td>
- <td align="center">✅</td>
- <td>Allows an emotion component to be <a href="https://emotion.sh/docs/styled#targeting-another-emotion-component">used as a CSS selector</a>.</td>
- </tr>
- <tr>
- <td>Minification</td>
- <td align="center"></td>
- <td align="center">✅</td>
- <td>Any leading/trailing space between properties in your <code>css</code> and <code>styled</code> blocks is removed. This can reduce the size of your final bundle.</td>
- </tr>
- <tr>
- <td>Dead Code Elimination</td>
- <td align="center"></td>
- <td align="center">✅</td>
- <td>Uglifyjs will use the injected <code>/*#__PURE__*/</code> flag comments to mark your <code>css</code> and <code>styled</code> blocks as candidates for dead code elimination.</td>
- </tr>
- <tr>
- <td>Source Maps</td>
- <td align="center"></td>
- <td align="center">✅</td>
- <td>When enabled, navigate directly to the style declaration in your javascript file.</td>
- </tr>
- <tr>
- <td>Contextual Class Names</td>
- <td align="center"></td>
- <td align="center">✅</td>
- <td>Generated class names include the name of the variable or component they were defined in.</td>
- </tr>
- </tbody>
- </table>
-
- ## Example
-
- **In**
-
- ```javascript
- const myStyles = css`
- font-size: 20px;
- @media (min-width: 420px) {
- color: blue;
- ${css`
- width: 96px;
- height: 96px;
- `};
- line-height: 26px;
- }
- background: green;
- ${{ backgroundColor: 'hotpink' }};
- `
- ```
-
- **Out**
-
- ```javascript
- const myStyles = /* #__PURE__ */ css(
- 'font-size:20px;@media(min-width:420px){color:blue;',
- /* #__PURE__ */ css('width:96px;height:96px;'),
- ';line-height:26px;}background:green;',
- { backgroundColor: 'hotpink' },
- ';'
- )
- ```
-
- ## Installation
-
- ```bash
- yarn add --dev babel-plugin-emotion
- ```
-
- or if you prefer npm
-
- ```bash
- npm install --save-dev babel-plugin-emotion
- ```
-
- ## Usage
-
- ### Via `.babelrc` (Recommended)
-
- **.babelrc**
-
- Without options:
-
- ```json
- {
- "plugins": ["emotion"]
- }
- ```
-
- With options:
-
- _Defaults Shown_
-
- ```js
- {
- "plugins": [
- [
- "emotion",
- {
- // sourceMap is on by default but source maps are dead code eliminated in production
- "sourceMap": true,
- "autoLabel": process.env.NODE_ENV !== 'production',
- "labelFormat": "[local]",
- "cssPropOptimization": true
- }
- ]
- ]
- }
- ```
-
- Recommended Setup
-
- **.babelrc**
-
- ```json
- {
- "plugins": ["emotion"]
- }
- ```
-
- ### Via CLI
-
- ```bash
- babel --plugins babel-plugin-emotion script.js
- ```
-
- ### Via Node API
-
- ```javascript
- require('@babel/core').transform('code', {
- plugins: ['babel-plugin-emotion']
- })
- ```
-
- ## Options
-
- ### `sourceMap`
-
- `boolean`, defaults to `true`.
-
- This option enables the following:
-
- - Injected source maps for use in browser dev tools
-
- [**Documentation**](https://emotion.sh/docs/source-maps)
-
- > Note:
- >
- > Source maps are on by default in babel-plugin-emotion but they will be removed in production builds
-
- ### `autoLabel`
-
- `boolean`, defaults to `process.env.NODE_ENV !== 'production'`.
-
- This option enables the following:
-
- - Automatically adds the `label` property to styles so that class names
- generated by `css` or `styled` include the name of the variable the result is
- assigned to.
- - Please note that non word characters in the variable will be removed
- (Eg. `iconStyles$1` will become `iconStyles1`) because `$` is not valid
- [CSS ClassName Selector](https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors#449000)
-
- #### css
-
- **In**
-
- ```javascript
- const brownStyles = css({ color: 'brown' })
- ```
-
- **Out**
-
- ```javascript
- const brownStyles = /*#__PURE__*/ css({ color: 'brown' }, 'label:brownStyles;')
- ```
-
- `brownStyles`'s value would be `css-1q8eu9e-brownStyles`
-
- ### `labelFormat`
-
- `string`, defaults to `"[local]"`.
-
- This option only works when `autoLabel` is set to `true`. It allows you to
- define the format of the resulting `label`. The format is defined via string where
- variable parts are enclosed in square brackets `[]`.
- For example `labelFormat: "my-classname--[local]"`, where `[local]` will be replaced
- with the name of the variable the result is assigned to.
-
- Allowed values:
-
- - `[local]` - the name of the variable the result of the `css` or `styled` expression is assigned to.
- - `[filename]` - name of the file (without extension) where `css` or `styled` expression is located.
- - `[dirname]` - name of the directory containing the file where `css` or `styled` expression is located.
-
- This format only affects the label property of the expression, meaning that the `css` prefix and hash will
- be prepended automatically.
-
- #### css
-
- **In**
-
- ```javascript
- // BrownView.js
- // autoLabel: true
- // labelFormat: '[filename]--[local]'
- const brownStyles = css({ color: 'brown' })
- ```
-
- **Out**
-
- ```javascript
- const brownStyles = /*#__PURE__*/ css(
- { color: 'brown' },
- 'label:BrownView--brownStyles;'
- )
- ```
-
- `BrownView--brownStyles`'s value would be `css-hash-BrownView--brownStyles`
-
- #### styled
-
- **In**
-
- ```javascript
- const H1 = styled.h1({
- borderRadius: '50%',
- transition: 'transform 400ms ease-in-out',
- boxSizing: 'border-box',
- display: 'flex',
- ':hover': {
- transform: 'scale(1.2)'
- }
- })
- ```
-
- **Out**
-
- ```javascript
- const H1 = /*#__PURE__*/ styled('h1', {
- label: 'H1'
- })({
- borderRadius: '50%',
- transition: 'transform 400ms ease-in-out',
- boxSizing: 'border-box',
- display: 'flex',
- ':hover': {
- transform: 'scale(1.2)'
- }
- })
- ```
-
- `H1`'s class name attribute would be `css-hash-H1`
-
- ### `instances`
-
- `Array<string>`, defaults to
-
- ```jsx
- ;['emotion']
- ```
-
- This option allows `babel-plugin-emotion` to know which imports to treat as
- emotion imports and transform as such. This option is **only** required if you
- use a custom instance of emotion created with `create-emotion` or you're
- importing emotion from somewhere other than the paths above. Relative paths are
- resolved relative to `process.cwd()`(the current working directory).
-
- [**Documentation**](https://emotion.sh/docs/instances)
-
- ### `cssPropOptimization`
-
- `boolean`, defaults to `true`.
-
- This option assumes that you are using something to make `@emotion/core`'s `jsx` function work for all jsx. If you are not doing so and you do not want such optimizations to occur, disable this option.
-
- ## Babel Macros
-
- Instead of using `babel-plugin-emotion`, you can use emotion with [`babel-plugin-macros`](https://github.com/kentcdodds/babel-plugin-macros). Add `babel-plugin-macros` to your babel config (which is included in Create React App 2.0) and use the imports/packages shown below.
-
- ```jsx
- import styled from 'react-emotion/macro'
- import { css, keyframes, injectGlobal, flush, hydrate } from 'emotion/macro'
- import css from '@emotion/css/macro'
- import styled from '@emotion/styled/macro'
- ```
|