Some third-party modules I'm using have their own CSS files. I'd like to include them in my app's one, single CSS file, which is processed by Webpack. How can CSS files under "node_modules" be imported into my CSS file?
For example, I'm using the third-party react-select
module, but I can't import its CSS file from node_modules
:
@import 'react-select/dist/react-datetime.css';
The relevant loader in webpack.config.js
:
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
url: false
}
}
]
})
}
To be able to use CSS in your webpack app, you need to set up a new loader. Out-of-the-box, webpack only understands Javascript and JSON. With a loader, you can translate another type of file to a format that webpack understands and can work with. There are many webpack loaders and each loader has a specific purpose.
The @import rule allows you to import a style sheet into another style sheet. The @import rule must be at the top of the document (but after any @charset declaration). The @import rule also supports media queries, so you can allow the import to be media-dependent.
Loaders are the node-based utilities built for webpack to help webpack to compile and/or transform a given type of resource that can be bundled as a javascript module. css-loader is the npm module that would help webpack to collect CSS from all the css files referenced in your application and put it into a string.
When importing a CSS file from node_modules , you have to make sure you have the specific package installed, e.g. by running npm install bootstrap . Note that you shouldn't use a relative path to import from node_modules . You should use an absolute path and omit the node_modules directory.
You can import files relative to your project's root (resolving node_modules/
from the root folder) by prefixing with a tilde ~
:
@import '~react-select/dist/react-datetime.css';
This is a poorly documented Webpack (a redundant phrase) convention, see https://github.com/webpack-contrib/css-loader/issues/12#issuecomment-41940311 and What does a `~` tilde in a CSS `url()` do?
If you are using too many things from one node_modules folder you can also create an alias by passing this following option
options: {
url: false,
includePaths: [
// this one for using node_modules as a base folder
path.resolve('node_modules'),
// this one for using sass as the base folder
path.resolve('node_modules/flag-icon-css/sass')
]
}
After the configuration, you can import as you were trying in your question.
I had a similar issue today. After all, all I had to do was to configure resolve
in my webpack config file. I hope this will help somebody.
Webpack version I used:
"webpack": "^4.37.0",
In a webpack config file, the following should be configured:
module.exports = {
resolve: {
extensions: ['.json', '.js', '.jsx'],
modules: ['node_modules'],
},
or
module.exports = {
resolve: {
alias: {
'some-library': path.resolve(__dirname, './node_modules/some-library'),
}
},
In a css file, we can access a library by a relative path from node_modules
:
@import '~some-library/src/some-css-file';
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With