-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Note
I’m not sure if this issue is related to Pinia, Nuxt, Vite or Rollup, but since the problem occurs specifically when using defineStore
exports, and not with other composables or exports so I’m opening the issue here.
Please let me know if I should open it issue on the right repo.
Reproduction
https://stackblitz.com/edit/github-dylldh?file=app.vue
Steps to reproduce the bug
- Go stackblitz link above, run
nuxt generate
- Go
./output/_nuxt/Dz77aYJ1.js
- Search
foofoofoo
- If found, that means the store is not tree-shaken

Bug Description
When using Pinia in a Nuxt project and creating more than one store, tree-shaking does not work as expected. Here's an example to illustrate the issue:
// store/foo.ts
export const useFooStore = defineStore('foo', () => ({ foo: ref('foofoofoo') }));
// store/bar.ts
export const useBarStore = defineStore('bar', () => ({ bar: ref('barbarbar') }));
<!-- app.vue -->
<script setup lang="ts">
if (false) {
// cannot tree-shake
console.log(useFooStore());
console.log(useBarStore());
}
</script>
After running nuxt generate
, both the foo
and bar
stores are bundled into the output, even though they are inside a conditional block that should never run.
However, if I use only one store within the if (false)
block, tree-shaking works as expected:
<!-- app.vue -->
<script setup lang="ts">
if (false) {
// can tree-shake
console.log(useFooStore());
}
</script>
In this case, the unused store is successfully tree-shaken and not included in the bundle.
Expected behavior
Tree-shaking should exclude unused stores from the final bundle, even when multiple stores are defined.
Actual behavior
When more than one store is defined, tree-shaking fails to exclude unused stores, resulting in unnecessary code being bundled.