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

news2024/11/8 8:38:20

前言

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

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

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

d.umijs.org/guide/upgra…

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链接:github.com/umijs/dumi/…

解决Toc滚动优化

Toc/index.tsx关键代码:

return sectionRefs.length ? (<ScrollSpy sectionRefs={sectionRefs}>{({ currentElementIndexInViewport }) => {// for keep prev item active when no item in viewportif (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}><ahref={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}><ahref={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}><ahref={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}><Linkto={link}onClick={() => scrollToByIndex(item.id)}title={item.title}{...(activeIndex === i ? { className: 'active' } : {})}>{item.title}</Link></li>
); 

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

pr链接:github.com/umijs/dumi/…

效果:

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

备忘:收藏栏式的主页

作为从DOS时代过来的骨灰&#xff0c;早期的 Window 出于各种原因需要重装&#xff0c;而重装之后IE的收藏夹全丢了(不可能每次重装之前备份了收藏夹)。所以编程把收藏夹提取出来(当时就是目录结构下的 .lnk 文本内容)转为 myfav.html 作为主页&#xff0c;(不备份目录是为了)方…

eclipse快捷键

Eclipse常用快捷键1几个最重要的快捷键代码助手:CtrlSpace&#xff08;简体中文操作系统是Alt/&#xff09;快速修正&#xff1a;Ctrl1单词补全&#xff1a;Alt/打开外部Java文档&#xff1a;ShiftF2显示搜索对话框&#xff1a;CtrlH快速Outline&#xff1a;CtrlO打开资源&…

python时间-time模块

time是python自带的模块&#xff0c;用于处理时间问题&#xff0c;提供了一系列的操作时间的函数。 以下说明针对于 python2.7&#xff0c;其他版本可能有所差异。 模块提供了两个种表示时间的格式&#xff1a; 1.时间戳&#xff0c;是以秒表示从“新纪元”到现在的时间&#x…

代码随想录训练营第16天|104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

104 二叉树的最大深度 看完题后的思路 后续遍历 深度 f(root)终止条件 rootnull return 0递归 if rootnullreturn 0; leftf(root.left); rightf(root.right); return max(left,right)1;思路 节点深度: 该节点到根节点的节点数,某个节点的深度一次就能求出来 节点高度:该节点…

爱因斯坦求和约定:torch/np.enisum

结论&#xff1a;爱因斯坦求和约定就是用来省略求和符号的&#xff1b;所以它的本质是求和运算&#xff0c;它并不能决定具体的运算到底是矩阵乘法&#xff0c;还是内积外积之类的&#xff0c;它所涉及的所谓的矩阵乘法之类的&#xff0c;其实是人为定义的&#xff0c;和它自身…

Java 并发编程(Ⅰ)

目录1. 概念1. 基本概念2. 线程的状态2. 线程的初始化1. new Thread()2. new Thread(new Runnable())3. Thread 和 Runnable 的关系4. new Thread(new FutureTask(new Callable()))3. 常用方法1. start1. 线程组2. start 和 run2. sleep1. TimeUtil2. InterruptedException3. s…

DCMM数据管理能力成熟度认证详解

第一部分&#xff1a;评估基础篇 First part DCMM定义 DCMM是《数据管理能力成熟度评估模型》GB/T 36073-2018国家标准&#xff0c;英文简称&#xff1a;&#xff08;Data management Capability Maturity Model&#xff09;。是我国首个数据管理领域正式发布的国家标准。旨在帮…

【ZooKeeper】

1.ZooKeeper是什么&#xff1f; 答&#xff1a; ZooKeeper是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户…

100 家企业软件测试笔试面试题汇总(网友真实面试后征集)

目录 一、中科软 二、AURALOG 笔试面试&#xff08;外企&#xff09; 三、GWebs 公司笔试题 四、北京麒麟网信息技术有限公司笔试题 五、施惠特 六、总结 一、中科软 笔试题 1.谈谈你对测试的理解2.你三年的职业规划3.你对加班的看法&#xff1f;是否可以加班&#xff1f;4.你心…

推荐系统遇上深度学习(一四二)-[微软复旦]CTR预估中的对比学习框架CL4CTR

今天分享的论文为《CL4CTR: A Contrastive Learning Framework for CTR Prediction》&#xff0c;从特征表示角度入手&#xff0c;将多种对比学习损失引入到CTR预估的模型训练中&#xff0c;一起来看一下。1、背景主流的CTR预估模型大致可以分为两类&#xff0c;一类是传统的模…

【软件测试】遇到新产品的测试就懵了?这三部曲带你轻松快速上手新业务......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 初入一家公司&#…

FreeRTOS互斥量的实验

互斥量又称互斥信号量&#xff08;本质是信号量&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和 信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性&#xff0c; 用于实现对临界资源的独占式处理。本章要实现的功能是&#xf…

算法训练营 day24 回溯算法 回溯算法理论基础 组合

算法训练营 day24 回溯算法 回溯算法理论基础 组合 回溯算法理论基础 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 虽然回溯法很难&#xff0c;很不好理解&#xff0c;但是回溯法并不是什么高效的算法。 因为回溯的本质是穷举&#xff0c;穷举所有可能&am…

钉钉微应用 - - - - 如何本地开发调试?

钉钉微应用 - 本地开发调试1. 安装DingTalk-Design-CLI2. 初始化代码模版3. 启动开发、调试功能4. 遇到的问题4.1 对应企业没有xxx域名微应用&#xff1f;&#xff1f;4.2 history、location的表现异常&#xff1f;&#xff1f;4.3 本地已经存在了H5微应用&#xff0c;也想使用…

软件体系结构与架构技术知识点万字总结

文章目录页面技术一、Spring框架1. 三层体系架构2. Spring的核心3. Spring 的Bean中主要的装配方式&#xff08;1&#xff09;基于XML的装配&#xff1a;&#xff08;2&#xff09;基于Annotation的装配&#xff1a;&#xff08;3&#xff09;自动装配&#xff1a;4. Spring框架…

Linux 中启用 SSH 密码登录

Linux 中启用 SSH 密码登录 文章目录Linux 中启用 SSH 密码登录1、更改配置文件2、设置登录密码3、完成1、更改配置文件 首先使用 管理员 权限打开/etc/ssh/sshd_config文件。 sudo vi /etc/ssh/sshd_config找到 PasswordAuthentication 选项&#xff0c;耐心查找。 当然&am…

23种设计模式之十一种行为型模式

23种设计模式之十一种行为型模式1. 设计模式概述1.1 什么是设计模式1.2 设计模式的好处2. 设计原则分类3. 详解3.1 单一职责原则3.2 开闭原则3.3 里氏代换原则3.4 依赖倒转原则3.5 接口隔离原则3.6 合成复用原则3.7 迪米特法则4. Awakening1. 设计模式概述 我们的软件开发技术也…

车道线检测源码详解

源码链接见文末 1.车道数据与标签下载 数据下载地址:因为数据的规模比较大,源码中只包含了部分数据,能够供运行代码使用 CULane:https://xingangpan.github.io/projects/CULane.html tusimple:https://github.com/TuSimple/tusimple-benchmark/issues/3 2.项目环境配置 …

数据存储:MySQL之多表连接方式

在我们走出新手村&#xff0c;开始编写系统时&#xff0c;总会遇到各种复杂的场景需要多个数据库表的联查&#xff0c;这时我们就需要掌握多表查询有几种方式&#xff0c;以便我们在各种复杂的应用场景使用适宜的连接方式。 用于测试的表&#xff1a; student表 grade表 syst…

车载以太网 - SomeIP测试专栏 - 详细解析 - 02

对于介绍SomeIP协议&#xff0c;我还是想从最基础的协议解析来&#xff0c;所以今天还是先将SomeIP协议详解给大家列举一下&#xff0c;也方便大家在工作中如果不记得哪些信息随时可以查看学习&#xff0c;也算是留给我自己的笔记吧&#xff0c;毕竟确实容易忘记。 SomeIP数据&…