Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v5 的开发计划 #717

Open
2 of 11 tasks
jaywcjlove opened this issue Mar 26, 2022 · 0 comments
Open
2 of 11 tasks

v5 的开发计划 #717

jaywcjlove opened this issue Mar 26, 2022 · 0 comments

Comments

@jaywcjlove
Copy link
Member

jaywcjlove commented Mar 26, 2022

自发布 v4 以来,积累了积累了一些问题和想法,希望在 v5 中处理好这些问题,是时候为未来的 v5 版本做一个计划了。这个计划没有明确开发时间,没有确定开发计划之前 v4 将会一直维护,在这里讨论一些 v5 开发的开发计划。

文档(英文文档)

很早有人提出英文文档需求 #75,我们仍然没有计划和实力提供英文文档(因为我们没有这个需求),但是,我们计划提供一个“架子”,供社区自己补充英文文档。

重新设计所有组件

老的版本也有设计,当初没有找到好的展现方式,设计文件丢失。新的 v5 将会使用 Sketch 设计,使用 Measure 将 Sketch 文件生成可预览的 HTML 文件,使用 Github 的 pages 功能进行展示,类似于 @uiw/icons 的图标设计展示。

  • 对已有的组件尺寸颜色进行规范。
  • 方便协同开发组件,提供在线设计预览。
  • 明暗主题设计。

升级图标组件

v4 之前使用了字符串命名图标 API,将所有 svg path 放到 json 文件中,通过字符串匹配,获得 svg 图标的 path 数据,生成图标。虽然体积做到了最小,但是全量引入 svg 的 path 数据,随着图标增加体积一样增大。所以我们对图标生成工具(svgtofont)进行升级,支持将每个图标生成一个单独组件,想使用哪个图标就引入哪个图标的 React 组件。这个特性 @uiw/icons 图标库已经支持了。

import { Adobe, Alipay } from '@uiw/icons';
import { Alipay } from '@uiw/icons/Alipay';

<Adobe style={{ fill: 'red' }} />
<Alipay height="36" />

在 v5 版本应该使用以下方法,处理组件库中的图标库使用:

- import { Icon } from 'uiw';
+ import { Alipay } from '@uiw/icons/Alipay';


- <Icon type="alipay" />

+ <Alipay style={{ fill: 'red' }} />
+ <Alipay height="36" />
  • 图标支持 web components ,升级 svgtofont 工具。

React 18

React 18 正式版已经发布,我们将所有不兼容的组件并一一修复。这在我们 v4.20+ 已经开始处理兼容问题,我们使用 React.StrictMode 严格模式组件,帮助我们处理:

  • 识别不安全的生命周期
  • 关于使用过时字符串 ref API 的警告
  • 关于使用废弃的 findDOMNode 方法的警告
  • 检测意外的副作用
  • 检测过时的 context API

React.StrictMode 严格模式组件下,我们处理在 React 17 上的警告,在未来将帮助我们在 v5 丝滑过渡升级 React 18

CSS IN JS

从 2017 年起,CSS 在 JS 中的流行度只增不减!工具众多,随着现代组件驱动的前端框架的出现,样式表驱动样式(无论是 .scss.less.css 还是其他样式语言)的主要改进是提高模块化、减少 I/O、简化类名/样式的重复数据删除,提高可读性,和或以其他方式简化 UI 开发。

为什么在我的 JS 中使用 CSS?

使用 CSSINJS 工具能更方便的利用工具支持周边生态,如 nextjs,虽然目前的方式也很好,我们通过 next-remove-imports 剔除包中引入的 css 文件,通过手动引入打包好的 CSS 文件,来解决这一问题,但是这将引发新的主题切换问题,样式打包引入顺序问题,服务端渲染,等一系列问题,现在想通过选型一个 CSSINJS 工具来解决这一系列问题。

  • 开放支持 CSS 变量切换主题(包括明暗主题),dark-mode 工具类似的支持。
  • 支持 className 样式名,用于冲样式(希望能继承现有的命名)。

Web Component

对部分没有任何依赖的组件,可能会重新封装成 Web Component,我们在 dark-mode 中进行尝试。对于一些没有第三方依赖的组件,独立出去使用单独的仓库进行维护,如 LayoutSplit 组件。

我们在部分组件开始使用 web component 慢慢替换,例如 react-github-corners,它支持 react 和 web component 两种方式使用,后面大部分组件都会支持这两种方式使用。对于组件库我们需要一些提升生产力的工具,例如 Lit或者更像 react 的 Stencil 使用它们封装 web components 组件变得更简单。

在选择工具的时候,我们需要满足几个目标:

  1. 拥有足够小的体积。
  2. 尽量不需要编译工具参与。
  3. 对生态有支持,如 ssr。
  4. 更加接近原生 web component 特点。

目前看到 tonic 恰好满足我们的需求,根据我们造轮子的能力, 三百来行代码完全没有压力。

经过一些尝试,还没有找到针对 web components 更为舒服的操作

  1. dark-mode 封装对明暗主题操作的,已经应用起来,存在变量声明冲突问题,如果你使用 <script type="module" /> 去加载这个组建,规避冲突问题,又引发了新的问题,切换到暗主题,刷页面页面会出现 先 主题到 主题的闪屏切换过程。
  2. markdown-style 封装了一个 markdown 样式的 web components 组件,试图利用 web components 特性,将 css 集成到组件中,不受样式冲突,避免全局样式污染,结果 markdown 的锚点定位页面位置功能又失效了。使用 web components 的插槽 <slot> 来解决这个问题,将样式生成到 <head> 中,😮‍💨 这样,就这样吧,感觉白折腾了了一通儿,还不如直接引入 css 更加直观。
  3. github-corners 继续尝试,寻求支持 react/web components 两个同时支持的方案,对 style 属性的操作同样存在冲突的问题。

在原生 web components 封装进行尝试,仍然没有找到非常舒服,没有烦恼的操作,后面有机会针对 tonicLit 等工具的尝试。

vs Ant Design

在很早 2017年 就有人提出了这个问题 #5,但是好像忘记了回答。

最早我们使用 antd 开发我们的中台系统,部分组件我们自己基于 react 16 封装,我们不想改自己的组件,降级支持 react 15,我们采取的方案是将报错的组件重新封装(我们使用得不复杂),在 antd 支持 react 16 之际,我们再切换回去。

在一点一点的积累过程中发现回不去了,我们新增了 antd 没有的组件和 api,还有一些想法。现在你们应该能看出一些区别吧。

uiw 只是 react 众多生态其中之一的组件库,如果你有不喜欢 uiw 的某些组件,你可以单独安装某一个组件使用,如果你看者它就烦,这里awesome-uikit搜集了很多 ui 组件库供你们选择。

重新造一个轮子?

我们一开始就不是为了重新造一个轮子,是为了解决一些项目中的问题,实践和实现一些想法,例如:我们不想安装所有 antd 组件,只想使用其中一个组件,我们想更改某个组件的需求等等。所以,uiw 不光是我们自己的组件库,同时它也是实践我们自己想法的一个项目。 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant