DEV Community

Cover image for Why your Tailwind build is bloated (And how to fix it in 3 steps)
Avishek Dhimal
Avishek Dhimal

Posted on

Why your Tailwind build is bloated (And how to fix it in 3 steps)

Tailwind CSS is an absolute game-changer for speed, but if you aren't careful, you can end up shipping a massive utility stylesheet to your users.

If your production CSS file is clocking in at over a few dozen kilobytes, something is wrong with your configuration. Luckily, getting it back down to a lightning-fast size only takes a few adjustments. Here is exactly how to audit and fix a bloated Tailwind build.

1. Stop using dynamic class strings

The number one reason Tailwind builds balloon or completely miss classes in production is dynamic string interpolation.

Tailwind’s scanner looks for unbroken, complete strings in your source files. If it sees the full string, it keeps the utility. If you break it up, it skips it.

Don't do this:


javascript
// This will FAIL or cause issues because Tailwind doesn't compile code at runtime
const buttonColor = "indigo";
const classString = `bg-${buttonColor}-600`;

Do this instead:

// Write out the full class names so the static extractor can find them
const buttonColors = {
  primary: "bg-indigo-600 hover:bg-indigo-700",
  secondary: "bg-gray-600 hover:bg-gray-700"
};
If the static scanner can’t see the literal string bg-indigo-600, that class won't be included in your final CSS tree-shaking process.

2. Lock down your content array
Tailwind needs to know exactly which files to watch. If your tailwind.config.js file has an overly broad path, it will parse files it shouldn't, slowing down build times and picking up accidental strings as classes.

Check your configuration file:

JavaScript
module.exports = {
  content: [
    "./src/**/*.{html,js,ts,jsx,tsx,vue}",
    // Avoid tracking entire node_modules directories or backup folders!
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
Make sure you are only targeting your actual source directory. Never point the scanner toward massive compiled build folders like /dist or /build.

3. Don't abuse @apply
The @apply directive is tempting when you want to "clean up" your HTML, but overusing it completely destroys the benefits of Tailwind's design system.

When you use utility classes in your HTML, the same bg-blue-500 class is reused across 100 components, adding zero bytes to your final CSS file. But when you use @apply in a CSS file:

CSS
/* This duplicates CSS declarations behind the scenes */
.btn-primary {
  @apply bg-blue-500 text-white font-bold py-2 px-4 rounded;
}
.card-action {
  @apply bg-blue-500 text-white font-bold py-2 px-4 rounded;
}
Tailwind is forced to generate duplicate raw CSS properties for every custom class name you create, heavily inflating your final bundle size. Stick to utility classes in your component markup whenever possible.

Streamlining your workflow
Keeping your utility workflow clean shouldn't mean copying and pasting raw configuration blocks over and over. If you want to jumpstart a clean architecture, I use a lightweight tool I built called [PaletteCSS](https://palettecss.com/) to quickly grab optimized, pre-formatted theme configurations for Tailwind, SCSS, or vanilla CSS variables without the boilerplate hassle.

What's your biggest pet peeve when working with utility-first CSS? Let's talk shop in the comments!
Enter fullscreen mode Exit fullscreen mode

Top comments (0)