Skip to content

Commit

Permalink
perf: bypass anonymous TPhrasing nodes with one child or less
Browse files Browse the repository at this point in the history
  • Loading branch information
jsamr committed Jun 4, 2021
1 parent 11a1d3e commit dad450d
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 10 deletions.
5 changes: 2 additions & 3 deletions packages/render-html/src/TDocumentRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import React, { memo, useEffect, useMemo } from 'react';
import { TDocument } from '@native-html/transient-render-engine';
import { DocumentMetadata, RenderHTMLFragmentProps } from './shared-types';
import DocumentMetadataProvider from './context/DocumentMetadataProvider';
import { useTNodeChildrenRenderer } from './context/TChildrenRendererContext';
import { defaultMarkers } from './helpers/getMarkersFromTNode';
import TNodeRenderer from './TNodeRenderer';

const TDocumentRenderer = memo(
({
Expand All @@ -15,7 +15,6 @@ const TDocumentRenderer = memo(
baseUrl?: string;
onDocumentMetadataLoaded?: RenderHTMLFragmentProps['onDocumentMetadataLoaded'];
}) => {
const TNodeChildrenRenderer = useTNodeChildrenRenderer();
const metadata: DocumentMetadata = useMemo(() => {
const {
baseHref,
Expand Down Expand Up @@ -49,7 +48,7 @@ const TDocumentRenderer = memo(
);
return (
<DocumentMetadataProvider value={metadata}>
<TNodeChildrenRenderer parentMarkers={parentMarkers} tnode={tdoc} />
<TNodeRenderer parentMarkers={parentMarkers} tnode={tdoc} />
</DocumentMetadataProvider>
);
}
Expand Down
14 changes: 10 additions & 4 deletions packages/render-html/src/TNodeRenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
import React from 'react';
import React, { ReactElement } from 'react';
import TBlockRenderer from './TBlockRenderer';
import TPhrasingRenderer from './TPhrasingRenderer';
import TTextRenderer from './TTextRenderer';
import { Markers, TNodeRendererProps } from './shared-types';
import {
Markers,
PropsFromParent,
TNodeRendererProps,
TNodeSubRendererProps
} from './shared-types';
import { getMarkersFromTNode } from './helpers/getMarkersFromTNode';
import { useSharedProps } from './context/SharedPropsProvider';
import { TNode } from '@native-html/transient-render-engine';

export type { TNodeRendererProps } from './shared-types';

const TNodeRenderer = function TNodeRenderer(
props: Omit<TNodeRendererProps<any>, 'markers'> & { parentMarkers: Markers }
) {
): ReactElement<TNodeSubRendererProps<TNode, PropsFromParent>> | null {
const { tnode } = props;
const sharedProps = useSharedProps();
const markers = getMarkersFromTNode(tnode, props.parentMarkers);
Expand All @@ -31,7 +37,7 @@ const TNodeRenderer = function TNodeRenderer(
sharedProps,
markers: resolvedMarkers || props.parentMarkers
};
if (tnode.type === 'block') {
if (tnode.type === 'block' || tnode.type === 'document') {
return React.createElement(TBlockRenderer, tnodeProps);
}
if (tnode.type === 'phrasing') {
Expand Down
19 changes: 16 additions & 3 deletions packages/render-html/src/TPhrasingRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,25 @@ export const TDefaultPhrasingRenderer: TDefaultRenderer<TPhrasing> = ({
return React.createElement(TDefaultTextualRenderer, props, resolvedChildren);
};

export default function TPhrasingRenderer(
props: TNodeSubRendererProps<TPhrasing>
) {
function InnerTPhrasingRenderer(props: TNodeSubRendererProps<TPhrasing>) {
const { assembledProps, Renderer } = useAssembledCommonProps(
props,
TDefaultPhrasingRenderer
);
return React.createElement(Renderer, assembledProps);
}

export default function TPhrasingRenderer(
props: TNodeSubRendererProps<TPhrasing>
) {
const TNodeChildrenRenderer = useTNodeChildrenRenderer();
// When a TPhrasing node is anonymous and has only one child, its
// rendering amounts to rendering its only child.
if (props.tnode.tagName == null && props.tnode.children.length <= 1) {
return React.createElement(TNodeChildrenRenderer, {
parentMarkers: props.markers,
tnode: props.tnode
});
}
return React.createElement(InnerTPhrasingRenderer, props);
}

0 comments on commit dad450d

Please sign in to comment.