试一试Vite + StyleX

这篇文章的概要

Meta 社开发的 CSS in JS 库 StyleX 正式发布。

 

据报道,虽然在2021年已经提及了,但它似乎于2023年12月5日(当地时间)正式对公众开放。

由于我经常使用Vite,所以我想试试Vite和StyleX的组合。

Vite 准备就绪

首先,进行创建。

bun create-vite 

我选择了React、TypeScript和SWC。

StyleX 的准备工作

首先按照官方文件中所述的进行。

bun i @stylexjs/stylex

接下来,由于 Vite 使用了 Rollup,所以我尝试安装 @stylexjs/rollup-plugin 并运行,但是失败了。

这个问题正在讨论中,并且似乎正在创建 Pull Request,所以很快可能会得到官方支持。然而,截止到2023年12月11日,它还无法正常运行。

然而,经过调查发现有个人制作了插件,我非常感激地使用了它。

 

bun i -d vite-plugin-stylex
  import { defineConfig } from "vite";
  import react from "@vitejs/plugin-react-swc";
+ import styleX from "vite-plugin-stylex";

  export default defineConfig({
-   plugins: [react()],
+   plugins: [react(), styleX()],
  });

准备工作已经完成了。以下是依赖关系和版本的列表。

{
  // 省略
  "dependencies": {
    "@stylexjs/stylex": "^0.3.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/react": "^18.2.37",
    "@types/react-dom": "^18.2.15",
    "@typescript-eslint/eslint-plugin": "^6.10.0",
    "@typescript-eslint/parser": "^6.10.0",
    "@vitejs/plugin-react-swc": "^3.5.0",
    "eslint": "^8.53.0",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-react-refresh": "^0.4.4",
    "typescript": "^5.2.2",
    "vite": "^5.0.0",
    "vite-plugin-stylex": "^0.1.0"
  }
}

基本的写作方式 de

导入 stylex

import * as stylex from "@stylexjs/stylex";

使用 stylex.create() 来生成样式

const styles = stylex.create({
  foo: {
    color: 'red',
    fontSize: '2em'
  },
  bar: {
    backgroundColor: 'blue',
  },
});

可以使用 stylex.props() 进行处理。

{/* 個別に適用 */}
<div {...styles.props(styles.foo)}>foo</div>
<div {...styles.props(styles.bar)}>bar</div>

{/* あわせて適用 */}
<div {...styles.props(styles.foo, styles.bar)}>foo bar</div>

写作一般的风格

我們來對使用create-vite生成的App.tsx加入樣式。

  import { useState } from "react";
  import reactLogo from "./assets/react.svg";
  import viteLogo from "/vite.svg";
  import "./App.css";
+ import * as stylex from "@stylexjs/stylex";

+ const styles = stylex.create({
+   title: {
+     color: "#55c500",
+   },
+ });

  function App() {
    const [count, setCount] = useState(0);

    return (
      <>
        {/* 省略 */}
        <h1 {...stylex.props(styles.title)}>Vite + React</h1>
        {/* 省略 */}
      </>
    );
  }

  export default App;

虽然只是改变了颜色,但运行得很顺利。

以下是生成的代码。

<h1 class="App__styles.title x1g81dyc">Vite + React</h1>
.x1g81dyc {
    color: rgb(85, 197, 0);
}

我試著增加一點風格。

  const styles = stylex.create({
    title: {
      color: "#55c500",
+     fontSize: "5rem",
+     marginBlock: 0,
    },
  });

每个属性都似乎添加了一个类,生成的代码也有所变化。

<h1 class="App__styles.title x1g81dyc xn7rfii x10im51j">Vite + React</h1>
.x10im51j {
    margin-block: 0px;
}

.xn7rfii {
    font-size: 5rem;
}

.x1g81dyc {
    color: rgb(85, 197, 0);
}

在我之前提供的博客链接中,提到了“原子级类名”的设计。这种设计与Tailwind CSS的方法类似。

根据国家要求的风格进行写作

或许不需要特别介绍,但根据状态改变风格似乎也没有问题。

  const styles = stylex.create({
    title: {
      color: "#55c500",
      fontSize: "5rem",
      marginBlock: 0,
    },
+   button: {
+     backgroundColor: "#ddd",
+   },
+   active: {
+     backgroundColor: "#212121",
+     color: "white",
+   }
  });

{/* 中略 */}

  <button
    onClick={() => setCount((count) => count + 1)}
+   {...stylex.props(count > 0 ? styles.active : styles.button)}
  >
    count is {count}
  </button>

正在按照计划发生变化。

最後

因为版本尚不到1.0,所以害怕在正式应用中使用,但如果Meta发布的话,应该与React兼容良好,我也这样认为。

期望着并将继续观看。

广告
将在 10 秒后关闭
bannerAds