Documents
performance.en-US
performance.en-US
Type
External
Status
Published
Created
Jun 12, 2026
Updated
Jun 12, 2026
Source
View

Performance: createStyles vs createStaticStyles#

Choosing the right styling approach is crucial in high-performance scenarios. This article compares the performance differences between createStyles and createStaticStyles to help you make the best choice.

Performance Comparison#

How It Works#

createStyles (Hook Mode)#

const useStyles = createStyles(({ css, token }) => ({
  container: css`
    background: ${token.colorBgContainer};
  `,
}));

const Component = () => {
  const { styles } = useStyles(); // Called on every render
  return <div className={styles.container} />;
};

Overhead per render:

  1. Call useStyles Hook
  2. Execute useContext to get theme context (multiple times)
  3. Execute useMemo to compute styles
  4. Execute useInsertionEffect to insert styles
  5. Return styles object

createStaticStyles (Static Mode)#

// Executed once at module load
const styles = createStaticStyles(({ css, cssVar }) => ({
  container: css`
    background: ${cssVar.colorBgContainer};
  `,
}));

const Component = () => {
  // Direct usage, no Hook calls
  return <div className={styles.container} />;
};

Overhead per render:

  • Zero Hook calls
  • Zero context lookups
  • Direct reference to pre-computed className strings

Performance Difference Sources#

AspectcreateStylescreateStaticStyles
Style computationEvery renderModule load (once)
Hook calls8+0
Context lookupsMultiple0
useMemo overheadYesNo
Theme responseReal-timeVia CSS variables
GC pressureHighLow

Use Cases#

  • List items: Table rows, List items, virtual list items
  • High-frequency rendering: Animation components, real-time dashboards
  • Many instances: 100+ styled components on a page
  • Performance-sensitive: Low-end devices, mobile
  • Dynamic props needed: Styles depend on component props
  • JS token values needed: e.g., token.colorPrimary + '80'
  • isDarkMode needed: Conditional logic based on dark mode
  • customToken needed: Using custom tokens
  • stylish needed: Using preset styles

Migration Guide#

Migrating from createStyles to createStaticStyles is straightforward:

Before#

import { createStyles } from 'antd-style';

const useStyles = createStyles(({ css, token }) => ({
  card: css`
    padding: ${token.paddingLG}px;
    background: ${token.colorBgContainer};
    border-radius: ${token.borderRadiusLG}px;
  `,
}));

const Card = () => {
  const { styles } = useStyles();
  return <div className={styles.card}>...</div>;
};

After#

import { createStaticStyles } from 'antd-style';

const styles = createStaticStyles(({ css, cssVar }) => ({
  card: css`
    padding: ${cssVar.paddingLG};
    background: ${cssVar.colorBgContainer};
    border-radius: ${cssVar.borderRadiusLG};
  `,
}));

const Card = () => {
  return <div className={styles.card}>...</div>;
};

Key changes:

  1. createStylescreateStaticStyles
  2. token.xxxcssVar.xxx (CSS variables don't need px units)
  3. useStyles() → Use styles directly
  4. Remove const { styles } = useStyles()

Hybrid Strategy#

In real projects, you can mix both approaches based on the scenario:

import { createStaticStyles, createStyles } from 'antd-style';

// Static styles - for basic layouts
const staticStyles = createStaticStyles(({ css, cssVar }) => ({
  container: css`
    padding: ${cssVar.padding};
  `,
}));

// Dynamic styles - for scenarios requiring props
const useDynamicStyles = createStyles(({ css, token }, { active }: { active: boolean }) => ({
  item: css`
    background: ${active ? token.colorPrimary : token.colorBgContainer};
  `,
}));

const Component = ({ active }) => {
  const { styles } = useDynamicStyles({ active });

  return (
    <div className={staticStyles.container}>
      <div className={styles.item}>...</div>
    </div>
  );
};

Summary#

MetriccreateStylescreateStaticStyles
PerformanceNormalOptimal
FlexibilityHigh (dynamic support)Medium (CSS vars only)
UsageHookDirect reference
ThemeJS Token (real-time)CSS variables
Best forDynamic, complex logicHigh-perf, many comps

Recommendation: Use createStaticStyles by default, and only use createStyles when you need dynamic props or JS token calculations.