fix: Don't hoist JSX elements referencing mutable variables (#13054)
issue-13051 Co-authored-by: Clint Goodman <clintgoodman@workfront.com>
This commit is contained in:
parent
0067fd9e02
commit
266e07736e
@ -64,13 +64,17 @@ export default declare((api, options) => {
|
|||||||
// Ignore identifiers & JSX expressions.
|
// Ignore identifiers & JSX expressions.
|
||||||
if (
|
if (
|
||||||
path.isJSXIdentifier() ||
|
path.isJSXIdentifier() ||
|
||||||
path.isIdentifier() ||
|
|
||||||
path.isJSXMemberExpression() ||
|
path.isJSXMemberExpression() ||
|
||||||
path.isJSXNamespacedName()
|
path.isJSXNamespacedName()
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (path.isIdentifier()) {
|
||||||
|
const binding = path.scope.getBinding(path.node.name);
|
||||||
|
if (binding && binding.constant) return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!path.isImmutable()) {
|
if (!path.isImmutable()) {
|
||||||
// If it's not immutable, it may still be a pure expression, such as string concatenation.
|
// If it's not immutable, it may still be a pure expression, such as string concatenation.
|
||||||
// It is still safe to hoist that, so long as its result is immutable.
|
// It is still safe to hoist that, so long as its result is immutable.
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
var _span;
|
|
||||||
|
|
||||||
let foo = 'hello';
|
let foo = 'hello';
|
||||||
|
|
||||||
const mutate = () => {
|
const mutate = () => {
|
||||||
@ -8,5 +6,5 @@ const mutate = () => {
|
|||||||
|
|
||||||
export const Component = () => {
|
export const Component = () => {
|
||||||
if (Math.random() > 0.5) mutate();
|
if (Math.random() > 0.5) mutate();
|
||||||
return _span || (_span = <span>{foo}</span>);
|
return <span>{foo}</span>;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
var _span;
|
|
||||||
|
|
||||||
let foo = 'hello';
|
let foo = 'hello';
|
||||||
export const Component = () => {
|
export const Component = () => {
|
||||||
foo = 'goodbye';
|
foo = 'goodbye';
|
||||||
return _span || (_span = <span>{foo}</span>);
|
return <span>{foo}</span>;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -0,0 +1,10 @@
|
|||||||
|
function render() {
|
||||||
|
const nodes = [];
|
||||||
|
|
||||||
|
for(let i = 0; i < 5; i++) {
|
||||||
|
nodes.push(<div>{i}</div>)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
function render() {
|
||||||
|
const nodes = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < 5; i++) {
|
||||||
|
nodes.push(<div>{i}</div>);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,7 +1,5 @@
|
|||||||
var _div;
|
|
||||||
|
|
||||||
var Foo = React.createClass({
|
var Foo = React.createClass({
|
||||||
render: function render() {
|
render: function render() {
|
||||||
return _div || (_div = <div foo={notDeclared}></div>);
|
return <div foo={notDeclared}></div>;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user