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

Warn about rendering Generators #13312

Merged
merged 4 commits into from Aug 2, 2018
Merged

Warn about rendering Generators #13312

merged 4 commits into from Aug 2, 2018

Conversation

@gaearon
Copy link
Member

@gaearon gaearon commented Aug 2, 2018

It might not be obvious but by rendering a Generator you're asking React to perform a mutation during the render phase. This already doesn't work in development because we do key validation, thus consuming the generator. It led to some confusion: #11864, #12995, #11502, #7536.

Let's warn about this pattern right as we encounter it. The new warning shouldn't be noisy because the pattern is already broken in development (and as you can see in #12995 (comment), it's fragile in production).

I'm not sure how to detect generators in browsers that don't support toStringTag but I figured warning in modern browsers is sufficient.

@gaearon gaearon requested review from sophiebits and sebmarkbage Aug 2, 2018
@sebmarkbage
Copy link
Member

@sebmarkbage sebmarkbage commented Aug 2, 2018

Could be nice to add a test that we still support generators as the iterator of an iterable.

Loading

@gaearon
Copy link
Member Author

@gaearon gaearon commented Aug 2, 2018

We've got some.

function prepareChildrenIterable(childrenArray) {
return {
'@@iterator': function*() {
// eslint-disable-next-line no-for-of-loops/no-for-of-loops
for (const child of childrenArray) {
yield child;
}
},
};
}

Loading

@pull-bot
Copy link

@pull-bot pull-bot commented Aug 2, 2018

Details of bundled changes.

Comparing: 46d5afc...5808caa

react-dom

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-dom.development.js +0.1% +0.2% 641.77 KB 642.55 KB 150.67 KB 150.91 KB UMD_DEV
react-dom.development.js +0.1% +0.2% 637.91 KB 638.69 KB 149.49 KB 149.74 KB NODE_DEV
ReactDOM-dev.js +0.1% +0.2% 645.01 KB 645.94 KB 147.81 KB 148.06 KB FB_WWW_DEV

react-art

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-art.development.js +0.2% +0.2% 434.58 KB 435.36 KB 98.41 KB 98.65 KB UMD_DEV
react-art.development.js +0.2% +0.3% 367.09 KB 367.88 KB 81.34 KB 81.58 KB NODE_DEV
ReactART-dev.js +0.3% +0.3% 357.43 KB 358.35 KB 76.2 KB 76.45 KB FB_WWW_DEV

react-test-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-test-renderer.development.js +0.2% +0.3% 362.99 KB 363.77 KB 79.75 KB 79.99 KB UMD_DEV
react-test-renderer.development.js +0.2% +0.3% 359.12 KB 359.9 KB 78.77 KB 79.01 KB NODE_DEV
ReactTestRenderer-dev.js +0.3% +0.3% 364.09 KB 365.01 KB 77.69 KB 77.94 KB FB_WWW_DEV

react-reconciler

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-reconciler.development.js +0.2% +0.3% 348.11 KB 348.89 KB 75.38 KB 75.62 KB NODE_DEV
react-reconciler-persistent.development.js +0.2% +0.3% 346.73 KB 347.51 KB 74.82 KB 75.06 KB NODE_DEV

react-native-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
ReactNativeRenderer-dev.js +0.2% +0.2% 482.26 KB 483.18 KB 106.55 KB 106.8 KB RN_FB_DEV
ReactNativeRenderer-dev.js +0.2% +0.2% 481.99 KB 482.92 KB 106.49 KB 106.74 KB RN_OSS_DEV
ReactFabric-dev.js +0.2% +0.2% 472.47 KB 473.39 KB 104.11 KB 104.36 KB RN_FB_DEV
ReactFabric-dev.js +0.2% +0.2% 472.5 KB 473.43 KB 104.13 KB 104.38 KB RN_OSS_DEV

Generated by 🚫 dangerJS

Loading

@sebmarkbage
Copy link
Member

@sebmarkbage sebmarkbage commented Aug 2, 2018

We should also test one with a modern Symbol.iterator.

Loading

@gaearon gaearon merged commit 1609cf3 into facebook:master Aug 2, 2018
1 check passed
Loading
@gaearon gaearon deleted the no-generators branch Aug 2, 2018
) {
warning(
didWarnAboutGenerators,
'Using Generators as children is unsupported and will likely yield ' +
Copy link
Contributor

@aweary aweary Aug 2, 2018

Choose a reason for hiding this comment

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

yield unexpected results

nice pun 😄

Loading

Copy link
Member Author

@gaearon gaearon Aug 2, 2018

Choose a reason for hiding this comment

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

Loading

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

Successfully merging this pull request may close these issues.

None yet

5 participants