StyleX: What Do We Know So Far?

  • Reading time
  • Published date
  • Blog post authorFatCat Coders
Preview Image
Share:

On December 5th, 2023, StyleX made its debut as "Meta’s Answer to Scalable CSS." This unveiling sparked numerous questions, primarily centered around the implementation of this solution in various projects.

That is why we researched this subject to provide insights into why StyleX came into existence, its current advantages, and the innovative features it brings. Join us as we briefly explore the creation, benefits, and introduced features of StyleX. Let's delve in!

Why Was StyleX Created?

Understanding the motives behind creating StyleX begins with reflecting on the challenges that Facebook had with CSS. Three years ago, Meta’s team embarked on a complete React rewrite of Facebook's entire web frontend, and they encountered a significant need to manage CSS. This struggle resonates with many large-scale projects and companies grappling with numerous options such as build-time versus run-time, CSS versus CSS declared in JavaScript, and the decision of whether to adopt a utility-first system like Tailwind.

Their chosen solution involved constructing a new CSS platform—an additional foundational pillar in their application architecture. While GraphQL and Relay managed data and React handled the DOM, StyleX was introduced to oversee styling. Moreover, the aim was for this new CSS system to learn from past mistakes.

Meta's chosen solution involved constructing a new CSS platform—an additional foundational pillar in their application architecture. While GraphQL and Relay managed data and React handled the DOM, StyleX was introduced to oversee styling. Moreover, the aim was for this new CSS system to learn from past mistakes.

Previously, Facebook's architecture resembled CSS modules, but it encountered challenges with scalability. To address these issues, they implemented runtime loading of CSS as needed. However, the use of lazy loading led to selector precedence issues. As a result, navigating the site through different routes loaded CSS in varied orders, leading to unexpected styling outcomes.

Important StyleX Features

Understanding StyleX's approach involves grasping the concept of atomic styles.

Picture incorporating CSS directly into your React components rather than in distant, sprawling stylesheets. StyleX embraces this concept, enabling the creation of small, reusable "atomic" styles that seamlessly combine to craft impressive UIs.

Consequently, atomic styles and incline styling stand as pivotal features of StyleX. These elements work in tandem, empowering the creation of custom, reusable styles within React components for a more cohesive and efficient workflow.

Moreover, with the deterministic resolution, StyleX ensures the precise application of styles, simplifying the debugging process by ensuring styles function exactly as intended.

Additional benefits encompass Static CSS Generation and TypeScript Support, enhancing the usability and enjoyment of StyleX. Finally, OpenProps Integration allows access to an extensive library of pre-defined utilities for spacing, colors, animations, and more, expediting the development process.

How Does StyleX Work?

If you visit the official StyleX webpage, you'll notice a significant emphasis on how StyleX operates as a cohesive set of tools. At its core lies a crucial component: the Babel plugin, which is regarded as the primary element of StyleX. This plugin's primary function involves identifying and extracting all styles defined within your source code, subsequently converting them into atomic class names during the compilation process.

As a helper function, Babel handles tasks such as deduplication, sorting, and writing the collected styles to a CSS file. These tools play a vital role in the implementation of bundler plugins, ensuring the efficient functioning of StyleX within various development environments.

StyleX in An Example of a [Button]

For a clearer understanding of StyleX's functionality, examining the button component is recommended. Here's the code extracted from Jack Herrington’s article on Medium.

1import * as stylex from "@stylexjs/stylex";
2const styles = stylex.create({
3 base: {
4   appearance: "none",
5   borderWidth: 0,
6   borderStyle: "none",
7   backgroundColor: "blue",
8   color: "white",
9   borderRadius: 4,
10   paddingBlock: 4,
11   paddingInline: 8,
12 },
13});
14export default function Button({
15 onClick,
16 children,
17}: Readonly<{
18 onClick: () => void;
19 children: React.ReactNode;
20}>) {
21 return (
22   <button {...stylex.props(styles.base)} onClick={onClick}>
23     {children}
24   </button>
25 );
26}

As observed, styles are co–located alongside the component that utilizes them, offering significant advantages in terms of developer experience (DX) and code readability, especially for those who prefer the emotion-style approach to writing CSS. Despite this, you still benefit from compile-time CSS advantages that are absent in a runtime system like Emotion.

Regrettably, while the ease of use that Tailwind offers with its shorthand styles isn't directly accessible (although there is support for design tokens and potential creation of these shorthands), the trade-off comes with a greater degree of control over styling, compensating for the absence of Tailwind's shorthand functionalities.

Final Thoughts

There's much more to explore and learn about StyleX; its community is continuously growing, contributing new features and enhancements. While compared to Tailwind, StyleX might not be as straightforward to use, it does provide invaluable tooling and capabilities.

To keep up with the changing world of web development, it's crucial to stay updated with the latest trends. Check out our blog, where we discuss hot topics like Bun runtime and HTMX.

If you're seeking more insights or want to learn about our services, feel free to get in touch with us. We're here to help you navigate the exciting world of web development.

Let’s work together

Get in touch and let us know how we can help.

...or, if you rather prefer messages: