Skip to content

Commit

Permalink
next-swc: fix ssg code elimination when used in render (#32709)
Browse files Browse the repository at this point in the history
* next-swc: fix ssg code elimination when used in render

* simplify logic and add more thorough tests

* comment

* remove fold_export_default and fix JSX member expression
  • Loading branch information
pveyes committed Jan 11, 2022
1 parent 5f4947e commit 600f113
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 0 deletions.
25 changes: 25 additions & 0 deletions packages/next-swc/crates/core/src/next_ssg.rs
Expand Up @@ -141,6 +141,31 @@ impl Fold for Analyzer<'_> {
e
}

fn fold_jsx_element(&mut self, jsx: JSXElement) -> JSXElement {
fn get_leftmost_id_member_expr(e: &JSXMemberExpr) -> Id {
match &e.obj {
JSXObject::Ident(i) => {
i.to_id()
}
JSXObject::JSXMemberExpr(e) => {
get_leftmost_id_member_expr(e)
}
}
}

match &jsx.opening.name {
JSXElementName::Ident(i) => {
self.add_ref(i.to_id());
}
JSXElementName::JSXMemberExpr(e) => {
self.add_ref(get_leftmost_id_member_expr(e));
}
_ => {}
}

jsx.fold_children_with(self)
}

fn fold_fn_decl(&mut self, f: FnDecl) -> FnDecl {
let old_in_data = self.in_data_fn;

Expand Down
@@ -0,0 +1,38 @@
import { useState, useEffect } from 'react'
import { Root, Children, JSXMemberExpression, AttributeValue, AttributeJSX, ValueInRender, ValueInEffect, UnusedInRender } from '../'

export default function Test() {
const [x, setX] = useState(ValueInRender.value)
useEffect(() => {
setX(ValueInEffect.value)
}, [])

return (
<Root x={x}>
<div>
<Children attr={AttributeValue} jsx={<AttributeJSX />} />
<JSXMemberExpression.Deep.Property />
</div>
</Root>
)
}

export async function getStaticProps() {
return {
props: {
// simulate import usage inside getStaticProps
used: [
// these import references should not be removed
Root.value,
Children.value,
AttributeValue.value,
AttributeJSX.value,
ValueInRender.value,
ValueInEffect.value,
JSXMemberExpression.value,
// this import reference should be removed
UnusedInRender.value,
],
}
}
}
@@ -0,0 +1,15 @@
import { useState, useEffect } from "react";
import { Root, Children, JSXMemberExpression, AttributeValue, AttributeJSX, ValueInRender, ValueInEffect } from "../";
export var __N_SSG = true;
export default function Test() {
const [x, setX] = useState(ValueInRender.value);
useEffect(() => {
setX(ValueInEffect.value);
}, [])
return __jsx(Root, {
x: x
}, __jsx('div', null, __jsx(Children, {
attr: AttributeValue,
jsx: __jsx(AttributeJSX, null)
}), __jsx(JSXMemberExpression.Deep.Property, null)));
}

0 comments on commit 600f113

Please sign in to comment.