我错误地使用了 Tailwind,所以你不必这样做

三年前,我开始使用tailwind css,一个出色的前端开发库(本文不再赘述其优点,网上资源丰富)。我想分享一下我早期使用tailwind时不断犯的错误,希望能帮助大家避免重蹈覆辙。

Tailwind颠覆了传统CSS的级联样式表概念,通过“实用程序类”将CSS规则直接应用于DOM元素。起初感觉陌生,但很快便上手了。我仅用一天时间就适应了它,现在除非不得已,否则不会再写纯CSS了。Tailwind与我的首选框架Nuxt集成无缝,构建美观、响应式网站非常便捷。

然而,问题出现了:选项越多,包含的样式越多,HTML代码就越混乱。另一个问题是代码冗余。作为一名DRY原则的忠实拥护者,看到模板中重复的类序列让我非常难受。

我尝试优化它。

最初的想法是将Tailwind类序列提取为字符串变量。在Vue.js(Nuxt基于Vue)中,大致如下:

  
const tailwindBtn = "m-2 p-2 rounded border border-2 border-yellow-500 bg-blue-500 text-black text-lg font-bold";

虽然维护和修改更容易了,但代码可读性却值得商榷,尤其是在应用中有多个相同元素,需要将定义提升到全局常量时。

我继续寻找更好的解决方案,这时我发现了Tailwind的@apply指令。这似乎与之前的做法背道而驰:你可以创建自己的“类样式表”,用自定义类和元素填充它,而不是直接将定义放在具体元素上。不同的是,你可以用Tailwind实用程序类构建解决方案,而不是简单的CSS规则。

虽然Vue School的导师和Tailwind文档都警告我不要使用@apply,但我还是尝试了。

我错误地使用了 Tailwind,所以你不必这样做

我用这种方法创建了几个网站,它确实有效。问题解决了,或者说…暂时解决了?

到了2024年末,我为一个网站添加新功能时,完全忘记了一年前用@apply做的“恶作剧”。突然,我发现无法组合布局。

模板中没有明显的样式,但

元素却渲染错误。我打开浏览器开发者工具检查渲染的HTML,发现它们应用了CSS样式。

我错误地使用了 Tailwind,所以你不必这样做

经过一番排查,我找到了罪魁祸首:

div {  @apply m-auto text-center text-white;}

tailwind.css文件中,这在2023年看起来或许是个好主意,但现在却成了问题。

谁会想到我有一天需要其他样式呢?

教训一:永远不要在元素选择器上全局使用@apply

虽然在创建新项目时它看起来很方便,但从长远来看,它会带来麻烦。不仅容易忘记,它还会降低代码灵活性。将来,你可能会想移除它,但一旦删除全局样式,依赖它的网站功能就会崩溃。

我个人建议根本不要在tailwind.css中使用@apply(如果我有时间和精力的话,会从所有项目中移除它)。

如果你仍然坚持使用它(正如Tailwind文档所说,例如“覆盖第三方库中的样式”),至少创建

使用.my-cool-css-class是可以接受的,因为你必须将其附加到要设置样式的元素上。这样,每个人(包括未来的你)都能看到它,并在需要时找到它的定义。

但是…

锚元素是打破这条规则的诱人例外,因为为每个元素添加类属性很繁琐。

一种替代方案是创建一个围绕锚点(或Nuxt中的)的自定义链接组件,但这可能不是你想要的。

事实上,使用@apply指令仍然是解决这个问题最常见的方案。

如果你100%确定需要全局元素样式,可以使用@apply,但这应该始终是有充分理由的决定。

教训二:Tailwind类定义过长/重复的根本原因是代码设计不当。

使用Vue等现代JavaScript框架,可以创建小型可重用组件,并将其组合构建复杂的解决方案。

上面的按钮示例可以改写成:

  import { defineProps, computed } from 'vue';export default {  name: 'MyButton',  props: {    caption: {      type: String,      required: true    }  },  setup(props) {    const btnClass = computed(() => 'm-2 p-2 rounded border border-2 border-yellow-500 bg-blue-500 text-black text-lg font-bold');    return { btnClass };  }};

这样,重复的代码就消失了。

看到很长的类链,总是让我觉得元素承担了过多的职责。最好的方法是退一步,重新思考导致这个问题的代码设计。

我的经验是,只需少量Tailwind类即可创建美观的设计。如果需要更多样式,通常不应该全部堆积在一个元素上。这与创建一个大型组件(或类)来做所有事情类似,最终需要停止添加更多行并开始分解事物。

