perf: mark defineComponent
as side-effects-free
#8512
Merged
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.
Rollup now supports marking a function as sied-effect free:
#__NO_SIDE_EFFECTS__
annotation for function declaration rollup/rollup#5024It's a common pitfall in tree-shaking component libraries. For example
It seems
RouterLink
should be tree shaken, but in reality, becausedefineComponent
is a bit complex that Rollup can't know whether it contains side-effects, causing it still remain in the bundle even if it's not been used.A solution to that is to add the
__PURE__
comment to mark them as pure. But that requires to do so every single time, which can easily be forgotten.So, instead of asking every callee to add
__PURE__
, we mark thedefineComponent
function itself to be side-effect-free using__NO_SIDE_EFFECTS__
. So they can always be safely tree-shaken.In this PR, the following functions are marked side-effect free:
defineComponent
defineAsyncComponet
defineCustomElement
defineSSRCustomElement