How to add styled-components to a React application
Francesco Agnoletto
Posted on July 27, 2020
I've talked about the advantages of CSS-in-JS and styled-components in a previous article you can find here.
A few days ago I had to set up it from scratch again and hated doing it. It does require quite a few actions to leverage the full advantages it can offer so let's see all the steps required.
Install emotion
I prefer emotionjs between the CSS-in-JS libraries. It works very well with TypeScript and has an easy syntax.
$ npm i @emotion/core @emotion/styled
will add the basic packages. @emotion/core
is required, @emotion/styled
only if you want styled-components. I favor the latter but sometimes use core for either some small styling with css
or keyframes
.
The vscode styled-components extension for syntax highlight and IntelliSense is a must.
Setting up .babelrc
Babel requires a plugin to parse emotion.
The default setup requires installing babel-plugin-emotion
but it does not include the css
prop. @emotion/babel-preset-css-prop
does and includes the default plugin.
// the css prop
const Button: React.FC<IProps> = props => (
<a
css={{
color: 'hotpink',
'&:hover': {
color: 'darkorchid'
}
}}
{...props}
/>
)
$ npm i -D @emotion/babel-preset-css-prop
will install it.
The emotion plugin needs to appear after @babel/preset-react
and @babel/preset-typescript
in the list of plugins in case you are using them (you should!).
// recommended .babelrc config for emotionjs
{
"env": {
"production": {
"presets": [
"@babel/react",
"@babel/typescript",
"@emotion/babel-preset-css-prop"
]
},
"development": {
"presets": [
"@babel/react",
"@babel/typescript",
["@emotion/babel-preset-css-prop", { "sourceMap": true }]
]
}
}
}
Linting with style
Stylelint adds rules and checks for styled-components libraries. Since emotionjs is based on styled-components, the linting is fully compatible. It is also enabled by default.
$ npm i -D stylelint stylelint-config-standard
You can set up custom rules as well, declaration-empty-line-before
is for prettier
compatibility.
// .stylelintrc
{
"extends": [
"stylelint-config-standard"
],
"rules": {
"declaration-empty-line-before": null,
}
}
Install the vscode extension to enable default detection on vscode.
Closing thoughts
Setting up new libraries can be a chore, especially when the documentation is spread in different places.
The advantages of using styled-components outweigh the initial set up chore. But it doesn't mean it has to be a time-consuming activity.
Posted on July 27, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
September 16, 2024
October 16, 2024