babel-plugin-emotion-avantstay
v9.2.11
Published
A recommended babel preprocessing plugin for emotion, The Next Generation of CSS-in-JS.
Downloads
3
Maintainers
Readme
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
Example
In
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
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
yarn add --dev babel-plugin-emotion
or if you prefer npm
npm install --save-dev babel-plugin-emotion
Usage
Via .babelrc
(Recommended)
.babelrc
Without options:
{
"plugins": ["emotion"]
}
With options:
Defaults Shown
{
"plugins": [
[
"emotion",
{
"hoist": false,
"sourceMap": false,
"autoLabel": false,
"labelFormat": "[local]",
"extractStatic": false,
"outputDir": "",
"importedNames": {
"styled": "styled",
"css": "css",
"keyframes": "keyframes",
"injectGlobal": "injectGlobal",
"merge": "merge"
}
}
]
]
}
Recommended Setup
.babelrc
{
"env": {
"production": {
"plugins": [["emotion", { "hoist": true }]]
},
"development": {
"plugins": [["emotion", { "sourceMap": true, "autoLabel": true }]]
}
}
}
Via CLI
babel --plugins babel-plugin-emotion script.js
Via Node API
require('@babel/core').transform('code', {
plugins: ['babel-plugin-emotion']
})
Options
hoist
boolean
, defaults to false
.
This option enables the following:
- Any argument supplied to
css
orstyled
is hoisted.
By hoisting the argument, or assigning the value to a variable, emotion is able to leverage the use of a WeakMapcache to increase performance. Users of object styles with css
prop will benefit the most from enabling this option.
In
const Sample = () => <div css={{ background: 'brown' }} />
Out
var _css = require('emotion').css
var _ref = { background: 'brown' }
const Sample = () => <div className={_css(_ref)} />
sourceMap
boolean
, defaults to false
.
This option enables the following:
- Injected source maps for use in browser dev tools
autoLabel
boolean
, defaults to false
.
This option enables the following:
- Automatically adds the
label
property to styles so that class names generated bycss
orstyled
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 becomeiconStyles1
) because$
is not valid CSS ClassName Selector
css
In
const brownStyles = css({ color: 'brown' })
Out
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 thecss
orstyled
expression is assigned to.[filename]
- name of the file (without extension) wherecss
orstyled
expression is located.
This format only affects the label property of the expression, meaning that css
prefix and hash will
be prepended automatically.
css
In
// BrownView.js
// autoLabel: true
// labelFormat: [filename]--[local]
const brownStyles = css({ color: 'brown' })
Out
const brownStyles = /*#__PURE__*/ css(
{ color: 'brown' },
'label:BrownView--brownStyles;'
)
BrownView--brownStyles
's value would be css-1q8eu9e-BrownView--brownStyles
styled
In
const Profile = () => {
const H1 = styled.h1({
borderRadius: '50%',
transition: 'transform 400ms ease-in-out',
boxSizing: 'border-box',
display: 'flex',
':hover': {
transform: 'scale(1.2)'
}
})
}
Out
const Profile = () => {
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-13djram-H1
extractStatic
boolean
, defaults to false
.
Note:
extractStatic is deprecated and will be removed in emotion@10. We recommend disabling extractStatic or using other libraries like linaria or css-literal-loader
This option enables the following:
- Extract static styles into CSS files.
outputDir
string
, defaults to ''
This option only works when extractStatic
is set to true. This option allows babel-plugin-emotion
to set a different directory to where the extracted css files are saved to.
importedNames
object
, defaults to
{
"styled": "styled",
"css": "css",
"keyframes": "keyframes",
"injectGlobal": "injectGlobal",
"merge": "merge"
}
This option enables the following:
- Configurable import names
instances
Array<string>
, defaults to
;['emotion', 'react-emotion', 'preact-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).
primaryInstance
string
, defaults to
'emotion'
This option allows babel-plugin-emotion
to know where to import emotion from
when it needs to import emotion. Currently this is only used for the css prop to
import css
and merge
but it could be used for other purposes in the future
so it's recommend to make sure that this instance exports everything returned
from createEmotion
,
an up-to-date example of this can be found in the emotion package's source.
Babel Macros
Instead of using babel-plugin-emotion
, you can use emotion with babel-plugin-macros
. Add babel-plugin-macros
to your babel config and import whatever you want from emotion but add /macro
to the end. Currently every API except for the css prop is supported by the macro.
import styled from 'react-emotion/macro'
import { css, keyframes, injectGlobal, flush, hydrate } from 'emotion/macro'