在最坏的情况下,应该能够将视觉要求高的CSS元素封装到单独的组件中,以最大限度地减少所需的交互量。或者,可以使用现成的Tailwind组件库。

以上就是我错误地使用了 Tailwind,所以你不必这样做的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1500298.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 22:31:01
下一篇 2025年12月19日 22:31:09

相关推荐

  • 从优秀到卓越:掌握前端开发

    成为顶尖前端工程师,并非仅仅停留在HTML、CSS和JavaScript的编写层面。真正的卓越,需要掌握一系列关键技术、核心概念和最佳实践。本文将带您深入探索每个优秀前端开发者都应精通的领域,助您在职业道路上更上一层楼。 网络基础知识 缓存机制 缓存是提升网页加载速度和减轻服务器压力的关键技术。你需…

    2025年12月19日
    000
  • 如何在NestJS中轻松发送电子邮件?

    高效发送电子邮件:使用@nestixis/nestjs-mailer简化流程 在许多应用中,发送电子邮件至关重要,无论是用户通知、事务更新还是营销活动。然而,传统的电子邮件解决方案往往复杂且繁琐,需要整合邮件程序、模板语言,并处理各种依赖关系。 解决方案: @nestixis/nestjs-mail…

    好文分享 2025年12月19日
    000
  • 以 semver ‘0’ 开头

    您正准备发布一个新软件包,犹豫是否应该从版本 0.x 开始。本文将探讨为何直接从 v1.0.0 开始可能更合理。 许多开发者倾向于从 v0.x 开始,理由是:不确定性、时间压力以及对 SemVer 的理解不足。然而,SemVer 中的 0.x 版本代表着不稳定性,但这并不意味着库会频繁发生破坏性更改…

    2025年12月19日
    000
  • 通过技术 SEO 最佳实践增强 SaaS 产品开发

    确保您的SaaS平台易于目标用户发现和访问至关重要。技术SEO(搜索引擎优化)在此发挥着关键作用。将技术SEO最佳实践融入SaaS产品开发,能够显著提升平台的搜索可见性、用户体验和整体性能。 了解SaaS中的技术SEO 技术SEO专注于优化网站的技术层面,确保搜索引擎能够有效抓取和索引您的网站。对S…

    2025年12月19日
    000
  • 使用此命令在您的 Vite 项目中设置 Tailwind

    只需一个命令,即可轻松在您的 Vite 项目中配置 Tailwind CSS!通常,配置 Tailwind 需要安装、生成配置文件并添加模板等多个步骤。但现在,您可以使用 lazywind npm 包简化这个过程。 安装和使用: 全局安装 lazywind: 使用 npm install -g la…

    2025年12月19日
    000
  • 5 种最适合 Web 开发的编程语言

    2025 年 Web 开发编程语言全方位指南 在瞬息万变的 Web 开发领域,选择合适的编程语言对项目成败至关重要。本文将深入探讨 2025 年主导 Web 开发领域的顶级编程语言,为开发者和企业选择最优语言提供全面指导。 2025 年 Web 开发趋势预测 2025 年的 Web 开发充满机遇与挑…

    2025年12月19日
    000
  • Google Project IDX、Material UI 的新 React 组件库等等

    JavaScript 开发者们,大家好! 本周的JavaScript 新闻速递来啦! 即使假期来临,JavaScript的世界依旧精彩纷呈。无论您是专注性能优化、深入研究现代框架,还是探索新型数据库,我们都为您准备了重磅更新、实用工具和版本升级,助您提升开发效率。 Google Project ID…

    2025年12月19日
    000
  • JavaScript 中的语句 VS 表达式

    JavaScript 中的语句和表达式:深入理解核心差异 在 JavaScript 开发中,”语句”和”表达式”这两个术语经常出现,初学者往往容易混淆。虽然它们看起来相似,但理解其根本区别对于编写高效、正确的代码至关重要。本文将通过示例详细解释 Jav…

    2025年12月19日
    000
  • 轨道:太阳系之旅

    去年十月,Masons团队参与了2024年NASA Space Apps Cairo黑客马拉松,并开发了一个令人振奋的项目——Orbit。Orbit是一个交互式3D网页应用,能够模拟太阳系并追踪近地天体(NEO)。它基于Next.js、Three.js和Golang后端构建,旨在提供宇宙的实时信息,…

    2025年12月19日
    000
  • 适合初学者的简单 HTML、CSS 和 JavaScript 项目

    十一款HTML、CSS和JavaScript入门级项目推荐 以下列举的11个项目,非常适合HTML、CSS和JavaScript初学者练习和学习: 趣味问答应用: 使用HTML、CSS和JavaScript构建的在线问答游戏。项目链接:https://www.php.cn/link/1a9e8442…

    2025年12月19日
    000
  • React 与 React 性能改进和迁移指南

    React 19 正式发布,为这个流行的 JavaScript 库带来了显著的性能提升和新特性。本文将深入探讨 React 19 与 React 18 的主要性能差异,分析迁移的必要性,并重点讲解一些重要变更。 React 19 的性能改进 1. React 编译器 React 19 引入了一个实验…

    2025年12月19日
    000
  • 课程计划:使用 JavaScript 和 Nodejs 进行人工智能驱动的电子商务开发 [草案]

    [课程计划草案,最终课程内容可能会有调整] 课程概述 本课程旨在帮助学员掌握构建人工智能增强型电商平台的实用技能,重点涵盖基于图像的产品搜索、AI客服支持、知识检索、智能推荐以及多语言功能。 课程采用模块化教学,九个模块结合理论讲解和实践项目,最终完成一个完整的电商平台项目。 课程大纲 立即学习“J…

    2025年12月19日
    000
  • JavaScript 中“new”关键字的作用是什么?

    让我们深入探讨JavaScript中的new关键字。它使构造函数能够创建新的对象实例,但这背后究竟发生了什么? 首先,new运算符创建一个空对象。想象一下,一个等待填充属性和方法的空白画布。 其次,这个空对象与构造函数的原型对象关联。这就好比建立了一个继承关系,新对象知道了它的“祖先”。 obj._…

    2025年12月19日
    000
  • 主 API 集成:使用 DummyJSON 和 JSONPlaceholder 获取和显示用户

    构建交互式用户数据查看器:DummyJSON 和 JSONPlaceholder API 实战 本文将指导您创建一个专业、交互式的用户数据查看器,利用 DummyJSON 和 JSONPlaceholder API 动态获取并显示用户数据。我们将使用 HTML、CSS、JavaScript、动画和关…

    2025年12月19日
    000
  • 了解 JavaScript 不变性和引用类型

    JavaScript 中的不变性和引用类型行为是基础概念,但容易被误解。不变性确保数据稳定性,而理解引用类型对于避免意外副作用至关重要。本文深入探讨这些概念,并提供高级示例和实用函数,帮助您高效利用它们。 JavaScript 中的不变性 不变性指对象创建后其状态不可更改。在 JavaScript …

    2025年12月19日
    000
  • 前端挑战

    冬至主题前端挑战赛作品:焕彩标记 本次前端挑战赛,我打造了一个以冬至为主题的交互式登陆页面,力求在展现冬至天文和文化意义的同时,提供流畅、引人入胜的用户体验。 页面功能亮点: 自适应设计: 采用可折叠导航栏,完美适配各种屏幕尺寸。明暗模式切换: 一键切换明暗模式,提升用户体验和可访问性。标题波浪动画…

    2025年12月19日
    000
  • 简单的 Nodejs 插件支持同步、回调、承诺和断言

    安装 npm install node-plug 使用示例: plugin.js export const pluginsync = { run() { console.log(‘plugin sync dijalankan!’) },}export const plugincallback = {…

    2025年12月19日
    000
  • 将人工智能和编程融入早期 STEM 教育

    在蓬勃发展的STEM领域,及早培养人工智能和编程技能至关重要。本文将分享一些实践项目,帮助教师有效地向学生传授这些关键概念。 面对日益激烈的STEM就业竞争,尤其在人工智能时代,尽早接触这些技术能让学生掌握解决问题、创新和批判性思维等核心技能,为未来做好准备。 无论学生未来是否从事计算机科学相关工作…

    2025年12月19日
    000
  • 发现最新的 React 生态系统趋势和创新 5

    React,这个构建动态用户界面的领先JavaScript库,持续引领着Web开发的变革。2025年,React生态系统涌现出诸多突破性功能和新兴工具,显著提升开发效率、流畅度和可扩展性。 本文将深入探讨最新更新,剖析React 19的核心特性,并分析塑造生态系统的最新趋势。无论您是资深开发者还是初…

    2025年12月19日
    000
  • 了解 JavaScript 异步编程:回调、Promise 和 Async/Await

    JavaScript 的异步特性对于构建响应迅速、高效且用户友好的应用至关重要。熟练掌握异步编程的核心概念(例如回调函数、Promise 和 Async/Await)是开发成功的关键。本文将深入探讨这些概念,分析它们的应用场景、优势和不足。 同步与异步编程 同步编程: 同步编程中,任务按照顺序依次执…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信