In a native React application, it is common that you have the CSS separated by components like I said here, actually maybe you want to use a separate SCSS to take advantage from SASS. So to do it in a Liferay React Application, we need to do some configurations.
We are working a Structure of OSGi Bundles Containing NPM Packages wrapper by Portlet Component, for this reason, by default you have this style.css loaded by a portlet-header, and if you try to use a separate CSS or SASS file by component doesn't work and you will get an error.
So basically always when a developer wants to add new styles always needs to be put on assets/css/style.css file right? Not all... so you should be asking for “how can I have my components and scss modularized in this React Widget?” The answer is with “sass-loader” and “css-loader” and in this tutorial you will know the few steps to do it.
Requirements: Node, Yeoman and NPM Installed
1. First, it is necessary to install liferay-js by running this command:
npm install -g generator-liferay-js
2. Run the generator inside your “liferay-workspace/modules” or some other project folder which you are using
3. Choose the “React Widget” type and fill in the rest of the information needed:
4. Inside src create a CSS file “AppComponent.scss” and add the following style:
5. Open AppComponent.js file from source and add at the first div the className “pink-background” and save it.
6. Now we need to install the liferay-npm-bundler-loader-sass-loader, which will run a sass or node-sass from your project and convert a SASS or SCSS file to CSS files.
npm install --save-dev liferay-npm-bundler-loader-sass-loader
npm install --save-dev liferay-npm-bundler-loader-css-loader
8. Now to do the configuration for works the CSS by URL you need to set the “source” and “rules” in .npmbundlerrc, adding the follow it code
"sources" : ["src", "assets"],
9. The final .npmbundlerrc should look like this:
10. Now deploy it
npm run deploy
11. Add the application to Liferay Portal’s page and now it should look like the image below: