Integrating CSS / PostCSS
In this recipe we will add in JS CSS imports to the scaffold. Like with an other recipe we assume that you already created your service with the create-react-microservice
CLI and it is working properly.
Table of Contents
- Adding an example CSS import to the scaffold
- Installing new dependencies
- Configuring PostCSS
- Configuring Flow
- Adjusting the server-side webpack config
- Adjusting the client-side webpack config
Adding an example CSS import to the scaffold
First let's add an generic CSS file into the main applications package, head into e.g. packages/my-fancy-ui/src/pages/
and create a style.css
file and paste the following contents into it.
.exampleCssIntegrationClassName {
color: red;
}
Afterwards open up the pages/index.js
, import the css file, e.g. import './style.css'
and propagate the className a div, e.g. <div className="exampleCssIntegrationClassName" />
.
Installing new dependencies
After creating the integration, let's install all dependencies that are needed to let webpack know how to process CSS files. Head into your config package, e.g. packages/my-fancy-ui-config/
and execute the following commands.
yarn add style-loader css-loader null-loader postcss-loader extract-text-webpack-plugin autoprefixer
Configuring PostCSS
Since we want to use PostCSS we should add a config file for postCSS on the same level as the webpack configs, e.g. packages/my-fancy-ui-config/src/postcss.config.js
. Create the file and insert the following contents into it.
module.exports = {
plugins: {
autoprefixer: {}
}
};
Configuring Flow
Out of the box Flow will not be able to parse / understand the css
imports, we re-map every .css
import into an empty object type, add the following line into the [options]
of the build/.flowconfig
file in the root of your mono repository.
module.name_mapper='.*\(.css\)' -> 'empty/object'
Adjusting the server-side webpack config
Since we don't need to compile the CSS for the server, let's head into the default configuration of webpack for the server side bundle, e.g. packages/my-fancy-ui-config/src/webpack.config.server.defaults.js
. Open up the file and add the following snippet into the module.rules
array.
{
test: /\.(scss|sass|css)$/,
use: "null-loader"
}
Adjusting the client-side webpack config
Afterwards we can continue with the client webpack configuration, open up the default configuration of webpack for the client side bundle, e.g. packages/my-fancy-ui-config/src/webpack.config.client.defaults.js
. Open up the file and add the following constants to the top of the file.
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const extractCss = new ExtractTextPlugin({
filename: "[name].[contenthash].css"
});
... and jump to the module.rules
array and add the following rule to it.
{
test: /\.(css|scss|sass)$/,
use: extractCss.extract({
use: [
{
loader: "css-loader",
options: {
minimize: !isDev,
sourceMap: config.webpack.hasSourceMaps
}
},
{
loader: "postcss-loader",
options: {
config: {
path: path.resolve(__dirname, "postcss.config.js")
},
sourceMap: config.webpack.hasSourceMaps
}
}
],
fallback: "style-loader"
})
}
... and to finalize everything, add the extractCss
plugin to the webpack configs plugins
array, e.g.
plugins: [
extractCss,
// ... other plugins
]
And that's it - If you execute a yarn run build && yarn run start
or yarn run dev
in the root of your mono-repository you should see the headings now in red and the css being served to the client! :rocket: