”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 我的 Flexilla 构建之旅:无头交互式组件库

我的 Flexilla 构建之旅:无头交互式组件库

发布于2024-11-02
浏览:531

My Journey to Building Flexilla: Headless interactive component library

创建我的第一个 JavaScript 库的旅程是变革性的,帮助我成长。我是怎么到这里的?让我们从头开始吧。

完成 UnifyUI Blocks 和 Flexiwind Blocks 的测试版后,我和我的朋友面临着一个挑战:添加下拉菜单、折叠和选项卡等交互式组件。

由于 UnifyUI 和 Flexiwind 不同:一个使用 UnoCSS,另一个使用 TailwindCSS,我们最初为两者编写单独的脚本。但很快我们就发现这不是一个理想的解决方案。

在研究了 Preline 如何处理与为 TailwindCSS 定制的专用 JavaScript 插件的交互后,我们发现需要一个与 CSS 框架无关的解决方案。

为什么 CSS 框架无关?

创建一个与 CSS 框架无关的库对我们来说至关重要,因为我们希望 Flexilla 能够与任何 CSS 框架甚至与纯 CSS无缝协作。许多开发人员,包括使用 UnoCSSTailwindCSS 甚至 Bootstrap 的开发人员,应该能够灵活地不受限制地增强其组件。

通过使 Flexilla 独立于特定框架,我们可以提供适用于许多不同类型项目的多功能工具。它还与我们在 UnifyUI 和 Flexiwind Blocks 上所做的工作保持一致,其中灵活性是关键。

解决方案

受到 Preline 和 Flowbite 插件的启发,我们决定创建完全开源的 Flexilla。

Flexilla 是一个独立的库,旨在独立管理交互,而不依赖于任何特定的 CSS 框架。它提供了与 TailwindCSS、UnoCSS 或任何其他 CSS 技术顺利集成的灵活性。

我们的目标是以不限于特定 CSS 环境的方式增强组件。

挑战

起初,我不知道从哪里开始。我应该克隆 Preline 并对其进行调整吗?不,那对我没有帮助,因为我的目标是通过这个项目学习

代码组织

一开始,我的代码一团糟:不可读且难以理解。

我有一个“packages”文件夹,这是一场灾难!这使得单独发布某些包变得困难,所以我需要一个解决方案。

解决方案

我发现了一篇关于勒纳的文章,立即引起了我的兴趣。经过几天的阅读文档和重组代码后,我拥有了一个令我自豪的组织。 Lerna 允许我简化更新、管理单一存储库中的多个包并独立发布它们。

波普尔JS?

是的,我面临这样的困境:我是否应该使用 PopperJS?

这是一个巨大的挑战,但我会将这个故事留到以后的文章中。

版本控制

这是一个主要的绊脚石。我最初以 1.0.0 版本发布了该库及其所有包……发布后,我意识到某些包存在问题。因此,对于每次修复,我都会发布该库及其软件包的新版本。坏主意!最终,一位朋友建议我阅读一篇关于 SEMVER 的文章,突然间,版本控制变得有意义了——尽管我有点晚了。

这就是我最终得到版本 2.x.x 的库的原因。从那时起,我就不再犯这些错误了。有了Lerna,我不再需要担心更改尚未更新的软件包版本; Lerna 帮我处理这件事。

特征

1. CSS框架不可知论

Flexilla 不依赖于任何特定的 CSS 框架,使其与 TailwindCSSUnoCSS 甚至 plain CSS 兼容。这种灵活性确保您可以将其与您的项目集成,无论您使用什么 CSS 框架。

2. 模块化组件

Flexilla 提供模块化组件,例如下拉菜单、选项卡和折叠。这些组件是轻量级的,易于根据需要添加,因此您只需添加要使用的组件,这有助于性能捆绑包大小

3. 简单API

该库具有易于使用的 API,只需最少的配置。这是如何设置下拉组件的简单示例:

   import { Dropdown } from '@flexilla/flexilla';
   Dropdown.init("#myDropdown");

此示例展示了如何仅用几行代码即可快速初始化下拉列表,从而使各个级别的开发人员都可以轻松访问它。

4. 无头架构

受无头 UI 库的启发,Flexilla 允许您完全控制样式,因此您不受预定义设计或主题的限制。这使得它可以轻松集成到自定义样式的项目并确保它不会与现有样式冲突。

5. 自定义事件

Flexilla 组件附带可自定义事件。例如,您可以添加操作来响应用户操作或自定义特定交互的行为,例如打开下拉列表或选项卡更改时。

const myDropdown = new Dropdown('#myDropdown', {
  onShow: () => console.log('Dropdown is shown!'),
  onHide: () => console.log('Dropdown is hidden!'),
});

const myAccordionEl = document.querySelector("#myAccordion")
const myAccordion = Accordion.init(myAccordionEl)
myAccordionEl.addEventListener("change-item",()=>{
   console.log("Accordion item changed")
})

何时何地使用图书馆?

当您处理的项目不想使用 JavaScript 框架但需要考虑到可访问性的交互式组件时,请使用 Flexilla。 (推荐:AstroJS、PHP 和 PHP 框架、静态网站)
它可以与 VueJS 很好地配合,但不推荐。使用 ReactJS,甚至不要尝试!

Flexilla 的下一步是什么?

Flexilla 将继续发展。我计划添加更多组件,改进现有组件,并完善文档。除了现有的组件之外,我还计划引入其他常见组件,例如通知和 toast。这将使 Flexilla 能够支持更广泛的交互需求。

结论

根据我的需求,Flexilla 已被证明是在我的项目中创建交互式组件的宝贵工具。
开始可能会很可怕。我担心没有人会欣赏我的工作,担心它没有任何作用。但我向你保证,不去尝试是最大的错误。今天,我对创建这个图书馆并不后悔。它让我学到了很多东西:代码组织、版本控制、管理 npm 包……毫不犹豫地与世界分享您的解决方案,并乐于接受反馈,无论是积极的还是消极的。它会帮助你成长!

如果您有想法、建议或代码改进,请立即分叉存储库、提交拉取请求或提出问题。我们可以共同增强库并为世界各地的开发人员创造宝贵的资源。

请注意,别忘了查看 Flexilla 并让我知道您的想法!

版本声明 本文转载于:https://dev.to/unifyui-dev/my-journey-to-building-flexilla-headless-interactive-component-library-5ceg?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-05-03
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-05-03
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-05-03
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-05-03
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-05-03
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-05-03
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-05-03
  • 在共享主机上如何禁用魔术引号?无需php.ini权限
    在共享主机上如何禁用魔术引号?无需php.ini权限
    在共享主机上禁用魔术引号在共享主机上关闭魔法引号可能很棘手,尤其是当您无法访问php.ini时,尤其是使用php.ini。 php_flag magic_quotes_gpc关闭到.htaccess文件可能并不总是可行。该指令通常用于MOD_PHP环境,但是共享的托管提供商通常会使用SUEXEC/F...
    编程 发布于2025-05-03
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-05-03
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-05-03
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-05-03
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-05-03
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-05-03
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-05-03
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-05-03

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

Copyright© 2022 湘ICP备2022001581号-3