I have a fairly complicated loader setup for style sheets:
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract("style",
"css?sourceMap&localIdentName=[path][name]__[local]__[hash:base64:5]!sass?outputStyle=expanded&" +
"includePaths[]=" + other stuff)
)
}
Which works great, but on some requires I want to add the modules
option to css-loader, so it'd look like this:
require('./foo.scss!css?modules&sourceMap&localIdentName=[path][name]__[local]__[hash...');
But I can't do this all over the place.
How can I configure this so that I can enable the css-loader modules flag on certain requires while keeping the rest of it the same?
Maybe something like a loader 'alias', e.g. require('./foo.scss!my-scss-with-modules-flag-alias')
?
The only solution I can think of is writing a loader that does a syntax transform to inline the loader config into certain require calls... but that's brittle and complicated.
Aliasing is webpack's handy way to shave time and keystrokes off importing frequently used modules. You will need the path module, included with node. js, as it is how you will tell webpack where to look for those specific files. Using the resolve. alias property, you can define aliases for frequently imported modules.
The __dirname is set to / by webpack, that's why you end up with /views/index. html which is the root of your file system, that happens to be D:\ in your case. You can set node. dirname to false in your webpack config to not inject it and defer it to runtime.
Webpack builds a dependency graph used internally Now all modules that are used in your app are included in the dependency graph. Your project have many installed dependencies in the node_modules folder that should not be included in your client-side JavaScript production bundle.
Webpack goes through all the import ed and require d files in your project, and for all those files which have a . svg extension, it uses as an input to the webpack file loader. For each of these files, the file loader emits the file in the output directory and resolves the correct URL to be referenced.
resolveLoader.alias will work here. Ie.
resolveLoader: {
alias: {
'with-modules': 'loader definition goes here',
}
}
Using this configuration you can do simply
require('with-modules!./foo.scss');
at your code.
The resolveLoader.alias might work in the given case, since you are using a plugin as the loader. However if you need to use a chain of loaders, it will not work. (There's a feature request on it: https://github.com/webpack/webpack/issues/2772).
Instead you can add a parameter to the file in the require statement
var styles = require('./foo.scss?modules');
And create a new loader rule:
module: {
loaders: [
...
{ test: /\.scss$/, loader: 'style!css!postcss!sass' },
{ test: /\.scss\?modules$/, loader: 'style!css?modules!postcss!sass' }
]
}
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