高效的 React + TailwindCSS + Styled Components 工作流程通知 2020 年 12 月 2 日动机我们需要一个 Create React App 从 Create React App 中删除标准样板创建 tailwind.config.js 创建 Tailwind.css 创建 babel-plugin-macros.config.js 创建 postcss.config.js 更新您的 package.json 创建 App.jsx 干得好 & 最后的想法一个 Create-React-App 模板。

2025-06-04

高效的 React + TailwindCSS + Styled Components 工作流程

2020年12月2日通知

动机

我们需要一个 Create React App

从 Create React App 中删除标准样板

创建 tailwind.config.js

创建 Tailwind.css

创建 babel-plugin-macros.config.js

创建 postcss.config.js

更新你的 package.json

创建 App.jsx

干得好,最后的想法

Create-React-App 模板。

2020年12月2日通知

随着 Tailwind 2.0 的发布,本文的大部分内容对于新启动的项目来说可能有些过度。然而,许多公司确实会保留现有版本以确保一致性。

如果您仍在使用 Tailwind 2.0 之前的版本,请继续。否则,我将发布一个涵盖 React 与 Tailwind 2.0 的新工作流程。

动机

许多人欣赏 TailwindCSS 试图解决的问题,但却对如何设计应用程序的样式提出了低级意见。它的代价是冗长的类选择器,往往会超出应用程序的模板逻辑。

另一位 DEV.to 作者@ryanlanciaux写了一篇文章,你可以在这里找到Tailwind 与 React 的结合。这篇文章开启了我疯狂的实验室实验。我被激励着去利用 TailwindCSS 提供的强大工具。

我之前用过的一个 CSS 库 Tachyons,它和 Tailwind 有类似的工具类策略。我实现了一个替代的 Styled Component 概念来管理 Tachyons 提供的工具类。

将 Ryan 的流程与我的 Tachyons 策略相结合,即可形成高效的 TailwindCSS 工作流程。虽然设置过程较为繁琐,但值得为维护简洁的 Tailwind 风格策略付出努力,因为该策略能够随着项目的发展而灵活扩展。

注意: 如果您只想深入了解项目,而不想从头开始构建,请滚动到文章底部并运行 Create React App 模板命令,该命令将构建本文讨论的整个项目及其依赖项。

我们需要一个 Create React App

首先,我们需要全新安装 Create React App。

npx create-react-app my-new-app

cd my-new-app

从 Create React App 中删除标准样板

接下来的说明将帮助您创建以下文件夹树。首先,您需要删除 React 样板文件。logo.svgindex.css,并从和 中App.css删除它们的导入index.jsApp.js

src
│       ├── App.jsx
│       ├── App.test.js
│       ├── AppStyles.styles.tw.js
│       ├── README.md
│       ├── index.css
│       ├── index.js
│       ├── serviceWorker.js
│       ├── setupTests.js
│       ├── tailwind.config.js
│       └── tailwind.css
Enter fullscreen mode Exit fullscreen mode

我们需要安装其余依赖项以将 Tailwind 与 Styled-Components 放在一起。

npm i --save tailwindcss tailwind.macro@next styled-components babel-plugin-macros postcss-cli autoprefixer

创建 tailwind.config.js

安装软件包后,我们需要初始化tailwind.config.js。我们可以根据项目需求自定义 Tailwind 属性。在本例中,我添加了一些配置,将 Tailwinds 默认的“蓝灰色”色调更改为更平坦的灰度。

npx tailwind init

// ./src/tailwind.config.js
module.exports = {
  theme: {
    fontFamily: {
      display: ["Helvetica", "sans-serif"],
      body: ["Helvetica-Neue", "sans-serif"]
    },
    extend: {
      colors: {
        gray: {
          "100": "#f5f5f5",
          "200": "#eeeeee",
          "300": "#e0e0e0",
          "400": "#bdbdbd",
          "500": "#9e9e9e",
          "600": "#757575",
          "700": "#616161",
          "800": "#424242",
          "900": "#212121"
        }
      }
    }
  },
  variants: {},
  plugins: []
};
Enter fullscreen mode Exit fullscreen mode

注意:您需要移动tailwind.config.js.src文件夹。Create React App 会ModuleScopePlugin阻止 Tailwind Macro 和 Babel Macro Plugin 调用tailwind.config.jsfromroot文件夹。有一些方法可以解决这个问题,但问题并不严重或紧急,无需添加这些额外的步骤,只需将配置文件放回即可root

所有其他不包含的构建格式都可以照常从文件夹中ModuleScopePlugin提供服务。tailwind.config.jsroot

创建 Tailwind.css

tailwind.css在目录中创建以下文件,.src添加调用 Tailwinds 包中的实用程序的基本 Tailwind 变量。

//./src/tailwind.css

@tailwind base;

@tailwind components;

@tailwind utilities;
Enter fullscreen mode Exit fullscreen mode

创建 babel-plugin-macros.config.js

我们需要对tailwind-macro包进行寻址以使用 Tailwinds 配置文件。这样我们才能使用tw宏(我们很快就会创建它),并允许 Babel 读取所有 Tailwinds 实用程序。

babel-plugin-macros.config.js在您的文件中创建root并将以下设置复制到文件中。

//./babel-plugin-macros.config.js

module.exports = {
  tailwind: {
    plugins: ["macros"],
    config: "./src/tailwind.config.js",
    format: "auto"
  }
};
Enter fullscreen mode Exit fullscreen mode

创建 postcss.config.js

最后……我们需要在编译期间指示 PostCSS 使用 Tailwind 和 Autoprefixer。我们稍后会在package.json文件中利用此设置。

将此文件添加到您的根目录。
postcss.config.js并将以下设置复制到文件中。

//./postcss.config.js

module.exports = {
  plugins: [
    // ...
    require("tailwindcss")("./src/tailwind.config.js"),
    require("autoprefixer")
    // ...
  ]
};
Enter fullscreen mode Exit fullscreen mode

更新你的 package.json

冲刺阶段。将以下脚本添加到您的代码中。package.json这将调用 PostCSS Cli 进行构建,并在您开发过程中实时观察 create-react-app 模块的重新加载更新。它还将自动index.css为您生成代码。

// package.json
 "scripts": {
    "build:css": "postcss src/tailwind.css -o src/index.css",
    "watch:css": "postcss src/tailwind.css -o src/index.css",
    "start": "npm run watch:css & react-scripts start",
    "build": "npm run build:css react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
  }
Enter fullscreen mode Exit fullscreen mode

呼!还在听吗?太棒了。

注意:文件命名规范取决于个人喜好。为了在编辑器中更好地区分,我使用.jsx和扩展名。会显示 React 徽标, 会显示标准 JavaScript 徽标。这有助于区分模板和样式。您可以随意命名文件,使用您觉得最舒服的方式。styles.tw.js.jsx.styles.tw.js

创建 AppStyles.styles.tw.js

让我们首先在.src目录中创建我们的样式组件:让我们开始运行并进行增量更改以确保每个更改都能正常工作。

// ./AppStyles.styles.tw.js

import styled from "styled-components";

export const AppStyles = styled.div.attrs({
  className: "w-full h-screen bg-gray-100 p-2"
})``;
Enter fullscreen mode Exit fullscreen mode

创建 App.jsx

我们开始创建模板,将以下代码复制到App.jsx。您会注意到,如果您正在运行应用程序,样式目前略有偏差。我们很快就会修复这个问题。目前我们只有部分 Tailwind 可以运行。

// ./src/App.jsx

import React from "react";
import "./index.css";
import AppStyles from "./AppStyles.styles.tw";

const App = () => {
  return (
    <AppStyles>
      <h1>Greetings Earthling</h1>
      <p>
        Welcome to your Create-React-App / TailwindCSS / Styled Components
        template
      </p>
      <h2>Resources / Documentation</h2>
      <ul>
        <li>
          <a href="https://reactjs.org/docs/create-a-new-react-app.html">
            ReactJS
          </a>
        </li>
        <li>
          <a href="https://tailwindcss.com/">TailwindCSS</a>
        </li>
        <li>
          <a href="https://styled-components.com/">Styled Components</a>
        </li>
      </ul>
    </AppStyles>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

将“tw”宏添加到 AppStyles.styles.tw.js

砰!目前为止一切运行良好。干得好!现在,让我们添加额外的魔法,扩展使用 Styled Components 隔离的 Tailwind 的强大功能。我们将添加tw变量并tailwind.macro从 NPM 导入库。

AppStyles.styles.tw.js使用下面写的新代码更新您的文件。

// ./src/AppStyles.styles.tw.js

import styled from "styled-components";
import tw from "tailwind.macro";

const AppStyles = styled.div.attrs({
  className: "w-full h-screen flex flex-col items-center justify-center"
})`
  & {
    h1 {
      ${tw`font-sans text-6xl font-hairline text-6xl text-teal-500`}
    }
    p {
      ${tw`text-gray-700 text-lg`}
    }
    h2 {
      ${tw`text-2xl font-hairline mt-5 text-teal-500`}
    }
    ul {
      ${tw`inline-flex`}
    }
    li {
      ${tw`mr-5`}
    }
    a {
      ${tw`text-blue-500 hover:text-gray-500 hover:underline`}
    }
  }
`;
export default AppStyles;
Enter fullscreen mode Exit fullscreen mode

回顾一下我们刚刚添加的内容,此设置现在允许您像使用 Sass 一样嵌套 Tailwind 类。您可以使用类选择器、ID 和 HTML 标签来遍历整个组件模板。它将遵循父容器、每个子容器和/或兄弟容器中的所有项目。非常棒,对吧?

如果您的应用程序当前在后台运行,则需要重新启动它,以便所有配置文件都可以使用 Create React App 进行编译。

完成所有步骤后,您的文件树应如下所示。

您的root目录:

./styled-tailwind
├── .gitignore
├── README.md
├── babel-plugin-macros.config.js
├── node_modules
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── src
└── yarn.lock
Enter fullscreen mode Exit fullscreen mode

您的.src文件夹

./src
├── App.jsx
├── App.test.js
├── AppStyles.styles.tw.js
├── index.css
├── index.js
├── serviceWorker.js
├── setupTests.js
├── tailwind.config.js
└── tailwind.css
Enter fullscreen mode Exit fullscreen mode

干得好,最后的想法

以上是大量的设置准备工作。目前,您的设计工作流程有很多选项可供选择。您不仅限于使用 Tailwind CSS 类。在反引号之间,您还可以编写如下所示的普通 CSS。它提供了大量的设计可能性,并且是使用 Tailwind 样式对象尝试复杂动画的绝佳机会。



const AppStyles = styled.div.attrs({
    className: "w-full h-screen flex flex-col items-center justify-center"
})`
    & {
      h1 {
        ${tw`font-sans text-6xl font-hairline text-6xl text-teal-500`}
        transform: scale(1);
        transition: all 0.3s ease-in-out;
     }
      h1:hover {
      transform: scale(2);
    }
}
`;


Enter fullscreen mode Exit fullscreen mode

Create-React-App 模板。

您无需再重复这些步骤。我已经创建了一个可用于 Create React App 的模板。本文中安装的所有内容都将预先安装,为您的下一个创意火花做好准备。

npx create-react-app my-new-app --template styled-tailwind

cd my-new-app

npm run start

瞧!地球人,你好!

文章来源:https://dev.to/dbshanks/an-efficient-react-tailwindcss-styled-components-workflow-458m
PREV
从 15,000 个数据库连接减少到 100 个以下:DigitalOcean 的技术债务故事
NEXT
Azure Static Web Apps are Awesome We need to talk about serverless What exactly are Azure Static Web Apps? Creating your first Static Web App What did that do? Is this just web hosting? What makes this so special? Adding an API I love it, but can I run it locally? Adding some useful scripts Oh No! Build Failure! “But David! You’re the TDD guy right? How do you test this!” You mentioned TypeScript? But let’s go wild, how about C# ! I Think This is Really Awesome