关于我给dumi2.0提pr的完整记录

news2025/10/27 17:33:55

前言

博主最近一年时间在工作业余都在写开源组件库 concis ,其中文档站点生成框架采取了 dumi,前几天不久dumi2.0正式发布,博主也是顺势而为直接把项目升级(dumi1 -> dumi2

由于dumi2 的站点设计比原来好看太多了,这是最吸引我的一点,附图:

在这里插入图片描述

不过在升级过程中还是踩了不少坑的,如果你也在使用 dumi ,具体版本迁移事项请看这里:

dumi1 -> dumi2迁移指南

concis因为自定义了很多站点样式,因此为了不进行破坏性的升级,直接是通过链接中"拷贝源代码"的方式去迁移的,原concis的主页如图:

在这里插入图片描述

发现pr点

由于dumi2 最大引流点———在ant design5生产新文档中投入使用,因此在升级中也是对照了ant design的文档和源码去配置,经过一天时间,采用dumi2的文档也是勉强可以看了~

在这里插入图片描述

这里也是发现了几个可以改善的点:

  1. 右上角dumi2新增的RTL按钮在同时配置多语言按钮时样式显示不协调;
  2. 右侧Toc在点击时是直接通过追加哈希值采用锚点的方式定位的,而ant design在此基础加入了滚动过渡,用户体验更友好;

好!带着这两个点,说干就干!直接拉一份dumi的源码,找一下相关代码的位置。

在源码中定位

在项目目录中,很清晰可以找到前面所说的两个改善的组件位置:

在这里插入图片描述

解决RtlSwitch样式

先来解决第一个问题,给RtlSwitch 组件增加一些样式吧~

RtlSwitch/index.less:

@import '../LangSwitch/index.less';

html[data-direction='rtl'] {
  direction: rtl;
}

可以看到,样式中并没有增设margin相关的样式,因此这条很简单,直接给他上个样式提pr!

@import '../LangSwitch/index.less';

.@{prefix}-lang-switch {
  + & {
    margin-inline-start: 20px;
  }
}

html[data-direction='rtl'] {
  direction: rtl;
}

相关pr链接:https://github.com/umijs/dumi/pull/1305

解决Toc滚动优化

Toc/index.tsx关键代码:

return sectionRefs.length ? (
    <ScrollSpy sectionRefs={sectionRefs}>
      {({ currentElementIndexInViewport }) => {
        // for keep prev item active when no item in viewport
        if (currentElementIndexInViewport > -1)
          prevIndexRef.current = currentElementIndexInViewport;

        return (
          <ul className="dumi-default-toc">
            {toc
              .filter(({ depth }) => depth > 1 && depth < 4)
              .map((item, i) => {
                const link = `#${encodeURIComponent(item.id)}`;
                const activeIndex =
                  currentElementIndexInViewport > -1
                    ? currentElementIndexInViewport
                    : prevIndexRef.current;

                return (
                  <li key={item.id} data-depth={item.depth}>
                    <a
                      href={link}
                      title={item.title}
                      {...(activeIndex === i ? { className: 'active' } : {})}
                    >
                      {item.title}
                    </a>
                  </li>
                );
              })}
          </ul>
        );
      }}
    </ScrollSpy>
  ) : null;

可以看到,原来的方式和之前所说一样,通过a标签的href追加了url中的hash,利用html默认支持的锚点实现点击定位,而想要加入滚动,博主一开始的想法是在此基础上增设点击事件,计算页面当前高度和目标元素所在高度的高度差,做一个滚动动画的显示。

实现思路如下:

给原本a标签增加点击事件,并将所点击的h2元素id传到事件中,获取该h2元素,计算它在页面的位置,最终得出一个滚动长度,并且判定是向上还是向下滚动,通过Date差,实现一次滚动动画固定时间为35帧。

代码:

//...

const scrollTo = (newTop: number, nowTop: number, direction: 'top' | 'bottom') => {
  // 执行35次
  const duration = 450;
  const startTime = Date.now();
  const scrollDiffSize = Math.abs(newTop - nowTop);
  // 计算每帧滚动高度
  const scrollSize = direction === 'top' ? scrollDiffSize / 35 * -1 : scrollDiffSize / 35;

  const frameFunc = () => {
    const timeStamp = Date.now();
    const time = timeStamp - startTime;
    document.documentElement.scrollTop += scrollSize;

    if(time < duration) {
      raf(frameFunc)
    }
  }
  raf(frameFunc)
};

const scrollToByIndex = (h2Index: number) => {                                 
    const clickNode = sectionRefs[h2Index].current; 
    
    if(clickNode) {   
        // 点击目标位置                                          
        const newTop = clickNode.offsetTop                   
        const nowTop = document.documentElement.scrollTop;    
        const direction = newTop < nowTop ? 'top' : 'bottom'; 
        scrollTo(newTop, nowTop, direction);                                           
    }                                                     
};

//...

return (
  <li key={item.id} data-depth={item.depth}>
    <a
      href={link}
      onClick={() => scrollToByIndex(item.id)}
      title={item.title}
      {...(activeIndex === i ? { className: 'active' } : {})}
    >
      {item.title}
    </a>
  </li>
);

嗯…写完以后也是觉得写的还不错,就commit上去提了pr,由于dumi维护者——peach大神的初衷是尽可能使用成熟三方库,减少维护成本,因此最后选择使用animated-scroll-to来完成动画,因此在scrollTo方法中的逻辑都可以直接使用第三方库来代替,修改后的代码如下:

//...
const scrollTo = (newTop: number) => {
  console.log(newTop)
  animateScrollTo(newTop, {
    speed: 200
  })
}

const scrollToByIndex = (h2Index: number) => {                                 
    const clickNode = sectionRefs[h2Index].current; 
    
    if(clickNode) {   
        // 点击目标位置                                          
        const newTop = clickNode.offsetTop;                   
        scrollTo(nowTop);                                           
    }                                                     
};

//...

return (
  <li key={item.id} data-depth={item.depth}>
    <a
      href={link}
      onClick={() => scrollToByIndex(item.id)}
      title={item.title}
      {...(activeIndex === i ? { className: 'active' } : {})}
    >
      {item.title}
    </a>
  </li>
);

嗯,此时看似需求已经完成了,可以合pr了吧?问题又出现了,由于给a标签增加了onClick事件,原本的href增设hash段实现dumi内部哈希更新失效了,最后决定下来的方案是使用dumi内置的Link组件代替a标签,实现跳转。

在这里插入图片描述

最终修改后的代码如下:

//...
const scrollTo = (newTop: number) => {
  console.log(newTop)
  animateScrollTo(newTop, {
    speed: 200
  })
}

const scrollToByIndex = (h2Index: number) => {                                 
    const clickNode = sectionRefs[h2Index].current; 
    
    if(clickNode) {   
        // 点击目标位置                                          
        const newTop = clickNode.offsetTop;                   
        scrollTo(nowTop);                                           
    }                                                     
};

//...

return (
  <li key={item.id} data-depth={item.depth}>
    <Link
      to={link}
      onClick={() => scrollToByIndex(item.id)}
      title={item.title}
      {...(activeIndex === i ? { className: 'active' } : {})}
    >
      {item.title}
    </Link>
  </li>
);

至此,实现滚动切换Toc item的优化需求就做好了~当然博主中间省略了一些代码方面的细节点,也是学习到了很多。

pr链接:https://github.com/umijs/dumi/pull/1303

效果:

在这里插入图片描述

一些心得体会

dumi2中提供了很多新特性,博主最喜欢的一个点就是通过slot自定义主题替代默认主题文件,如你不想要dumi默认的Content、Footer、Slider,你就可以像这样去自定义:

在这里插入图片描述

dumi dev编译过程中会判断哪些模块用默认主题,哪些去用自定义主题,这对比于dumi1来说非常大程度提高了开发成本和效率。

而像上面两个并不复杂的pr,其实完全可以通过自定义主题去fix,但换种思路想一下,作为dumi的老用户了,一起共建基层框架无非也是在提高自己的产品,并且在pr过程中也可以和维护者有近距离的交流和学习,这些都是非常有利于成长的~

具体更多的dumi2新特性可参考文章:

🎉 dumi 2,它来了它来了它来了

关于concis

最后再介绍一下博主的react组件库,从今年2月开工,目前50+组件,社区80+小伙伴一起交流讨论,如果感兴趣或喜欢或想参与共建,点个star支持一下吧~

在这里插入图片描述

线上文档

GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nios烧写到EPCS的问题处理

原理图如下图&#xff0c;板卡FPGA同时使用2片flash配置芯片&#xff0c;左侧M25P64即EPCS64。2片flash配置芯片使用相同的SPI总线。 在不使用nios的quartus工程中&#xff0c;使用jtag烧写jic的方式固化程序到EPCS64&#xff0c;始终正常。 近期使用含有nios的quartus工程&am…

生物素标记试剂:Alykne-Biotin-DADPS,2241685-22-1,DADPS-生物素-炔

【中文名称】DADPS-生物素-炔&#xff0c;炔基-生物素-二苯基硅烷 【英文名称】 DADPS Biotin Alykne&#xff0c;Alykne-Biotin-DADPS 【结 构 式】 【CAS号】2241685-22-1 【分子式】C42H62N4O9SSi 【分子量】827.12 【基团部分】Alykne基团 【纯度标准】95% 【包装规格】1g&…

小米手机用什么耳机音质好?发烧级音质蓝牙耳机推荐

小米品牌在我们日常生活中经常见到&#xff0c;蓝牙耳机作为现代人的必需品&#xff0c;使用人数一直都是递增的&#xff0c;市面上的蓝牙耳机品牌众多&#xff0c;但很多人不知道哪个牌子音质更好&#xff0c;作为一位耳机发烧友&#xff0c;近几天也是整理了几款音质表现出色…

MCE | mTOR 通路是如何调控自噬的

mTOR 是细胞生长和代谢的主要调节分子&#xff0c;可促进合成代谢过程&#xff0c;如核糖体的生物发生 (Ribosome biogenesis) 以及蛋白质、核苷酸、脂肪酸和脂质的合成&#xff0c;并抑制分解代谢过程&#xff0c;如自噬。mTOR 信号的失调与许多人类疾病有关&#xff0c;包括糖…

C++使用ffmpeg硬解码

转载&#xff1a;https://www.pudn.com/news/62bc096d405aad31f717648e.html 使用ffmpeg解码video模块&#xff0c;支持3种解码&#xff1a;cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码封装库只依赖ffmpeg&#xff0c;测试程序中用到了OpenCV&#xff0c;可用于将帧送往…

从 Uber 数据泄露事件我们可以学到什么?

Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证。最初尝试使用这些凭据连接到 Uber 的网络失败&#xff0c;因为该帐户受 MFA 保护。为了克服这一安全障碍&#xff0c;黑客通过 What’s App 联系了 Uber 员工&#xff0c;并假装是 Uber 的安全人员&…

基于JAVA的新闻文章发布管理系统,可以用来参考学习【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427648 主要使用技术 SpringSpringMVCMybatisBootstrapJqueryMysql 功能介绍 该系统分为前后台管理&#xff1a; 后台管理主要四个模块&#xff1a; 新闻管理&#xff1a;新闻发布实现类…

嵌入式工程师更新装备,最新的国产全志A40i、Xilinx ZYNQ开发板分享来了

各位工程师的硬件装备库还没更新&#xff1f; 以下国产比例100%&#xff0b;工业级 国产全志A40i、Xilinx ZYNQ开发板均有&#xff01; 限定50套 更多产品资料&#xff0c;案例详细说明&#xff0c; 点击链接或微信扫下方二维码下载&#xff01;https://site.tronlong.com/p…

功能点估算方法,如何让估算偏差更小?

1、何为软件功能点 ​ ​软件功能点是站在业务角度对软件规模的一种度量&#xff0c;功能点的多少代表软件规模的大小&#xff0c;这里说的功能点是标准的功能点&#xff0c;按照标准的估算方法&#xff0c;每个人对特定需求估算出的功能点数是一致的。 功能点估算方法&…

基于Java+Swing+Mysql企业人事管理系统

基于JavaSwingMysql企业人事管理系统一、系统介绍二、功能展示1.登录、注册2.主页面3.添加员工信息4.修改员工信息5、考勤管理6、工资管理三、数据库设计四、其他系统实现一、系统介绍 企业员工信息管理系统主要用于实现公司的员工相关信息管理&#xff0c;基本功能包括&#…

最新最全面的Spring详解(六)——Spring-Mybatis整合

前言 本文为Spring-Mybatis整合相关内容介绍&#xff0c;MyBatis-Spring 可以帮助我们将 MyBatis 代码无缝地整合到 Spring 中。 使用这个类库中的类, Spring 将会加载必要的 MyBatis 工厂类和 session 类。 这个类库也提供一个简单的方式来注入 MyBatis 数据映射器和 SqlSessi…

用Python构建区块链

区块链 区块链是在计算机网络的节点之间共享数据的分类账(分布式数据库)。作为数据库&#xff0c;区块链以电子格式储存信息。区块链的创新之处在于它保证了数据记录的安全性和真实性&#xff0c;可信性&#xff08;不需要没有可信任的第三方&#xff09;。 区块链和典型数据…

无线数据采集器

背景介绍 近年来&#xff0c;软硬件技术的革新带动了物联网行业的发展&#xff0c;趋使其应用场景不断深化&#xff0c;从工业设备故障诊断到共享经济&#xff0c;再到新能源汽车。调研发现&#xff0c;物联网的核心框架为&#xff1a;通过传感器感知物理世界的状态&#xff0c…

尚医通-手机验证码登录与gateway拦截实现

需求分析 1&#xff0c;登录采取弹出层的形式 2&#xff0c;登录方式&#xff1a; &#xff08;1&#xff09;手机号码手机验证码 &#xff08;2&#xff09;微信扫描 3&#xff0c;无注册界面&#xff0c;第一次登录根据手机号判断系统是否存在&#xff0c;如果不存在则自…

怎么裁剪视频时长?手把手教你裁剪

现在的网络非常方便&#xff0c;我们可以很轻松的在网上找到各种视频进行网课的学习。不过有些网课重点的内容可能不多而且又分散&#xff0c;我们很难做到高效的学习。其实我们可以通过视频裁剪&#xff0c;将需要的视频内容裁剪下来&#xff0c;这样子就方便我们学习啦。那你…

自动驾驶感知算法实战专栏总结:如何打造“高可靠、多冗余、可量化、数据驱动的感知系统”

自动驾驶感知算法实战专栏:https://blog.csdn.net/charmve/category_12097938.html目录 「超融合」感知方案高可靠:对障碍物、红绿灯的识别精度有保证多冗余:各个模块相互支撑、非串行可量化:PRT、仿真场景测试、Profiling数据驱动(全流程闭环)「超融合」感知方案 专注在…

vmware 桥接模式设置桥接到无线网卡

vmware共有三种网络&#xff0c;仅主机Host、NAT和桥接模式。 仅主机Host用于和主机通信的网络。NAT用于网络地址转发上网。桥接模式用于搭建与主机之外的网络的网桥。 在添加桥接模式的网卡后&#xff0c;如果使用有线连接&#xff0c;这个时候&#xff0c;桥接网卡会桥接到的…

消能减震神器之“黏滞阻尼器”的力学原理与应用

作者 | 建源之光&#xff0c;仿真秀专栏作者 一、写在文前 消能阻尼器的基本力学原理主要体现在恢复力模型上&#xff0c;恢复力模型的建立对整体结构模型的动力分析起了便捷作用&#xff0c;便于指导工程实际应用。对于消能阻尼器通常选择以下本构进行模拟&#xff1a; 软钢…

如何利用Airtest做一些简单的装包小任务

1. 前言 很多同学对于Airtest都有一些刻板的印象&#xff0c;觉得Airtest只能截图&#xff0c;然后进行一些简单的点点点操作。 但实际上&#xff0c;抛开Airtest的图像识别点击功能&#xff0c;Airtest还能帮助我们连接设备&#xff0c;然后完成一些别的小任务&#xff0c;比…

CAD .NET 14.1.X DWG/ DXF, PLT 自由转换- CNC

CAD .NET CAD .NET是一个用于在 .NET 环境中开发解决方案的库。它支持 AutoCAD DWG/ DXF、PLT和其他 CAD 格式。 该库可用于广泛的领域&#xff1a; 在所有项目阶段使用工业图纸监控和远程控制程序数控加工数据导出为 CAD 格式使用数据库文件管理系统使用图纸的高度专业化产品…