Skip to content

empty css rollup input generates empty js output #19960

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
7 tasks done
MoritzLoewenstein opened this issue Apr 29, 2025 · 4 comments
Open
7 tasks done

empty css rollup input generates empty js output #19960

MoritzLoewenstein opened this issue Apr 29, 2025 · 4 comments
Labels
feat: build feat: css p2-edge-case Bug, but has workaround or limited in scope (priority)

Comments

@MoritzLoewenstein
Copy link

MoritzLoewenstein commented Apr 29, 2025

What I am doing

Empty CSS (or SCSS) file as input in vite rollupOptions config.

export default {
  build: {
    manifest: true,
    rollupOptions: {
      input: [/* 'test.scss', */ 'test.css'],
    },
  },
};

What i expect to happen

I expected either no output for this file (and no manifest entry),
or an empty css file output and a manifest entry like this:

{
  "test.css": {
    "file": "assets/test-l0sNRNKZ.css",
    "name": "test",
    "src": "test.css",
    "isEntry": true
  }
}

What is actually happening

Vite generates an empty js file as output when running vite build, e.g. this manifest entry:

{
  "test.css": {
    "file": "assets/test-l0sNRNKZ.js",
    "name": "test",
    "src": "test.css",
    "isEntry": true
  }
}

Note: the stackblitz reproduction does error when compiling scss, but the same thing happens when building an empty scss file.

Reproduction

https://stackblitz.com/edit/vite-empty-css-fzjoe4md?file=vite.config.js

Steps to reproduce

Run npm install followed by npm run build

System Info

System:
    OS: Linux 5.0 undefined
    CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 0 Bytes / 0 Bytes
    Shell: 1.0 - /bin/jsh
  Binaries:
    Node: 20.19.1 - /usr/local/bin/node
    Yarn: 1.22.19 - /usr/local/bin/yarn
    npm: 10.8.2 - /usr/local/bin/npm
    pnpm: 8.15.6 - /usr/local/bin/pnpm
  npmPackages:
    vite: ^6.3.3 => 6.3.3

Used Package Manager

npm

Logs

No response

Validations

@sapphi-red sapphi-red added feat: css p2-edge-case Bug, but has workaround or limited in scope (priority) feat: build labels Apr 30, 2025
@nakul-py
Copy link

Hey @MoritzLoewenstein, Vite skips empty CSS files during build. You can add a dummy class (like :root {}) to make sure it's processed and output as a .css file.

Results

Before adding dummy class.

Image

After adding dummy class.

Image

@MoritzLoewenstein
Copy link
Author

Hey @nakul-py ,
this is true, but when using lightningcss as the css transformer the same thing happens for every css file that minifies to an empty file (which may not always be obvious): vite-empty-css-fzjoe4md-k3rcgpsn
Note: lightningcss does not seem to work on stackblitz, only the vite config changed from the previous reproduction.

@nakul-py
Copy link

Hey @MoritzLoewenstein If test.css is empty or only has comments, LightningCSS might be stripping it all out. I hope this works vite-empty-css

@MoritzLoewenstein
Copy link
Author

This will "work" in the sense that it will generate a css output file, my issue is that I am building a custom vite php integration which will read the manifest. It just seems illogical that a css/scss entry can generate a js output in any case. If that is expected I will handle it in my integration, I was just thinking that it seems unintuitive / appears to be a bug.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat: build feat: css p2-edge-case Bug, but has workaround or limited in scope (priority)
Projects
None yet
Development

No branches or pull requests

3 participants