Skip to main content

Gatsby Plugin Purgecss npm version

For Gatsby 2 only

CircleCI Build Status Coverage Status Renovate badge Known Vulnerabilities tested with jest

dependencies dev dependencies peer dependencies

What is this plugin about?

Remove unused css from css/sass/less/stylus files and modules in your Gatsby project using purgecss. 🎉

Please read Help! Purgecss breaks my site 😯 to make sure gatsby-plugin-purgecss does not cause you issues

📘 Read the latest docs here.Changelog

Demo

When used in gatsby-starter-bootstrap

demo

When used in gatsby-starter-bootstrap-cv (installed by default)

demo

Supported files

Installation

npm i gatsby-plugin-purgecss

Usage

Add the plugin AFTER other css plugins

// gatsy-config.js
module.exports = {
  plugins: [
    `gatsby-plugin-stylus`,
    `gatsby-plugin-sass`,
    `gatsby-plugin-less`,
    // Add after these plugins if used
    `gatsby-plugin-purgecss`
  ]
};

Available Options.

Help! Purgecss breaks my site

Diagnosing the issue

  • Use printRejected: true option which will print the the filenames and the selectors which were removed.
  • Identify which of the required selectors were removed.
  • Whitelist the required selectors or completely ignore files using Whitelist Solutions guide.
  • Look at the Issues section to understand why/how the purge was performed.

Issues

This section documents purgecss behavior in removing unused css. Most of the rules apply in any project and is not gatsby-plugin-purgecss specific.

Issue 1: CSS file not getting purged

For gatsby-plugin-purgecss to work on a css file it must be imported by a script file inside your src folder. This plugin depends on webpack to process css. If webpack does not use the css file then gatsby-plugin-purgecss cannot process it.

Also, make sure that you included the plugin after sass/less/stylus plugins.

Issue 2: Selectors with dashes in name gets removed when used with named imports

For eg: style.css

.my-selector { color: 'white' }

index.js

// Named import
import style from './style.css';
...
<div className={style.mySelector} />

Here .my-selector will get removed since purgecss by default cannot match it with mySelector.

Read how to solve this issue in the “Whitelist Solutions” section.

Note: Directly importing and using the selector name as is will work as intended

import './style.css';
<div className={`my-selector`} />

Issue 3: Styles getting purged even though the script file has selector names

Make sure that the script file is in the src folder.
If you want to look for selectors in another folder, use the content option.

Issue 4: Getting “Could not parse file, skipping. Your build will not break.”

If you use postcss syntax based plugins then read this.

Something is wrong. Good news is gatsby-plugin-purgecss should not cause any issue in such cases, files which could not be parsed will be skipped. If you want to diagnose the problem then use the debug option. Also, feel free to create a GitHub issue.

Issue 5: Using npm packages with components which import css files

If you import a npm package which imports its own styles locally, then gatsby-plugin-purgecss will incorrectly remove all the css imported by the package. It’s because by default the selectors are only matched with the files under ‘src’ folder.
To get around this, you could:

  1. Ignore the file completely using the ignore option
  2. use the content option and add the package’s path. Eg:

    content: [
    path.join(process.cwd(), 'src/**/!(*.d).{ts,js,jsx,tsx}'),
    path.join(process.cwd(), 'node_modules/my-npm-package/folder-to-match/!(*.d).{ts,js,jsx,tsx}')
    ];
  3. Whitelisting the required selectors as described in the next section.

Whitelist Solutions

You can use any of these techniques to stop purgecss from removing required styles

1. Whitelist the selector using the whitelist option in gatsby-config.js
whitelist: ['my-selector']

Read about whitelist option.

2. For selector with dashes in them and using named imports

You could write it like className={style['my-selector']} instead.

3. Use a JavaScript comment
// my-selector
<div className={style.mySelector} />

This comment can be in any script file inside src.

4. Use Regex pattern to exclude many selectors

whitelistPatterns option is available from purgecss

whitelistPatterns: [/^btn/]

For eg, this pattern will whitelist all selectors starting with btn: btn btn-primary btn-secondary etc.
Read about whitelistPatterns option.
Look at the whitelistPatternsChildren option in purgecss to also whitelist children of the selectors.

5. Use purgecss ignore comment in css file
/* purgecss ignore */
.my-selector { color: 'white' }

This comment will ignore the selector on the next line.

5. Use purgecss ignore block comments in css file
/* purgecss start ignore */
button { color: 'white' };
.yo { color: 'blue' };
/* purgecss end ignore */

This comment pair will ignore all css selectors between them.

