Browse by type
[![npm][npm]][npm-url] [![node][node]][node-url] [![tests][tests]][tests-url] [![cover][cover]][cover-url] [![discussion][discussion]][discussion-url] [![size][size]][size-url]
A Stylus loader for webpack. Compiles Stylus files into CSS.
To begin, you'll need to install stylus and stylus-loader:
npm install stylus stylus-loader --save-dev
or
yarn add -D stylus stylus-loader
or
pnpm add -D stylus stylus-loader
Then add the loader to your webpack configuration. For example:
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl$/,
loader: "stylus-loader", // compiles Styl to CSS
},
],
},
};
Finally, run webpack using the method you normally use (e.g., via CLI or an npm script).
stylusOptionsType:
type stylusOptions =
| {
use: (string | ((stylusOptions: StylusOptions) => void))[];
include: string[];
import: string[];
define: any[];
includeCSS: false;
resolveURL: boolean | object;
lineNumbers: boolean;
hoistAtrules: boolean;
compress: boolean;
}
| ((loaderContext: LoaderContext) => string[]);
Default: {}
You can pass any Stylus specific options to the stylus-loader through the stylusOptions property in the loader options.
See the Stylus documentation.
Options in dash-case should be written in camelCase.
objectUse an object to pass options through to Stylus.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl$/,
use: [
{
loader: "style-loader",
},
{
loader: "css-loader",
},
{
loader: "stylus-loader",
options: {
stylusOptions: {
// eslint-disable-next-line jsdoc/no-restricted-syntax
/**
* Specify Stylus plugins to use. Plugins may be passed as
* strings instead of importing them in your Webpack config.
* @type {(string | (renderer: object) => void)[]}
* @default []
*/
use: ["nib"],
/**
* Add path(s) to the import lookup paths.
* @type {string[]}
* @default []
*/
include: [path.join(__dirname, "src/styl/config")],
/**
* Import the specified Stylus files/paths.
* @type {string[]}
* @default []
*/
import: ["nib", path.join(__dirname, "src/styl/mixins")],
/**
* Define Stylus variables or functions.
* @type {[string, string | number | boolean, boolean?] | Record<string, string | number | boolean>}
* @default {}
*/
// Array is the recommended syntax: [key, value, raw]
define: [
["$development", process.env.NODE_ENV === "development"],
["rawVar", 42, true],
],
// Object is deprecated syntax (there is no possibility to specify "raw')
// define: {
// $development: process.env.NODE_ENV === 'development',
// rawVar: 42,
// },
/**
* Include regular CSS on \@import.
* @type {boolean}
* @default false
*/
includeCSS: false,
/**
* Resolve relative url()'s inside imported files.
* @see https://stylus-lang.com/docs/js.html#stylusresolveroptions
* @type {boolean | { nocheck?: boolean, paths?: string[] }}
* @default { nocheck: true }
*/
resolveURL: true,
// resolveURL: { nocheck: true },
/**
* Emits comments in the generated CSS indicating the corresponding Stylus line.
* @see https://stylus-lang.com/docs/executable.html
* @type {boolean}
* @default false
*/
lineNumbers: true,
/**
* Move \@import and \@charset to the top.
* @see https://stylus-lang.com/docs/executable.html
* @type {boolean}
* @default false
*/
hoistAtrules: true,
/**
* Compress CSS output.
* In the "production" mode is `true` by default
* @see https://stylus-lang.com/docs/executable.html
* @type {boolean}
* @default false
*/
compress: true,
},
},
},
],
},
],
},
};
functionAllows setting the options passed through to Stylus based off of the loader context.
module.exports = {
module: {
rules: [
{
test: /\.styl/,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
stylusOptions: (loaderContext) => {
// More information about available properties https://webpack.js.org/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.styl") {
return {
paths: ["absolute/path/c", "absolute/path/d"],
};
}
return {
paths: ["absolute/path/a", "absolute/path/b"],
};
},
},
},
],
},
],
},
};
sourceMapType:
type sourceMap = boolean;
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl$/i,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
},
},
{
loader: "stylus-loader",
options: {
sourceMap: true,
},
},
],
},
],
},
};
webpackImporterType:
type webpackImporter = boolean;
Default: true
Enables/disables the default Webpack importer.
This can improve performance in some cases.
Use it with caution because aliases and @import at-rules starting with ~ will not work.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl/i,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
webpackImporter: false,
},
},
],
},
],
},
};
additionalDataType:
type additionalData =
| string
| ((
content: string | Buffer,
loaderContext: LoaderContext,
meta: any,
) => string);
Default: undefined
Prepends Stylus code before the actual entry file.
In this case, the stylus-loader will not override the source but will simply prepend the entry's content.
This is especially useful when some of your Stylus variables depend on the environment.
[!NOTE]
Since you're injecting code, this will break the source mappings in your entry file. Often there's a simpler solution than this, such as using multiple Stylus entry files.
stringmodule.exports = {
module: {
rules: [
{
test: /\.styl/,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
additionalData: `@env: ${process.env.NODE_ENV};`,
},
},
],
},
],
},
};
functionmodule.exports = {
module: {
rules: [
{
test: /\.styl/,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
additionalData: (content, loaderContext) => {
// More information about available properties https://webpack.js.org/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.styl") {
return `value = 100px${content}`;
}
return `value = 200px${content}`;
},
},
},
],
},
],
},
};
module.exports = {
module: {
rules: [
{
test: /\.styl/,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
additionalData: async (content, loaderContext) => {
// More information about available properties https://webpack.js.org/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.styl") {
return `value = 100px${content}`;
}
return `value = 200px${content}`;
},
},
},
],
},
],
},
};
implementationType:
type implementation = (() => typeof import("stylus")) | string;
The implementation option allows you to specify which Stylus implementation to use.
It overrides the locally installed peerDependency version of stylus.
functionwebpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl/i,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
implementation: require("stylus"),
},
},
],
},
],
},
};
stringwebpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl/i,
use: [
"style-loader",
"css-loader",
{
loader: "stylus-loader",
options: {
implementation: require.resolve("stylus"),
},
},
],
},
],
},
};
Chain stylus-loader with the css-loader and style-loader to immediately apply all styles to the DOM.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl$/,
use: [
{
loader: "style-loader", // creates style nodes from JS strings
},
{
loader: "css-loader", // translates CSS into CommonJS
},
{
loader: "stylus-loader", // compiles Stylus to CSS
},
],
},
],
},
};
To enable sourcemaps for CSS, you'll need to pass the sourceMap property in the loader's options.
If this is not passed, the loader will respect the setting for webpack source maps, set in devtool.
webpack.config.js
module.exports = {
devtool: "source-map", // any "source-map"-like devtool is possible
module: {
rules: [
{
test: /\.styl$/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
},
},
{
loader: "stylus-loader",
options: {
sourceMap: true,
},
},
],
},
],
},
};
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.styl$/,
use: [
{
loader: "style-loader", // creates style nodes from JS strings
},
{
loader: "css-loader", // translates CSS into CommonJS
},
{
loader: "stylus-loader", // compiles Stylus to CSS
options: {
stylusOptions: {
use: [require("nib")()],
import: ["nib"],
},
},
},
],
},
],
},
};
Stylus does not provide resolving capabilities in the json() function.
Therefore webpack resolver does not work for .json files.
To handle this, use a stylus resolver.
index.styl
// Suppose the file is located here `node_modules/vars/vars.json`
json('vars.json')
@media queries-small
body
display nope
webpack.config.js
```js module.exports = { module: { rules: [ { test: /.styl$/, use: [ "style-loader", "css-loader", { loader: "stylus-l
$ claude mcp add stylus-loader \
-- python -m otcore.mcp_server <graph>