[6a3a178] | 1 | <div align="center">
|
---|
| 2 | <a href="https://github.com/webpack/webpack">
|
---|
| 3 | <img width="200" height="200" src="https://webpack.js.org/assets/icon-square-big.svg">
|
---|
| 4 | </a>
|
---|
| 5 | </div>
|
---|
| 6 |
|
---|
| 7 | [![npm][npm]][npm-url]
|
---|
| 8 | [![node][node]][node-url]
|
---|
| 9 | [![deps][deps]][deps-url]
|
---|
| 10 | [![tests][tests]][tests-url]
|
---|
| 11 | [![cover][cover]][cover-url]
|
---|
| 12 | [![chat][chat]][chat-url]
|
---|
| 13 | [![size][size]][size-url]
|
---|
| 14 |
|
---|
| 15 | # stylus-loader
|
---|
| 16 |
|
---|
| 17 | A Stylus loader for webpack. Compiles Styl to CSS.
|
---|
| 18 |
|
---|
| 19 | ## Getting Started
|
---|
| 20 |
|
---|
| 21 | To begin, you'll need to install `stylus` and `stylus-loader`:
|
---|
| 22 |
|
---|
| 23 | ```console
|
---|
| 24 | $ npm install stylus stylus-loader --save-dev
|
---|
| 25 | ```
|
---|
| 26 |
|
---|
| 27 | Then add the loader to your `webpack` config. For example:
|
---|
| 28 |
|
---|
| 29 | **webpack.config.js**
|
---|
| 30 |
|
---|
| 31 | ```js
|
---|
| 32 | module.exports = {
|
---|
| 33 | module: {
|
---|
| 34 | rules: [
|
---|
| 35 | {
|
---|
| 36 | test: /\.styl$/,
|
---|
| 37 | loader: "stylus-loader", // compiles Styl to CSS
|
---|
| 38 | },
|
---|
| 39 | ],
|
---|
| 40 | },
|
---|
| 41 | };
|
---|
| 42 | ```
|
---|
| 43 |
|
---|
| 44 | And run `webpack` via your preferred method.
|
---|
| 45 |
|
---|
| 46 | ## Options
|
---|
| 47 |
|
---|
| 48 | | Name | Type | Default | Description |
|
---|
| 49 | | :---------------------------------------: | :------------------: | :----------------: | :------------------------------------------------------- |
|
---|
| 50 | | **[`stylusOptions`](#stylusOptions)** | `{Object\|Function}` | `{}` | Options for Stylus. |
|
---|
| 51 | | **[`sourceMap`](#sourcemap)** | `{Boolean}` | `compiler.devtool` | Enables/Disables generation of source maps. |
|
---|
| 52 | | **[`webpackImporter`](#webpackimporter)** | `{Boolean}` | `true` | Enables/Disables the default Webpack importer. |
|
---|
| 53 | | **[`additionalData`](#additionalData)** | `{String\|Function}` | `undefined` | Prepends/Appends `Stylus` code to the actual entry file. |
|
---|
| 54 | | **[`implementation`](#implementation)** | `{String\|Function}` | `stylus` | Setup Stylus implementation to use. |
|
---|
| 55 |
|
---|
| 56 | ### `stylusOptions`
|
---|
| 57 |
|
---|
| 58 | Type: `Object|Function`
|
---|
| 59 | Default: `{}`
|
---|
| 60 |
|
---|
| 61 | You can pass any Stylus specific options to the `stylus-loader` through the `stylusOptions` property in the [loader options](https://webpack.js.org/configuration/module/#rule-options-rule-query).
|
---|
| 62 | See the [Stylus documentation](https://stylus-lang.com/docs/js.html).
|
---|
| 63 | Options in dash-case should use camelCase.
|
---|
| 64 |
|
---|
| 65 | #### `Object`
|
---|
| 66 |
|
---|
| 67 | Use an object to pass options through to Stylus.
|
---|
| 68 |
|
---|
| 69 | **webpack.config.js**
|
---|
| 70 |
|
---|
| 71 | ```js
|
---|
| 72 | module.exports = {
|
---|
| 73 | module: {
|
---|
| 74 | rules: [
|
---|
| 75 | {
|
---|
| 76 | test: /\.styl$/,
|
---|
| 77 | use: [
|
---|
| 78 | {
|
---|
| 79 | loader: "style-loader",
|
---|
| 80 | },
|
---|
| 81 | {
|
---|
| 82 | loader: "css-loader",
|
---|
| 83 | },
|
---|
| 84 | {
|
---|
| 85 | loader: "stylus-loader",
|
---|
| 86 | options: {
|
---|
| 87 | stylusOptions: {
|
---|
| 88 | /**
|
---|
| 89 | * Specify Stylus plugins to use. Plugins may be passed as
|
---|
| 90 | * strings instead of importing them in your Webpack config.
|
---|
| 91 | *
|
---|
| 92 | * @type {(string|Function)[]}
|
---|
| 93 | * @default []
|
---|
| 94 | */
|
---|
| 95 | use: ["nib"],
|
---|
| 96 |
|
---|
| 97 | /**
|
---|
| 98 | * Add path(s) to the import lookup paths.
|
---|
| 99 | *
|
---|
| 100 | * @type {string[]}
|
---|
| 101 | * @default []
|
---|
| 102 | */
|
---|
| 103 | include: [path.join(__dirname, "src/styl/config")],
|
---|
| 104 |
|
---|
| 105 | /**
|
---|
| 106 | * Import the specified Stylus files/paths.
|
---|
| 107 | *
|
---|
| 108 | * @type {string[]}
|
---|
| 109 | * @default []
|
---|
| 110 | */
|
---|
| 111 | import: ["nib", path.join(__dirname, "src/styl/mixins")],
|
---|
| 112 |
|
---|
| 113 | /**
|
---|
| 114 | * Define Stylus variables or functions.
|
---|
| 115 | *
|
---|
| 116 | * @type {Array|Object}
|
---|
| 117 | * @default {}
|
---|
| 118 | */
|
---|
| 119 | // Array is the recommended syntax: [key, value, raw]
|
---|
| 120 | define: [
|
---|
| 121 | ["$development", process.env.NODE_ENV === "development"],
|
---|
| 122 | ["rawVar", 42, true],
|
---|
| 123 | ],
|
---|
| 124 | // Object is deprecated syntax (there is no possibility to specify "raw')
|
---|
| 125 | // define: {
|
---|
| 126 | // $development: process.env.NODE_ENV === 'development',
|
---|
| 127 | // rawVar: 42,
|
---|
| 128 | // },
|
---|
| 129 |
|
---|
| 130 | /**
|
---|
| 131 | * Include regular CSS on @import.
|
---|
| 132 | *
|
---|
| 133 | * @type {boolean}
|
---|
| 134 | * @default false
|
---|
| 135 | */
|
---|
| 136 | includeCSS: false,
|
---|
| 137 |
|
---|
| 138 | /**
|
---|
| 139 | * Resolve relative url()'s inside imported files.
|
---|
| 140 | *
|
---|
| 141 | * @see https://stylus-lang.com/docs/js.html#stylusresolveroptions
|
---|
| 142 | *
|
---|
| 143 | * @type {boolean|Object}
|
---|
| 144 | * @default { nocheck: true }
|
---|
| 145 | */
|
---|
| 146 | resolveURL: true,
|
---|
| 147 | // resolveURL: { nocheck: true },
|
---|
| 148 |
|
---|
| 149 | /**
|
---|
| 150 | * Emits comments in the generated CSS indicating the corresponding Stylus line.
|
---|
| 151 | *
|
---|
| 152 | * @see https://stylus-lang.com/docs/executable.html
|
---|
| 153 | *
|
---|
| 154 | * @type {boolean}
|
---|
| 155 | * @default false
|
---|
| 156 | */
|
---|
| 157 | lineNumbers: true,
|
---|
| 158 |
|
---|
| 159 | /**
|
---|
| 160 | * Move @import and @charset to the top.
|
---|
| 161 | *
|
---|
| 162 | * @see https://stylus-lang.com/docs/executable.html
|
---|
| 163 | *
|
---|
| 164 | * @type {boolean}
|
---|
| 165 | * @default false
|
---|
| 166 | */
|
---|
| 167 | hoistAtrules: true,
|
---|
| 168 |
|
---|
| 169 | /**
|
---|
| 170 | * Compress CSS output.
|
---|
| 171 | * In the "production" mode is `true` by default
|
---|
| 172 | *
|
---|
| 173 | * @see https://stylus-lang.com/docs/executable.html
|
---|
| 174 | *
|
---|
| 175 | * @type {boolean}
|
---|
| 176 | * @default false
|
---|
| 177 | */
|
---|
| 178 | compress: true,
|
---|
| 179 | },
|
---|
| 180 | },
|
---|
| 181 | },
|
---|
| 182 | ],
|
---|
| 183 | },
|
---|
| 184 | ],
|
---|
| 185 | },
|
---|
| 186 | };
|
---|
| 187 | ```
|
---|
| 188 |
|
---|
| 189 | #### `Function`
|
---|
| 190 |
|
---|
| 191 | Allows setting the options passed through to Stylus based off of the loader context.
|
---|
| 192 |
|
---|
| 193 | ```js
|
---|
| 194 | module.exports = {
|
---|
| 195 | module: {
|
---|
| 196 | rules: [
|
---|
| 197 | {
|
---|
| 198 | test: /\.styl/,
|
---|
| 199 | use: [
|
---|
| 200 | "style-loader",
|
---|
| 201 | "css-loader",
|
---|
| 202 | {
|
---|
| 203 | loader: "stylus-loader",
|
---|
| 204 | options: {
|
---|
| 205 | stylusOptions: (loaderContext) => {
|
---|
| 206 | // More information about available properties https://webpack.js.org/api/loaders/
|
---|
| 207 | const { resourcePath, rootContext } = loaderContext;
|
---|
| 208 | const relativePath = path.relative(rootContext, resourcePath);
|
---|
| 209 |
|
---|
| 210 | if (relativePath === "styles/foo.styl") {
|
---|
| 211 | return {
|
---|
| 212 | paths: ["absolute/path/c", "absolute/path/d"],
|
---|
| 213 | };
|
---|
| 214 | }
|
---|
| 215 |
|
---|
| 216 | return {
|
---|
| 217 | paths: ["absolute/path/a", "absolute/path/b"],
|
---|
| 218 | };
|
---|
| 219 | },
|
---|
| 220 | },
|
---|
| 221 | },
|
---|
| 222 | ],
|
---|
| 223 | },
|
---|
| 224 | ],
|
---|
| 225 | },
|
---|
| 226 | };
|
---|
| 227 | ```
|
---|
| 228 |
|
---|
| 229 | ### `sourceMap`
|
---|
| 230 |
|
---|
| 231 | Type: `Boolean`
|
---|
| 232 |
|
---|
| 233 | **webpack.config.js**
|
---|
| 234 |
|
---|
| 235 | ```js
|
---|
| 236 | module.exports = {
|
---|
| 237 | module: {
|
---|
| 238 | rules: [
|
---|
| 239 | {
|
---|
| 240 | test: /\.styl$/i,
|
---|
| 241 | use: [
|
---|
| 242 | "style-loader",
|
---|
| 243 | {
|
---|
| 244 | loader: "css-loader",
|
---|
| 245 | options: {
|
---|
| 246 | sourceMap: true,
|
---|
| 247 | },
|
---|
| 248 | },
|
---|
| 249 | {
|
---|
| 250 | loader: "stylus-loader",
|
---|
| 251 | options: {
|
---|
| 252 | sourceMap: true,
|
---|
| 253 | },
|
---|
| 254 | },
|
---|
| 255 | ],
|
---|
| 256 | },
|
---|
| 257 | ],
|
---|
| 258 | },
|
---|
| 259 | };
|
---|
| 260 | ```
|
---|
| 261 |
|
---|
| 262 | ### `webpackImporter`
|
---|
| 263 |
|
---|
| 264 | Type: `Boolean`
|
---|
| 265 | Default: `true`
|
---|
| 266 |
|
---|
| 267 | Enables/Disables the default Webpack importer.
|
---|
| 268 |
|
---|
| 269 | This can improve performance in some cases.
|
---|
| 270 | Use it with caution because aliases and `@import` at-rules starting with `~` will not work.
|
---|
| 271 |
|
---|
| 272 | **webpack.config.js**
|
---|
| 273 |
|
---|
| 274 | ```js
|
---|
| 275 | module.exports = {
|
---|
| 276 | module: {
|
---|
| 277 | rules: [
|
---|
| 278 | {
|
---|
| 279 | test: /\.styl/i,
|
---|
| 280 | use: [
|
---|
| 281 | "style-loader",
|
---|
| 282 | "css-loader",
|
---|
| 283 | {
|
---|
| 284 | loader: "stylus-loader",
|
---|
| 285 | options: {
|
---|
| 286 | webpackImporter: false,
|
---|
| 287 | },
|
---|
| 288 | },
|
---|
| 289 | ],
|
---|
| 290 | },
|
---|
| 291 | ],
|
---|
| 292 | },
|
---|
| 293 | };
|
---|
| 294 | ```
|
---|
| 295 |
|
---|
| 296 | ### `additionalData`
|
---|
| 297 |
|
---|
| 298 | Type: `String|Function`
|
---|
| 299 | Default: `undefined`
|
---|
| 300 |
|
---|
| 301 | Prepends `Stylus` code before the actual entry file.
|
---|
| 302 | In this case, the `stylus-loader` will not override the source but just **prepend** the entry's content.
|
---|
| 303 |
|
---|
| 304 | This is especially useful when some of your Stylus variables depend on the environment:
|
---|
| 305 |
|
---|
| 306 | > ℹ Since you're injecting code, this will break the source mappings in your entry file. Often there's a simpler solution than this, like multiple Stylus entry files.
|
---|
| 307 |
|
---|
| 308 | #### `String`
|
---|
| 309 |
|
---|
| 310 | ```js
|
---|
| 311 | module.exports = {
|
---|
| 312 | module: {
|
---|
| 313 | rules: [
|
---|
| 314 | {
|
---|
| 315 | test: /\.styl/,
|
---|
| 316 | use: [
|
---|
| 317 | "style-loader",
|
---|
| 318 | "css-loader",
|
---|
| 319 | {
|
---|
| 320 | loader: "stylus-loader",
|
---|
| 321 | options: {
|
---|
| 322 | additionalData: `@env: ${process.env.NODE_ENV};`,
|
---|
| 323 | },
|
---|
| 324 | },
|
---|
| 325 | ],
|
---|
| 326 | },
|
---|
| 327 | ],
|
---|
| 328 | },
|
---|
| 329 | };
|
---|
| 330 | ```
|
---|
| 331 |
|
---|
| 332 | #### `Function`
|
---|
| 333 |
|
---|
| 334 | ##### Sync
|
---|
| 335 |
|
---|
| 336 | ```js
|
---|
| 337 | module.exports = {
|
---|
| 338 | module: {
|
---|
| 339 | rules: [
|
---|
| 340 | {
|
---|
| 341 | test: /\.styl/,
|
---|
| 342 | use: [
|
---|
| 343 | "style-loader",
|
---|
| 344 | "css-loader",
|
---|
| 345 | {
|
---|
| 346 | loader: "stylus-loader",
|
---|
| 347 | options: {
|
---|
| 348 | additionalData: (content, loaderContext) => {
|
---|
| 349 | // More information about available properties https://webpack.js.org/api/loaders/
|
---|
| 350 | const { resourcePath, rootContext } = loaderContext;
|
---|
| 351 | const relativePath = path.relative(rootContext, resourcePath);
|
---|
| 352 |
|
---|
| 353 | if (relativePath === "styles/foo.styl") {
|
---|
| 354 | return "value = 100px" + content;
|
---|
| 355 | }
|
---|
| 356 |
|
---|
| 357 | return "value 200px" + content;
|
---|
| 358 | },
|
---|
| 359 | },
|
---|
| 360 | },
|
---|
| 361 | ],
|
---|
| 362 | },
|
---|
| 363 | ],
|
---|
| 364 | },
|
---|
| 365 | };
|
---|
| 366 | ```
|
---|
| 367 |
|
---|
| 368 | ##### Async
|
---|
| 369 |
|
---|
| 370 | ```js
|
---|
| 371 | module.exports = {
|
---|
| 372 | module: {
|
---|
| 373 | rules: [
|
---|
| 374 | {
|
---|
| 375 | test: /\.styl/,
|
---|
| 376 | use: [
|
---|
| 377 | "style-loader",
|
---|
| 378 | "css-loader",
|
---|
| 379 | {
|
---|
| 380 | loader: "stylus-loader",
|
---|
| 381 | options: {
|
---|
| 382 | additionalData: async (content, loaderContext) => {
|
---|
| 383 | // More information about available properties https://webpack.js.org/api/loaders/
|
---|
| 384 | const { resourcePath, rootContext } = loaderContext;
|
---|
| 385 | const relativePath = path.relative(rootContext, resourcePath);
|
---|
| 386 |
|
---|
| 387 | if (relativePath === "styles/foo.styl") {
|
---|
| 388 | return "value = 100px" + content;
|
---|
| 389 | }
|
---|
| 390 |
|
---|
| 391 | return "value 200px" + content;
|
---|
| 392 | },
|
---|
| 393 | },
|
---|
| 394 | },
|
---|
| 395 | ],
|
---|
| 396 | },
|
---|
| 397 | ],
|
---|
| 398 | },
|
---|
| 399 | };
|
---|
| 400 | ```
|
---|
| 401 |
|
---|
| 402 | ### `implementation`
|
---|
| 403 |
|
---|
| 404 | Type: `Function | String`
|
---|
| 405 |
|
---|
| 406 | The special `implementation` option determines which implementation of Stylus to use. Overrides the locally installed `peerDependency` version of `stylus`.
|
---|
| 407 |
|
---|
| 408 | #### Function
|
---|
| 409 |
|
---|
| 410 | **webpack.config.js**
|
---|
| 411 |
|
---|
| 412 | ```js
|
---|
| 413 | module.exports = {
|
---|
| 414 | module: {
|
---|
| 415 | rules: [
|
---|
| 416 | {
|
---|
| 417 | test: /\.styl/i,
|
---|
| 418 | use: [
|
---|
| 419 | "style-loader",
|
---|
| 420 | "css-loader",
|
---|
| 421 | {
|
---|
| 422 | loader: "stylus-loader",
|
---|
| 423 | options: {
|
---|
| 424 | implementation: require("stylus"),
|
---|
| 425 | },
|
---|
| 426 | },
|
---|
| 427 | ],
|
---|
| 428 | },
|
---|
| 429 | ],
|
---|
| 430 | },
|
---|
| 431 | };
|
---|
| 432 | ```
|
---|
| 433 |
|
---|
| 434 | #### String
|
---|
| 435 |
|
---|
| 436 | **webpack.config.js**
|
---|
| 437 |
|
---|
| 438 | ```js
|
---|
| 439 | module.exports = {
|
---|
| 440 | module: {
|
---|
| 441 | rules: [
|
---|
| 442 | {
|
---|
| 443 | test: /\.styl/i,
|
---|
| 444 | use: [
|
---|
| 445 | "style-loader",
|
---|
| 446 | "css-loader",
|
---|
| 447 | {
|
---|
| 448 | loader: "stylus-loader",
|
---|
| 449 | options: {
|
---|
| 450 | implementation: require.resolve("stylus"),
|
---|
| 451 | },
|
---|
| 452 | },
|
---|
| 453 | ],
|
---|
| 454 | },
|
---|
| 455 | ],
|
---|
| 456 | },
|
---|
| 457 | };
|
---|
| 458 | ```
|
---|
| 459 |
|
---|
| 460 | ## Examples
|
---|
| 461 |
|
---|
| 462 | ### Normal usage
|
---|
| 463 |
|
---|
| 464 | Chain the `stylus-loader` with the [`css-loader`](https://github.com/webpack-contrib/css-loader) and the [`style-loader`](https://github.com/webpack-contrib/style-loader) to immediately apply all styles to the DOM.
|
---|
| 465 |
|
---|
| 466 | **webpack.config.js**
|
---|
| 467 |
|
---|
| 468 | ```js
|
---|
| 469 | module.exports = {
|
---|
| 470 | module: {
|
---|
| 471 | rules: [
|
---|
| 472 | {
|
---|
| 473 | test: /\.styl$/,
|
---|
| 474 | use: [
|
---|
| 475 | {
|
---|
| 476 | loader: "style-loader", // creates style nodes from JS strings
|
---|
| 477 | },
|
---|
| 478 | {
|
---|
| 479 | loader: "css-loader", // translates CSS into CommonJS
|
---|
| 480 | },
|
---|
| 481 | {
|
---|
| 482 | loader: "stylus-loader", // compiles Stylus to CSS
|
---|
| 483 | },
|
---|
| 484 | ],
|
---|
| 485 | },
|
---|
| 486 | ],
|
---|
| 487 | },
|
---|
| 488 | };
|
---|
| 489 | ```
|
---|
| 490 |
|
---|
| 491 | ### Source maps
|
---|
| 492 |
|
---|
| 493 | 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`.
|
---|
| 494 |
|
---|
| 495 | **webpack.config.js**
|
---|
| 496 |
|
---|
| 497 | ```javascript
|
---|
| 498 | module.exports = {
|
---|
| 499 | devtool: "source-map", // any "source-map"-like devtool is possible
|
---|
| 500 | module: {
|
---|
| 501 | rules: [
|
---|
| 502 | {
|
---|
| 503 | test: /\.styl$/,
|
---|
| 504 | use: [
|
---|
| 505 | "style-loader",
|
---|
| 506 | {
|
---|
| 507 | loader: "css-loader",
|
---|
| 508 | options: {
|
---|
| 509 | sourceMap: true,
|
---|
| 510 | },
|
---|
| 511 | },
|
---|
| 512 | {
|
---|
| 513 | loader: "stylus-loader",
|
---|
| 514 | options: {
|
---|
| 515 | sourceMap: true,
|
---|
| 516 | },
|
---|
| 517 | },
|
---|
| 518 | ],
|
---|
| 519 | },
|
---|
| 520 | ],
|
---|
| 521 | },
|
---|
| 522 | };
|
---|
| 523 | ```
|
---|
| 524 |
|
---|
| 525 | ### Using nib with stylus
|
---|
| 526 |
|
---|
| 527 | **webpack.config.js**
|
---|
| 528 |
|
---|
| 529 | ```js
|
---|
| 530 | module.exports = {
|
---|
| 531 | module: {
|
---|
| 532 | rules: [
|
---|
| 533 | {
|
---|
| 534 | test: /\.styl$/,
|
---|
| 535 | use: [
|
---|
| 536 | {
|
---|
| 537 | loader: "style-loader", // creates style nodes from JS strings
|
---|
| 538 | },
|
---|
| 539 | {
|
---|
| 540 | loader: "css-loader", // translates CSS into CommonJS
|
---|
| 541 | },
|
---|
| 542 | {
|
---|
| 543 | loader: "stylus-loader", // compiles Stylus to CSS
|
---|
| 544 | options: {
|
---|
| 545 | stylusOptions: {
|
---|
| 546 | use: [require("nib")()],
|
---|
| 547 | import: ["nib"],
|
---|
| 548 | },
|
---|
| 549 | },
|
---|
| 550 | },
|
---|
| 551 | ],
|
---|
| 552 | },
|
---|
| 553 | ],
|
---|
| 554 | },
|
---|
| 555 | };
|
---|
| 556 | ```
|
---|
| 557 |
|
---|
| 558 | ### Import JSON files
|
---|
| 559 |
|
---|
| 560 | Stylus does not provide resolving capabilities in the `json` function.
|
---|
| 561 | Therefore webpack resolver does not work for `.json` files.
|
---|
| 562 | Use [`stylus resolver`](#stylus-resolver).
|
---|
| 563 |
|
---|
| 564 | **index.styl**
|
---|
| 565 |
|
---|
| 566 | ```styl
|
---|
| 567 | // Suppose the file is located here `node_modules/vars/vars.json`
|
---|
| 568 | json('vars.json')
|
---|
| 569 |
|
---|
| 570 | @media queries-small
|
---|
| 571 | body
|
---|
| 572 | display nope
|
---|
| 573 |
|
---|
| 574 | ```
|
---|
| 575 |
|
---|
| 576 | **webpack.config.js**
|
---|
| 577 |
|
---|
| 578 | ```js
|
---|
| 579 | module.exports = {
|
---|
| 580 | module: {
|
---|
| 581 | rules: [
|
---|
| 582 | {
|
---|
| 583 | test: /\.styl$/,
|
---|
| 584 | use: [
|
---|
| 585 | "style-loader",
|
---|
| 586 | "css-loader",
|
---|
| 587 | {
|
---|
| 588 | loader: "stylus-loader",
|
---|
| 589 | options: {
|
---|
| 590 | stylusOptions: {
|
---|
| 591 | // Specify the path. where to find files
|
---|
| 592 | paths: ["node_modules/vars"],
|
---|
| 593 | },
|
---|
| 594 | },
|
---|
| 595 | },
|
---|
| 596 | ],
|
---|
| 597 | },
|
---|
| 598 | ],
|
---|
| 599 | },
|
---|
| 600 | };
|
---|
| 601 | ```
|
---|
| 602 |
|
---|
| 603 | ### In production
|
---|
| 604 |
|
---|
| 605 | Usually, it's recommended to extract the style sheets into a dedicated file in production using the [MiniCssExtractPlugin](https://github.com/webpack-contrib/mini-css-extract-plugin). This way your styles are not dependent on JavaScript.
|
---|
| 606 |
|
---|
| 607 | ### webpack resolver
|
---|
| 608 |
|
---|
| 609 | Webpack provides an [advanced mechanism to resolve files](https://webpack.js.org/configuration/resolve/).
|
---|
| 610 | The `stylus-loader` applies the webpack resolver when processing queries.
|
---|
| 611 | Thus you can import your Stylus modules from `node_modules`.
|
---|
| 612 |
|
---|
| 613 | ```styl
|
---|
| 614 | @import 'bootstrap-styl/bootstrap/index.styl';
|
---|
| 615 | ```
|
---|
| 616 |
|
---|
| 617 | Using `~` is deprecated and can be removed from your code (**we recommend it**), but we still support it for historical reasons.
|
---|
| 618 | Why you can removed it? The loader will first try to resolve `@import`/`@require` as relative, if it cannot be resolved, the loader will try to resolve `@import`/`@require` inside [`node_modules`](https://webpack.js.org/configuration/resolve/#resolve-modules).
|
---|
| 619 | Just prepend them with a `~` which tells webpack to look up the [`modules`](https://webpack.js.org/configuration/resolve/#resolve-modules).
|
---|
| 620 |
|
---|
| 621 | ```styl
|
---|
| 622 | @import "~bootstrap-styl/bootstrap/index.styl";
|
---|
| 623 | ```
|
---|
| 624 |
|
---|
| 625 | It's important to only prepend it with `~`, because `~/` resolves to the home-directory.
|
---|
| 626 | Webpack needs to distinguish between `bootstrap` and `~bootstrap`, because CSS and Styl files have no special syntax for importing relative files.
|
---|
| 627 | Writing `@import "file"` is the same as `@import "./file";`
|
---|
| 628 |
|
---|
| 629 | ### Stylus resolver
|
---|
| 630 |
|
---|
| 631 | If you specify the `paths` option, modules will be searched in the given `paths`.
|
---|
| 632 | This is Stylus default behavior.
|
---|
| 633 |
|
---|
| 634 | **webpack.config.js**
|
---|
| 635 |
|
---|
| 636 | ```js
|
---|
| 637 | module.exports = {
|
---|
| 638 | module: {
|
---|
| 639 | rules: [
|
---|
| 640 | {
|
---|
| 641 | test: /\.styl/,
|
---|
| 642 | use: [
|
---|
| 643 | {
|
---|
| 644 | loader: "style-loader",
|
---|
| 645 | },
|
---|
| 646 | {
|
---|
| 647 | loader: "css-loader",
|
---|
| 648 | },
|
---|
| 649 | {
|
---|
| 650 | loader: "stylus-loader",
|
---|
| 651 | options: {
|
---|
| 652 | stylusOptions: {
|
---|
| 653 | paths: [path.resolve(__dirname, "node_modules")],
|
---|
| 654 | },
|
---|
| 655 | },
|
---|
| 656 | },
|
---|
| 657 | ],
|
---|
| 658 | },
|
---|
| 659 | ],
|
---|
| 660 | },
|
---|
| 661 | };
|
---|
| 662 | ```
|
---|
| 663 |
|
---|
| 664 | ### Extracting style sheets
|
---|
| 665 |
|
---|
| 666 | Bundling CSS with webpack has some nice advantages like referencing images and fonts with hashed urls or [hot module replacement](https://webpack.js.org/concepts/hot-module-replacement/) in development. In production, on the other hand, it's not a good idea to apply your style sheets depending on JS execution. Rendering may be delayed or even a [FOUC](https://en.wikipedia.org/wiki/Flash_of_unstyled_content) might be visible. Thus it's often still better to have them as separate files in your final production build.
|
---|
| 667 |
|
---|
| 668 | There are two possibilities to extract a style sheet from the bundle:
|
---|
| 669 |
|
---|
| 670 | - [`extract-loader`](https://github.com/peerigon/extract-loader) (simpler, but specialized on the css-loader's output)
|
---|
| 671 | - [MiniCssExtractPlugin](https://github.com/webpack-contrib/mini-css-extract-plugin) (more complex, but works in all use-cases)
|
---|
| 672 |
|
---|
| 673 | ## Contributing
|
---|
| 674 |
|
---|
| 675 | Please take a moment to read our contributing guidelines if you haven't yet done so.
|
---|
| 676 |
|
---|
| 677 | [CONTRIBUTING](./.github/CONTRIBUTING.md)
|
---|
| 678 |
|
---|
| 679 | ## License
|
---|
| 680 |
|
---|
| 681 | [MIT](./LICENSE)
|
---|
| 682 |
|
---|
| 683 | [npm]: https://img.shields.io/npm/v/stylus-loader.svg
|
---|
| 684 | [npm-url]: https://npmjs.com/package/stylus-loader
|
---|
| 685 | [node]: https://img.shields.io/node/v/stylus-loader.svg
|
---|
| 686 | [node-url]: https://nodejs.org
|
---|
| 687 | [deps]: https://david-dm.org/webpack-contrib/stylus-loader.svg
|
---|
| 688 | [deps-url]: https://david-dm.org/webpack-contrib/stylus-loader
|
---|
| 689 | [tests]: https://github.com/webpack-contrib/stylus-loader/workflows/stylus-loader/badge.svg
|
---|
| 690 | [tests-url]: https://github.com/webpack-contrib/stylus-loader/actions
|
---|
| 691 | [cover]: https://codecov.io/gh/webpack-contrib/stylus-loader/branch/master/graph/badge.svg
|
---|
| 692 | [cover-url]: https://codecov.io/gh/webpack-contrib/stylus-loader
|
---|
| 693 | [chat]: https://img.shields.io/badge/gitter-webpack%2Fwebpack-brightgreen.svg
|
---|
| 694 | [chat-url]: https://gitter.im/webpack/webpack
|
---|
| 695 | [size]: https://packagephobia.now.sh/badge?p=stylus-loader
|
---|
| 696 | [size-url]: https://packagephobia.now.sh/result?p=stylus-loader
|
---|