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

esbuild keepNames not respected #13727

Open
7 tasks done
spence-novata opened this issue Jul 6, 2023 · 13 comments · May be fixed by #14616
Open
7 tasks done

esbuild keepNames not respected #13727

spence-novata opened this issue Jul 6, 2023 · 13 comments · May be fixed by #14616

Comments

@spence-novata
Copy link

Describe the bug

Keeps names is being overridden https://github.com/vitejs/vite/blame/6f1c55e7d694dd26f9eca30239faeb5a59c41486/packages/vite/src/node/plugins/esbuild.ts#L226

This is confusing because the type definition for vite.config.ts accepts it.

And whilst generally it doesn't seem to be a problem when a class references itself:

export class MyClass {
  static self() {
    return MyClass
  }
}

esbuild prefixes the class with an underscore.

Originally reported on Vitest, @sheremet-va suggested this was introduced as a fix for #9164

Reproduction

https://github.com/spence-novata/vitest-keep-name-poc

Steps to reproduce

npm i
npm run test

System Info

System:
    OS: macOS 13.4.1
    CPU: (10) arm64 Apple M1 Max
    Memory: 3.83 GB / 64.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 18.3.0 - ~/.asdf/installs/nodejs/18.3.0/bin/node
    npm: 8.11.0 - ~/.asdf/plugins/nodejs/shims/npm
    pnpm: 7.16.0 - /opt/homebrew/bin/pnpm
    Watchman: 2023.03.13.00 - /opt/homebrew/bin/watchman
  Browsers:
    Brave Browser: 113.1.51.118
    Chrome: 114.0.5735.198
    Safari: 16.5.1

Used Package Manager

npm

Logs

No response

Validations

@devjiwonchoi
Copy link

devjiwonchoi commented Jul 6, 2023

#9166

Seems like keepNames is not allowed in esbuild.

import { defineConfig } from "vitest/config";

export default defineConfig({
  esbuild: {
    keepNames: true, // ---> not allowed in `esbuild`
  },
  test: {
    globals: true,
  },
})

@spence-novata
Copy link
Author

That doesn't seem to be the case for me and looking at the source types:

UserConfig.esbuild is typed as ESBuildOptions
which extends TransformOptions from esbuild
which extends CommonOptions from esbuild
which types its keepNames property as ?: boolean

The main problem is that Vite doesn't expose keepNames. The typing just confuses the issue.

@devjiwonchoi
Copy link

devjiwonchoi commented Jul 6, 2023

I mean the option itself is disabled in vite:

Code from Vite.js repo

Screenshot 2023-07-06 at 7 55 42 PM

// packages/vite/src/node/plugins/esbuild.ts

const transformOptions: TransformOptions = {
    target: 'esnext',
    charset: 'utf8',
    ...esbuildTransformOptions,
    minify: false,
    minifyIdentifiers: false,
    minifySyntax: false,
    minifyWhitespace: false,
    treeShaking: false,
    // keepNames is not needed when minify is disabled.
    // Also transforming multiple times with keepNames enabled breaks
    // tree-shaking. (#9164)
    keepNames: false,
  }

@spence-novata
Copy link
Author

Ah oh see, sorry I thought you meant that it's not allowed under with typing.

It looks like whilst generally keepNames is not needed when minify is disabled, if the class references itself it is needed.

@sheremet-va
Copy link
Member

I would assume that we need to disable keepNames only when building because the minification is not performed in serve mode:

configResolved(config) {
  if (config.command === 'build') {
    transformOptions.keepNames = false
  }
}

@devjiwonchoi
Copy link

I would assume that we need to disable keepNames only when building because the minification is not performed in serve mode:

@sheremet-va Do you mind if I open a PR for that modification?

@spence-novata
Copy link
Author

Wouldn't that just fix serve mode and break it when built?

@sheremet-va
Copy link
Member

This then?

configResolved(config) {
  if (config.command === 'build' && config.build.minify === 'esbuild') {
    transformOptions.keepNames = false
  }
}

@spence-novata
Copy link
Author

Would that then require to minify to be set to terser (or disabled) for keepNames to be respected?

@HammCn
Copy link
Contributor

HammCn commented Aug 18, 2023

Same issues in my project

vite: v4.4.9
terser: 5.19.2

only part of the class name and function name kept when i set minify to 'terser'.

image

but some class name kept in other position:

image

@TrulyBright
Copy link

So the keepNames option disabled in transform phase somehow lets names change.

I think #9166 may as well be reverted unless we get to find a solution that makes both tree-shaking and keepNames work properly. Tree-shaking is about file size while keepNames is about real logic that matters. I'm referencing instance.constructor.name a lot in my project and have no idea how to solve this issue.

@illegalnumbers
Copy link

is this still a bug?

@illegalnumbers
Copy link

i would also like 'keepNames' to be respected

juanrgm added a commit to swordev/suid that referenced this issue Mar 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants