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

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

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

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]删除
最新教程 更多>
  • IntTo Float64 JSON转换之谜
    IntTo Float64 JSON转换之谜
    使用 JSON 听起来简单明了,你有一些结构,你可以将其更改为 JSON - 一种通用的统一语言并返回到你的结构。简单吧? ? 嗯,是的,但是直到您遇到 Marshal / Unmarshal 函数的一些奇怪行为。 问题 ? 这一切都是从我尝试从 JWT 令牌读取编码的有效负载时开始...
    编程 发布于2024-11-02
  • 如何从 Ubuntu 12.04 中彻底删除 MySQL 5.7?
    如何从 Ubuntu 12.04 中彻底删除 MySQL 5.7?
    删除 MySQL 5.7:清除和卸载综合指南要从 Ubuntu 12.04 系统中完全删除 MySQL 5.7,请按照以下综合步骤操作:备份数据库在继续卸载之前,请确保您已使用 mysqldump 实用程序备份了基本数据库。仅备份所需的数据库,因为完整数据库备份可能是卸载问题的根本原因。停止 MyS...
    编程 发布于2024-11-02
  • 如何在没有 CLI 访问的情况下清除共享托管服务器上的 Laravel 5 缓存?
    如何在没有 CLI 访问的情况下清除共享托管服务器上的 Laravel 5 缓存?
    在 Laravel 5 中清除共享托管服务器上的缓存在 Laravel 5 中,您可以使用 cache:clear Artisan 命令有效地清除缓存。但是,在共享托管服务器上工作时,您可能无权访问 CLI。这就提出了一个问题:我可以在缺乏控制面板访问权限的共享托管服务器上不使用 CLI 来清除缓存...
    编程 发布于2024-11-02
  • Websocket 或 Socket io!让我们来看看吧!
    Websocket 或 Socket io!让我们来看看吧!
    WebSockets 与 Socket.IO:实时对决 当谈到网络上的实时通信时,开发人员经常发现自己陷入两个选择之间:WebSockets 和 Socket.IO。这两种工具都擅长它们的工作——提供了一种在客户端和服务器之间实现双向通信的方法——但每种工具都有自己独特的个性。这有...
    编程 发布于2024-11-02
  • Deno 起飞
    Deno 起飞
    网络是人类最大的软件平台,拥有超过 50 亿用户,并且还在不断增长。然而,随着 Web 开发需求的飙升,其复杂性也随之增加。在无尽的配置文件、大量的样板文件和大量的依赖项之间,开发人员花费更多的时间来进行设置,而不是构建下一个大东西。? 进入 Deno,这是一种用于 JavaScript 和 Typ...
    编程 发布于2024-11-02
  • 使用 Django Rest Framework 寻找海森堡
    使用 Django Rest Framework 寻找海森堡
    The idea The idea was to create a simple platform for DEA agents, to manage information about characters from the Breaking Bad/Better Call Sa...
    编程 发布于2024-11-02
  • 汤姆和杰瑞灯代码
    汤姆和杰瑞灯代码
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ...
    编程 发布于2024-11-02
  • 通过实践学习 TDD:在 Umbraco 的富文本编辑器中标记成员
    通过实践学习 TDD:在 Umbraco 的富文本编辑器中标记成员
    在我正在构建的系统中,我需要能够在网站的文本中提及 Umbraco 成员。为此,我需要构建 Umbraco 富文本编辑器的扩展:TinyMCE。 语境 作为内容编辑者,我想在消息或文章中标记成员,以便他们收到有关其新内容的通知。 我研究了类似的实现,例如 Slack 或 X 上的实现...
    编程 发布于2024-11-02
  • 如何在Python测试场景中模拟HTTP请求和响应?
    如何在Python测试场景中模拟HTTP请求和响应?
    Python 测试的模拟请求和响应在 Python 测试中,有必要模拟模块及其功能来控制执行流程并验证具体场景。其中,模拟 requests 模块通常用于测试依赖于 HTTP 请求的函数或方法。考虑一个包含以下代码的views.py 文件:def myview(request): res1 ...
    编程 发布于2024-11-02
  • 如何构建适用于 Windows、Linux 和 macOS 的 Python 条码扫描器
    如何构建适用于 Windows、Linux 和 macOS 的 Python 条码扫描器
    条形码扫描已成为从零售、物流到医疗保健等各个行业的重要工具。在桌面平台上,它可以快速捕获和处理信息,无需手动输入数据,从而节省时间并减少错误。在本教程中,我们将通过构建适用于 Windows、Linux 的 Python 条形码扫描仪 继续探索 Dynamsoft Capture Vision SD...
    编程 发布于2024-11-02
  • ## 如何在 Python 中创建不可变对象以及为什么 nametuple 是最好的方法?
    ## 如何在 Python 中创建不可变对象以及为什么 nametuple 是最好的方法?
    Python 中的不可变对象在 Python 中,不变性为保护数据完整性提供了一种有价值的机制。然而,创建不可变对象会带来一定的挑战。重写 setattr常见的方法是重写 setattr方法。然而,即使在 init 过程中也会调用此方法,因此它不适合创建不可变对象。子类化 Tuple另一种策略涉及对...
    编程 发布于2024-11-02
  • 最常被问到的 React 面试问题
    最常被问到的 React 面试问题
    如何优化 React 应用程序的性能? 1。组件应谨慎更新 实现 shouldComponentUpdate 或 React.memo 通过比较 props 或 states 来防止不必要的重新渲染。 2.使用功能组件和钩子 带钩子的功能组件通常比类组件性能更高。 3.延迟加载组件...
    编程 发布于2024-11-02
  • (Wordpress 初学者):仅将子域从托管转移(迁移)到另一个新托管。
    (Wordpress 初学者):仅将子域从托管转移(迁移)到另一个新托管。
    我只想从 Bluehost 托管转移(迁移)一个新托管(例如 Fastcomet 或 Chemicloud)的子域。 我想知道我迁移子域的步骤是否正确以及我应该做什么更改 DNS 内容...... ** 我的情况1:** – 主 Web 域(例如:forcleanworld.com)保留在 Blue...
    编程 发布于2024-11-02
  • 使用 Java 进行数据分析:信息处理初学者指南
    使用 Java 进行数据分析:信息处理初学者指南
    Java 是一种适用于数据分析的强大语言,它提供用于处理大型数据集和执行复杂分析的基础结构,包括:数据结构:用于存储和组织数据的集合,例如数组和列表。IO 流:用于读取和写入文件的对象。Java 集合框架:用于管理和操作数据结构的强大集合类库。使用 Java 进行数据分析的实际案例包括分析文本文件,...
    编程 发布于2024-11-02
  • 雇用自由 Python 开发人员时要避免的常见错误
    雇用自由 Python 开发人员时要避免的常见错误
    介绍 雇用合适的自由 Python 开发人员可以决定你的项目的成败。然而,许多企业在招聘过程中会犯一些常见的错误,这些错误可能会导致招聘延迟、成本超支和结果不佳。以下是如何避免这些陷阱并确保项目成功的方法。 没有明确定义项目要求 最常见的错误之一是在开始招聘流程之前...
    编程 发布于2024-11-02

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

Copyright© 2022 湘ICP备2022001581号-3