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

Ensure function arity is preserved after build #31808

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

davesnx
Copy link

@davesnx davesnx commented Dec 16, 2024

Closes #31578
Closes #31598


Problem

The google closure compiler has a feature for optimizing function calls. It identifies opportunities to replace the original argument arrays with a more compact representation, such as array or replace constant arguments with their literal values.

In the case of functions that use arguments it added an extra parameter and caused the arity (fn.length) to differ (which became different from development to prod due to DEV).

This became an issue for reason-react (and maybe other binding systems as well), since we need to bind to the interface and statically how many parameters are expected. reason-react carries the OCaml-way of being a curried language where there's no difference between let fn = (a, b) => ... and let fn = (a) => (b) => .... The compiler to JavaScript (Melange) has a small runtime that calls the function with the right number of parameters. This is the related issue: reasonml/reason-react#860.

Solution

At first, I made it work with the // @nocollapse annotation (https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler#nocollapse), but I found out that just adding a reference is more clear on the intention of the gcc to not optimze this bit, rather than using a no-obvious annotation that seems to do the job.

Thanks @eps1lon for the help

Copy link

vercel bot commented Dec 16, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
react-compiler-playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 17, 2024 4:24pm

@eps1lon eps1lon changed the title [I#31578] Fix for different arity based on development Ensure function arity is preserved after build Dec 17, 2024
Copy link
Collaborator

@eps1lon eps1lon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great find!

message:
'Google Closure Compiler optimized `arguments` access. ' +
'This affects function arity. ' +
'Access `arguments.length` to avoid this optimization',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should update this. This advise does not work

@react-sizebot
Copy link

Comparing: 34ee391...f229077

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.68 kB 6.68 kB +0.05% 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js +0.02% 510.66 kB 510.76 kB +0.06% 91.30 kB 91.36 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.69 kB 6.69 kB +0.05% 1.83 kB 1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js +0.02% 515.44 kB 515.55 kB +0.02% 92.15 kB 92.17 kB
facebook-www/ReactDOM-prod.classic.js +0.01% 592.36 kB 592.44 kB +0.07% 104.36 kB 104.43 kB
facebook-www/ReactDOM-prod.modern.js +0.01% 582.63 kB 582.70 kB +0.07% 102.81 kB 102.87 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 46aa363

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[React 19] useState's setter function becomes arity 2
4 participants