feat(minifier): fold iife arrow functions in call expressions#16477
feat(minifier): fold iife arrow functions in call expressions#16477sapphi-red merged 13 commits intooxc-project:mainfrom
Conversation
CodSpeed Performance ReportMerging #16477 will not alter performanceComparing Summary
Footnotes
|
|
i noticed a bug in this implementation |
afa595c to
6d39973
Compare
|
@sapphi-red thank you for running tests issues reported by it should be fixed is there any guide what tests we have to run localy? |
|
Running the tests ran by the CI should be fine. |
|
Conformance tests should be ok, its interesting that
i'm not sure tho if this is this is the best way to check if we can collapse pife/iife by evaluating ancesotrs and checking if they are i did some cleanup and sorry for keeping it open while it was still WIP |
|
if you find some time, review would be appreciated |
|
i was thinking abot expanding this logic to functions with arguments, but that is going to come as separate pr |
### 🚀 Features - d209c21 allocator: Add cap to FixedSizeAllocatorPool and block when exhausted (#17023) (Cameron) - fb2af91 allocator: Add bitset utils (#17042) (zhaoting zhou) - c16082c tasks/compat_data: Integrate `node-compat-table` (#16831) (Boshen) - 5586823 span: Extract TS declaration file check to its own function (#17037) (camchenry) - 3d2b492 minifier: Fold iife arrow functions in call expressions (#16477) (Armano) - 67e9f9e codegen: Keep comments on the export specifiers (#16943) (夕舞八弦) - cb515fa parser: Improve error message for `yield` as identifier usage (#16950) (sapphi-red) - dcc856b parser: Add help for `new_dynamic_import` error (#16949) (sapphi-red) - c3c79f8 parser: Improve import attribute value error message (#16948) (sapphi-red) - 291b57b ast_tools: Generate TS declaration files for deserializer and walk files (#16912) (camc314) - 74eae13 minifier: Remove unused import specifiers (#16797) (camc314) ### 🐛 Bug Fixes - fb9e193 linter: OOM problems with custom plugins (#17082) (overlookmotel) - e59132b parser/napi: Fix lazy deser (#17069) (overlookmotel) - a92faf0 ast_tools: Support `u128` in `assert_layouts` generator (#17050) (overlookmotel) - 47b4c2f minifier/docs: Correct hyperlink path in OPTIMIZATIONS.md (#16986) (GRK) - 3002649 transformer/typescript: Remove unused import equals declaration (#16776) (Dunqing) - 5a2af88 regular_expression: Correct named capture group reference error (#16952) (sapphi-red) ### ⚡ Performance - b657bb6 allocator: Reduce time `Mutex` lock is held in `FixedSizeAllocatorPool::get` (#17079) (overlookmotel) - 1f3b19b ast: `#[ast]` macro use `#[repr(transparent)]` for single-field structs (#17052) (overlookmotel) - 225f229 parser: Use SmallVec for duplicate default export detection (#16801) (camc314) ### 📚 Documentation - a9c419f traverse: Update safety comments (#16944) (overlookmotel) Co-authored-by: overlookmotel <557937+overlookmotel@users.noreply.github.com>
…oject#16477) Improve folding of iife ## details - check all `CallExpression` if they can be collapsed eg. passed as arguments or in assignment - functions without arguments and body can be collapsed to to `void 0` `(() => {})()` or `(function () { })()` to `void 0` - with one statement and without return will be collapsed to `(c, void 0)` `(() => { fn() })()` to `(fn(), void 0)` - `FunctionExpression` is not supported `(function () { ... })()` ## notes - function with arguments could be handled by first in-lining them - empty function with arguments could be also if all arguments do not have defaults - we should consider optimizing function definitions by removing not used arguments - initially i added support for `FunctionExpression` but there is no way to track `this` usage, and thus we are unable to minify this ## change example code ```js { let AOT = true; const getAOT = /* @__NO_SIDE_EFFECTS__ */ () => AOT; const fn = getAOT() ? () => console.log("Hi") : () => {}; fn(); } ``` currently is collapsed to ```js (/* @__PURE__ */ /* @__NO_SIDE_EFFECTS__ */ (() => !0)() ? () => console.log("Hi") : () => {})(); ``` and with this change ```js console.log('Hi'); ``` ------------------ from what i can see @sapphi-red worked on this file --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Improve folding of iife
details
CallExpressionif they can be collapsedeg. passed as arguments or in assignment
void 0(() => {})()or(function () { })()tovoid 0(c, void 0)(() => { fn() })()to(fn(), void 0)FunctionExpressionis not supported(function () { ... })()notes
FunctionExpressionbut there is no way to trackthisusage, and thus we are unable to minify thischange example
code
currently is collapsed to
and with this change
from what i can see @sapphi-red worked on this file