6. Ignore files and folder using the ignore options
ignore: ['ignoredFile.css', 'ignoredFolder/', 'sub/folder/ignore/', 'inFolder/file.css']

Note: always use forward slash / for folders, even on Windows.
Read about ignore option.

Improving Purgecss selector detection

Purgecss relies on extractors to get the list of selector used in a file. The default extractor considers every word of a file as a selector. You could use your own extractor (or get one made by other community members) to improve detection and further decrease your css file size. Read more at Purgecss docs.

If you do find/write a better extractor suited for Gatsby, please help me add it to the docs.

Important Notes

Running

This plugin only runs when building the project (gatsby build).
It will print the amount of css removed.

Size reporting

The size reported by this plugin is the approximate size of the css content before any optimizations have been performed.
The actual file size should be smaller.

Selector matching

This plugin loads css files (or transformed output from css plugins) and searches for matching selectors in js, jsx, ts, tsx files in src/. It does not know which css file belongs to which source file. Therefore, for eg., if there is a class .module in some css file, it will not be removed if it used in any script file under src/.

Whitelist [‘html’, ‘body’]

Since html and body tags do not appear in src/ files, it is whitelisted by default to not be removed.
Since v2.3.0, manually including ‘html’, ‘body’ is no longer required.

Using with postcss syntax plugins

gatsby-plugin-purgecss is executed before postcss loader and can only purge css syntax. If you are using any syntax based postcss plugin, then it may not get purged. In such cases you will see “Could not parse file, skipping. Your build will not break.” message. gatsby-plugin-purgecss will simply ignore the file and continue without issue. It would be better if you use purgecss postcss plugin directly instead.

Options

This plugins supports most purgecss options as is (except css).

Read about purgecss options in detail

Options can be specified in your gatsby-config.js file like so:

module.exports = {
  plugins: [
    {
      resolve: 'gatsby-plugin-purgecss',
      options: {
        printRejected: true,
      }
    }
  ]
};

rejected

Print the amount of css removed
rejected: boolean

rejected: true

default: true

printRejected

Print the list of removed selectors
printRejected: boolean

printRejected: true

Needs rejected option to be true.
It will print maximum of 100 removed selector per file to keep the output readable.
To view all the removed selector enable the printAll option.
default: false

printAll

Enables printRejected to print all the rejected selectors.
(Output can get messy)
printAll: boolean

printAll: true

Needs printRejected option to be true.
default: false

whitelist - from purgecss

Stops from removing these selectors.
whitelist: Array<string>

whitelist: ['my-selector', 'footer']

Note: do NOT add . or # for classes and ids.
'html', 'body' are always whitelisted.
Since v2.3.0 manually including ‘html’, ‘body’ is no longer required.
default: []

ignore

Stops from removing these selectors.
ignore: Array<string>

ignore: ['ignoredFile.css', 'ignoredFolder/', 'sub/folder/ignore/', 'inFolder/file.css']

Note: always use forward slash / for folders, even on Windows.
default: []

debug

Enable debugging
debug: boolean

debug: true

It will write two files to disk.
gatsby-plugin-purgecss-debug-config.js with Gatsby’s webpack config.
gatsby-plugin-purgecss-debug.js with the errors encountered.
default: false

content - from purgecss

Files to search for selectors.
content: Array<string>

content: [
  path.join(process.cwd(), 'src/**/!(*.d).{ts,js,jsx,tsx}'),
  path.join(process.cwd(), 'anotherFolder/!(*.d).{ts,js,jsx,tsx}')
];

default: [path.join(process.cwd(), 'src/**/!(*.d).{ts,js,jsx,tsx}')]

whitelistPatterns - from purgecss

Whitelist Selectors with Regular Expression
whitelistPatterns: Array<RegExp>

whitelistPatterns: [/button/, /^fa-/, /main$/]

This example will whitelist selectors containing “button”, starting with “fa-” and ending with “main”.
default: []

whitelistPatternsChildren - from purgecss

Contrary to whitelistPatterns, it will also whitelist children of the selectors.
whitelistPatternsChildren: Array<RegExp>

whitelistPatternsChildren: [/red$/]

In the example, selectors such as red p or .bg-red .child-of-bg will be left in the final CSS.
default: []

Other options from purgecss

Read About other purgecss options.
extractors?: Array<ExtractorsObj>
keyframes?: boolean
fontFace?: boolean

Versioning

gatsby-plugin-purgecss uses SemVer for versioning.

Acknowledgment

This project was made possible due to the incredible work done on the following projects:

License

This project is licensed under the MIT License - see the LICENSE file for details.


Was this helpful? edit this page on GitHub