improve keepNames behavior for profiling tools#4296
Open
sophiebits wants to merge 1 commit intoevanw:mainfrom
Open
improve keepNames behavior for profiling tools#4296sophiebits wants to merge 1 commit intoevanw:mainfrom
sophiebits wants to merge 1 commit intoevanw:mainfrom
Conversation
In my esbuild app with keepNames: true, minify: false I noticed that for declarations `let foo = function() {}` the function shows in V8 profiles as anonymous. This is due to the transformation to `let foo = __name(function() {}, 'foo')` which prevents the NamedEvaluation on the anonymous function which typically happens natively (eg: https://tc39.es/ecma262/#sec-variable-statement-runtime-semantics-evaluation for VariableDeclaration).
Evidently V8 keeps an internal idea of the function name distinct from the .name property. To work around this, we transform these instead to `let foo = __firstValue({ foo: function() {} })` which takes advantage of the name assignment in https://tc39.es/ecma262/#sec-runtime-semantics-propertydefinitionevaluation. With this fix, these functions show names correctly in the Chrome profiler.
sophiebits
commented
Oct 6, 2025
|
|
||
| // Update the "name" property on the function or class for "--keep-names" | ||
| export var __name = (target, value) => __defProp(target, 'name', { value, configurable: true }) | ||
| export var __firstValue = (obj) => { for (var k in obj) { if (__hasOwnProp.call(obj, k)) return obj[k]; } } |
Author
There was a problem hiding this comment.
(not sure if esbuild intends to support mutating Object.prototype; if not, can remove the __hasOwnProp check)
Author
|
@evanw I would appreciate a review here if you have some time 🙏 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
In my esbuild app with keepNames: true, minify: false I noticed that for declarations
let foo = function() {}the function shows in V8 profiles as anonymous, whereas it works fine for keepNames: false, minify: false. This is due to the transformation tolet foo = __name(function() {}, 'foo')which prevents the NamedEvaluation on the anonymous function which typically happens natively (eg: https://tc39.es/ecma262/#sec-variable-statement-runtime-semantics-evaluation for VariableDeclaration).Evidently V8 keeps an internal idea of the function name distinct from the .name property. To work around this, we transform these instead to
let foo = __firstValue({ foo: function() {} })which takes advantage of the name assignment in https://tc39.es/ecma262/#sec-runtime-semantics-propertydefinitionevaluation. With this fix, these functions show names correctly in the Chrome profiler.