”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > TailwindCSS 源代码中的 DefaultMap 类。

TailwindCSS 源代码中的 DefaultMap 类。

发布于2024-11-08
浏览:784

本文我们分析Tailwind CSS源代码中的DefaultMap类。这是一个可以为不存在的键生成默认值的映射。生成的默认值被添加到映射中以避免重新计算。

/**
 * A Map that can generate default values for keys that don't exist.
 * Generated default values are added to the map to avoid recomputation.
 */
export class DefaultMap extends Map {
  constructor(private factory: (key: T, self: DefaultMap) => V) {
    super()
  }

  get(key: T): V {
    let value = super.get(key)

    if (value === undefined) {
      value = this.factory(key, this)
      this.set(key, value)
    }

    return value
  }
}

在 JavaScript 中,我们有 Map API,但没有 DefaultMap。这个 DefaultMap 是一个自定义类,它扩展了 Tailwind CSS 源代码中的 Map。

让我们来理解这段代码。

constructor(private factory: (key: T, self: DefaultMap) => V) {
    super()
}

DefaultMap 是一个具有需要工厂函数的构造函数的类。 super() 调用父类的构造函数,在本例中,这是 Map API,工厂函数的第二个参数是 self: DefaultMap 这意味着它可以访问 Map 实例。

DefaultMap是如何初始化的?

让我们找一个初始化 DefaultMap 的例子。 design-system.ts 演示了 DefaultMap 的用法。

DefaultMap class in TailwindCSS source code.

let parsedVariants = new DefaultMap(
                        (variant) => parseVariant(variant, designSystem)
                     );

这里 (variant) => parseVariant(variant, designSystem) 成为我们的工厂方法,如果键不存在,它会添加默认值。

return {
      kind: 'arbitrary',
      selector,
      compounds: true,
      relative,
  }

这是parseVariant函数返回的值。

关于我们:

在 Think Throo,我们的使命是教授开源项目中使用的高级代码库架构概念。

通过在 Next.js/React 中练习高级架构概念,提高您的编码技能,学习最佳实践并构建生产级项目。

我们是开源的 — https://github.com/thinkthroo/thinkthroo (请给我们一颗星!)

我们还提供网络开发和技术写作服务。请通过 [email protected] 联系我们了解更多信息!

参考:

  1. https://github.com/tailwindlabs/tailwindcss/blob/next/packages/tailwindcss/src/utils/default-map.ts#L5

  2. https://github.com/tailwindlabs/tailwindcss/blob/c01b8254e822d4f328674357347ca0532f1283a0/packages/tailwindcss/src/design-system.ts#L40

  3. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

  4. https://github.com/tailwindlabs/tailwindcss/blob/c01b8254e822d4f328674357347ca0532f1283a0/packages/tailwindcss/src/candidate.ts#L511-L516



版本声明 本文转载于:https://dev.to/thinkthroo/defaultmap-class-in-tailwindcss-source-code-2ohl?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-15
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-15
  • JavaScript 中变量赋值左侧的方括号有什么作用?
    JavaScript 中变量赋值左侧的方括号有什么作用?
    解构赋值:揭示变量赋值左侧方括号的含义在 JavaScript 中,在变量赋值左侧遇到方括号变量赋值的左侧可能看起来令人困惑。为了破译这种语法的含义,我们冒险进入解构赋值的领域。语法和操作解构赋值,这是 JavaScript 1.7 和 ECMAScript 6 中引入的功能,使我们能够将数组或对象...
    编程 发布于2024-11-15
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-15
  • 对 MySQL 结果进行分组:SQL 与 PHP - 哪种方法最好?
    对 MySQL 结果进行分组:SQL 与 PHP - 哪种方法最好?
    MySQL 按字段数据对结果进行分组:SQL 与 PHP 方法在数据管理领域,可能会出现需要按字段数据对数据库结果进行分组的情况,并且以特定格式显示它们。请考虑以下示例:示例 1:根据组 ID 组织名称列表:示例 2:根据公共组 ID 配对相应的标题和系数值:为了解决这些挑战,出现了两种主要方法:S...
    编程 发布于2024-11-15
  • 如何推迟加载大型 CSS 文件以提高页面性能?
    如何推迟加载大型 CSS 文件以提高页面性能?
    优化CSS交付:了解延迟CSS加载优化CSS交付时,在页面加载后延迟加载大型CSS文件可以显着提高页面性能。虽然 Google 开发人员提供的示例演示了内联小型 CSS 文件以实现关键样式,但它留下了如何推迟较大 CSS 文件的问题。加载后访问原始 CSS 文件要将大型 CSS 文件的加载推迟到页面...
    编程 发布于2024-11-15
  • Javascript 基元实际上是对象吗?
    Javascript 基元实际上是对象吗?
    Javascript 基元与对象:澄清概念尽管普遍认为“Javascript 中几乎所有内容都是对象”,但并非所有内容语言中的实体遵循这个定义。基元和对象之间的区别需要澄清。基元与对象相反,基元是以其基本形式存在的不可变值。它们缺少方法和属性,并包括以下数据类型:StringsNumbersBool...
    编程 发布于2024-11-15
  • 为什么 C++ 中的联合内禁止使用 `std::string` 对象?
    为什么 C++ 中的联合内禁止使用 `std::string` 对象?
    为什么 std::string 在联合中被禁止在 C 编程领域,联合是一种特殊的结构,它允许在联合中存储各种数据类型共享内存地址。然而,当涉及联合中的成员时,有一个有趣的限制:禁止具有非平凡构造函数的类,包括 std::string。非平凡构造函数的问题根本原因可以追溯到工会的性质。联合体中的成员从...
    编程 发布于2024-11-15
  • 我们能否在正则表达式中实现真正的可变长度向后查找?
    我们能否在正则表达式中实现真正的可变长度向后查找?
    正则表达式的可变长度回顾断言替代方案正则表达式中的可变长度回顾断言,用 (?带有正则表达式模块的 PythonPython 正则表达式模块提供对可变长度后向断言的支持。 import regex m = regex.search('(?<!foo.*)bar', 'f00bar') p...
    编程 发布于2024-11-15
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-15
  • 如何使用 Twitter Bootstrap 对齐表格中的文本?
    如何使用 Twitter Bootstrap 对齐表格中的文本?
    Twitter Bootstrap 中的表格文本对齐在 Twitter 的 Bootstrap 框架中,您可以使用指定的文本对齐类来对齐表格内的文本。 Bootstrap 3text-left:左对齐文本text-center:居中对齐文本text-right:右对齐文本Bootstrap 4tex...
    编程 发布于2024-11-15
  • 如何使 CSS 中的空表格单元格的边框可见?
    如何使 CSS 中的空表格单元格的边框可见?
    我可以在 CSS 中使空单元格的边框可见吗?在 Internet Explorer 7 中,默认情况下可能不会显示空单元格的边框。不过,有几种方法可以解决此问题。使用不间断空格如果可行,请插入不间断空格 ( )进入空单元格可以强制浏览器渲染带有边框的单元格。纯 CSS 解决方案对于纯 CS...
    编程 发布于2024-11-15
  • 如何将 Python 列表转换为 CSV 文件?
    如何将 Python 列表转换为 CSV 文件?
    将 Python 列表列表导出到 CSV 文件您的目标是将 Python 列表列表转换为 CSV 文件,确保每个子列表中都会保留不同类型(浮点型、整数型、字符串型)的数据。所需的 CSV 格式涉及使用逗号分隔每个子列表中的元素并垂直对齐子列表。要实现此目的,您可以利用 Python 的内置 csv ...
    编程 发布于2024-11-15
  • 测试限制:了解软件测试的边界
    测试限制:了解软件测试的边界
    软件测试是确保软件质量、稳定性和功能的开发过程的重要组成部分。然而,尽管测试很重要,但它也有其局限性。虽然它可以揭示缺陷,但它不能保证应用程序完全没有错误。了解这些限制有助于企业和开发人员设定切合实际的期望并优化他们的测试流程。在本文中,我们将探讨软件测试的主要局限性及其带来的挑战。 无法测试每个...
    编程 发布于2024-11-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3