Skip to content
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

Deps Pre-optimization does not exclude nested deps #5688

Open
7 tasks done
antfu opened this issue Nov 15, 2021 · 5 comments
Open
7 tasks done

Deps Pre-optimization does not exclude nested deps #5688

antfu opened this issue Nov 15, 2021 · 5 comments
Assignees
Labels
p3-downstream-blocker Blocking the downstream ecosystem to work properly (priority)

Comments

@antfu
Copy link
Member

antfu commented Nov 15, 2021

Describe the bug

For example, we have @vueuse/core relying on vue-demi, if we exclude the optimization for vue-demi (but not @vueuse/core) via

optimizeDeps: {
  exclude: [
    'vue-demi'
  ]
}

Which the nested vue-demi does not been excluded from the optimized bundle for @vueuse/core. Causing the potential duplication for deps.

Related nuxt/bridge#186

Reproduction

(Just creating a quick issue for tracking, will fulfill the repro and make the PR soon)

System Info

-

Used Package Manager

pnpm

Logs

No response

Validations

@antfu antfu self-assigned this Nov 15, 2021
@antfu antfu added bug p3-downstream-blocker Blocking the downstream ecosystem to work properly (priority) and removed pending triage labels Nov 15, 2021
@bluwy
Copy link
Member

bluwy commented Nov 15, 2021

I can confirm this too. I had always assumed this to be intentional since prebundling is always necessary for third-party libraries. Or it would cause the duplication issue as mentioned. Is there a reason to exclude vue-demi? (I'm not familiar with the current state of Nuxt)

@antfu
Copy link
Member Author

antfu commented Nov 15, 2021

Some packages might be relying on the internal singleton states (in my case is @vue/composition-api). Just imagining

import Vue from 'vue'

Vue.use(SomePlugin)
import Vue from 'vue'

Vue.$someplugin() // if the `vue` is not the same vue, it will failed.

So I guess at least we should support something like: (similar to the include pattern https://vitejs.dev/config/#optimizedeps-exclude)

optimizeDeps: {
  exclude: [
    '* > vue-demi'
  ]
}

@bluwy
Copy link
Member

bluwy commented Nov 15, 2021

We also had the same singleton issue for Svelte as well. The solution was to force optimizeDeps.include on svelte, so the prebundled code essentially deduped it. I think the code example can be fixed the same way as well by adding vue to optimizeDeps.include. I'm not entirely clear why vue-demi is to be excluded 😅 but the exclude pattern is certainly a nice addition where needed.

@antfu
Copy link
Member Author

antfu commented Nov 16, 2021

Yeah, the problem is that we want to do some aliasing here so we have to opt-out of those dependencies. If we exclude one sub dependencies (vue-demi) which make all packages on top of it also be excluded from the optimization (otherwise it would still have duplications). From Nuxt's perspective, it's impossible to list all the packages relying on vue-demi or @vue/composition-api to exclude them out. Not only the performance might suffer for unbundled packages, it also means any new packages that are not on the exclusion list will break the app 😅

I will see what I can improve it and drop a PR soon

@TimvdEijnden
Copy link

Yeah, the problem is that we want to do some aliasing here so we have to opt-out of those dependencies. If we exclude one sub dependencies (vue-demi) which make all packages on top of it also be excluded from the optimization (otherwise it would still have duplications). From Nuxt's perspective, it's impossible to list all the packages relying on vue-demi or @vue/composition-api to exclude them out. Not only the performance might suffer for unbundled packages, it also means any new packages that are not on the exclusion list will break the app 😅

I will see what I can improve it and drop a PR soon

Hey @antfu Loved your talk 2 days ago :) But I'm also looking intro upgrading to nuxt 3.2 but I now also face the same issue.

SyntaxError: The requested module 'vue-demi' does not provide an export named 'default'

It's from a package which has vue-demi as a nested dependency.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
p3-downstream-blocker Blocking the downstream ecosystem to work properly (priority)
Projects
None yet
Development

No branches or pull requests

4 participants