专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战

news2025/1/12 1:49:26

前言

OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会,我们采访了 TinyReact 的共建者 Mr 栋同学。
Mr 栋同学是一位热衷于前端技术的开发者,对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中,他积极参与,为社区贡献了自己的力量。
接下来,让我们一起走进Mr 栋同学的世界,了解他的编程之旅以及在 OpenTiny 开源之夏项目中的收获和成长。

互联网科技大会宣传极简风横板海报__2023-11-13+11_24_02.png

专访详情

OpenTiny: 很高兴认识你,欢迎你加入咱们 OpenTiny 开源社区,可以先简单介绍下你自己吗?
Mr 栋: 大家好,我是Mr 栋,我在 OpenTiny 开源社区主要做的项目是基于 renderless 实现 TinyReact 版本。目前是一位即将毕业的大四学生,主要是从大二开始了解并参与开源项目,之前2022年的时候有参与过百度的一个开源项目,主要是做漏斗图能力的一个增强。所以2023年,我也通过参与一些开源项目的共建,让我的简历更加丰富。

OpenTiny: 你是从什么时候开始接触开源社区的,你眼中的开源是什么样的?
Mr 栋 我主要是大二的时候接触到开源社区的,之前也是由同学推荐,然后有了解到开源之夏的宣讲。然后我觉得开源的话,首先就是它是一个比较开放的,由一个一个社区组成,然后就是在开源社区中有很多优秀的就是志同道合的开发者,其次就是这个项目的话它是面向互联网的,任何一个开发者都可以参与进来,就只要你对项目感兴趣,就可以投入进来。而且我觉得一个好的开源项目,可以让开发者通过小小的门槛就可以参与到贡献中去,学习门槛比较低,特别是文档这一块的建设,这个可能需要前期花比较大的精力和成本做好文档建设这部分内容。当然我觉得一个好的开源的话,开源的产物或者项目是可以提高大家的生产效率的,就是它可以受欢迎的并被大家去使用,而且大家也可以从这个开源项目中得到一些开发上的启示,我觉得这也是开源的一个意义,或者可以通过开源去认识其他的一些优秀的开发者同学。

OpenTiny: 最开始是如何了解到并决定参与 OpenTiny 开源之夏活动的?
Mr 栋 因为我从大学刚开始,就是选择的前端技术这个领域,然后就一直学习下去,也没有想过再去学习其他技术栈,因为我觉得先把一个方向做好,基础打好,比较重要。最开始是我舍友给我介绍了有开源之夏这个活动,然后我认为前端的开源分为两种,一种是给后端比如 ChatGpt 或者后端的 K8s 写一个 UI 界面或者测试工具,这种类似于业务性的内容,然后我更喜欢偏技术性的内容,然后我在很多项目中看到 OpenTiny 的项目内容是比较符合我的预期,并且 OpenTiny 这个项目本身就是服务于前端开发者,它是一整套前端解决方案。

OpenTiny: 那你在共建了OpenTiny 项目之后,你觉得OpenTiny 是什么?
Mr 栋 就我理解的话,我觉得 OpenTiny 是一个视野比较开阔的,涵盖的领域比较多,兼容的技术栈也比较多,除了有 TinyVue 组件库,还有 Angular 技术栈的 TinyNG 组件库,还有脚手架工具,以及中后台模板并且还有低代码引擎,能够覆盖前端开发的整个链路。我觉得这个是 OpenTiny 比较 open 的地方。

OpenTiny: 那你当时在选择 OpenTiny 的几个项目时,为什么会选择“基于 Renderless 实现 react 版本组件库“这个项目呢?因为这个项目的难度还是相对于其他的技术性难度会高一些
Mr 栋 哈哈 这个说实话可能是有点阴差阳错的成分,因为当时我对于这个题目的认知有一些偏差,我开始以为是 React 的基础上仿照 Vue 的 Renderless,可以新起一个架构,当时没有理解复用 Renerless,所以有点低估这个题目的难度了。不过通过这个项目的搭建,也让我对 Renderless 无渲染架构有了更深的理解。

OpenTiny: 你可以介绍下你参与 OpenTiny 项目的开发的内容及过程吗?
Mr 栋 首先我们主要是完成的一个工作就是通过 Renderless 无渲染设计架构实现 TinyReact 的组件库。由于 OpenTiny 的 TinyVue 这个组件库之前是基于 Vue 版本,之前是已经做完了跨版本的工作,可以实现一套代码同时支持 Vue2/Vue3,现在它想要去拓展到 React 框架,这就是技术栈的框架层面的拓展.由于是可以复用之前 TinyVue 组件库的核心逻辑代码,所以就是需要从 React 到 Vue 的核心逻辑代码之间做一个适配层去接入,将组件的各个层面都单独拆分为⼀个独⽴的部分,⽐如⼀个组件可能由以下⼏个层组成:从入口出发,分别是 模版层、样式层、适配层、逻辑层。

那我们要实现 TinyReact 版本的组件库,就是尝试按照以下思路来进行。
首先,我们可以分析⽂件的依赖关系。

import {
IButtonState,
ISharedRenderlessParamHooks,
IButtonProps,
IButtonApi,
IButtonRenderlessParamUtils
} from '@/types'
import { handleClick, clearTimer } from './index'
export const api = ['state', 'handleClick']
export const renderless = (
props: IButtonProps,
{ computed, onBeforeUnmount, reactive, watch, inject }: ISharedRenderlessParam
{ emit, parent }: IButtonRenderlessParamUtils
) => { ... }

观察可以发现,renderless 只有导⼊了组件逻辑⽬录的 index,index ⾥主要是组件逻辑处理的相关函数,而 renderless 函数在模版⾥是这样调⽤的:

const {
state,
handleHeaderClick
} = useSetup({
props: defaultProps,
renderless,
api,
constants: _constants,
vm,
parent
})

也就是说,useSetup 帮助模版调⽤了 renderless 函数,renderless 函数中的所有依赖,都应该由 useSetup 来提供。useSetup 也就是 react-common 中,也就是 react 适配层中最主要的函数。
vue 的 renderless 只会执⾏⼀次,react 组件的渲染函数每次状态刷新都会执⾏。因此,可以给 react 设计⼀个刷新区和挂载区。

function App() {
const ref = useRef();
if(!ref.current) {
// ⾸次执⾏区
ref.current = 'created';

}
useEffect(() => {
// 刷新区
})
useEffect(()=> {
// 挂载区
}, [])
}

可以在挂载区执行 renderless 函数,刷新区去注册回调。再来看看如何在 react 中实现深层数据响应式:

const reactiveMap = new WeakMap()
const reactive = (
staticObject,
handler = {},
path = [],
rootStaticObject = staticObject
) => {
reactiveMap.has(staticObject) || reactiveMap.set(staticObject, new Proxy(stati
get(
target,
property,
receiver
) {
const targetVal = target[property]
if (targetVal && targetVal['v-hooks-type'] === computed) {
return targetVal.value
}
  
const _path = [...path, property]
const res = typeof targetVal === 'object'
? reactive(targetVal, handler, _path, rootStaticObject)
: targetVal

// 监听访问
handler.get && handler.get({
result: res,
root: rootStaticObject,
path: _path,
target,
property,
receiver
})
  
return res
},
set(
target,
property,
value,
receiver
) {
const targetVal = target[property]
if (targetVal && targetVal['v-hooks-type'] === computed) {
targetVal.value = value
return true
}
const _path = [...path, property]

// 监听修改
handler.set && handler.set({
target,
property,
receiver,
root: rootStaticObject,
path: _path,
newVal: value,
oldVal: target[property]
})
  
target[property] = value
return true
}
}))

return reactiveMap.get(staticObject)
}

这是⼀个框架无关的响应式函数,可以对⼀个对象进⾏监听,返回代理对象,最主要的是深层响应式的递归代理,在 get、set 的时候都会触发回调,在这个深层响应式函数的基础上去绑定 react 刷新函数,就会在 react 侧实现数据响应式。
我们分析完成之后就可以在此基础上进行开发了,然后就明确了项目的需求,确定当前版本最基础最先需要实现的模块,再进行拆解任务,实现组件的功能,并与导师进行探讨,最后完成了整体的开发。

OpenTiny: 在开发过程中有遇到什么困难或者挑战吗?你是如何克服的呢?导师和社区成员有为你提供帮助吗?
Mr 栋 在完成这个项目时,确实有遇到一些问题,就是 Vue 和 React 两个框架之间,从设计层面就是有一些差异的,从使用者的角度来看,也是两种不同风格的框架,所以为了减少后续复用的开发成本就需要抹平一些使用上的差异,比如组件更新,每次更新都会去重新渲染组件,以及函数组件内部的逻辑。
首先我是通过不断尝试写一些 demo,通过各种各样的 demo 去尝试接入并运行,先去设想一个可行性的方法,然后去实践它,并且向导师询问这个方法是否有缺陷,在这个过程中,老师也是指出了我的一些缺陷,比如我在刷新 React 钩子时,得通过设置数据类型的一个状态,而不是布尔类型的一个状态。如果是布尔类型刷新基数次时,组件就不会触发刷新,这些都是在开发过程中的一些细节点。

OpenTiny: 你认为在开发 OpenTiny 项目的过程中,最有意思的地方是什么?
Mr 栋 我认为比较有意思的点在于在 Vue 的响应式的概念,因为两个都是非常优秀的前端框架,而我们可以通过一些优缺点的对比了解哪个框架更适合哪些情况,哪种业务场景。

OpenTiny: 你参与了 OpenTiny 项目共建之后,你觉得你有什么收获呢?
Mr 栋 参加完咱们这个项目之后,我觉得最大的收获就是对前端的框架有了更深的了解,还有就是对整个组件库的开发链接有了更进一步的了解,从构建、打包、发布整套流程,从而也知道了市面上的组件库是如何运作的。

OpenTiny: 根据你的经验,你觉得怎样才能更好的融入开源社区呢?
Mr 栋 融入开源社区,我觉得首先需要对自己有一个定位,可以完成哪些工作,胜任哪些工作,哪些方面还需要提升,对哪个方面更感兴趣。比如说有些开发者可能对打包构建这方面更感兴趣,就可以完美的去打包构建一个组件库的一整个产物。其次的话,如果想要更好的参与贡献也需要有耐心,首先过一遍在开发过程中用到的开发文档或者贡献文档,然后按照社区的规范去做一些事情。然后社区这边想要更多开发者参与进来,对于每个模块的开发细节,需要做好明确的思路和分工。需要明确从上游到下游的整个的开发链路,以便于开发者可以更好的参与到组件库建设的每个环节中去。

关于 OpenTiny

图片

OpenTiny 是一套企业级 Web 前端开发解决方案,提供跨端、跨框架的UI组件库,适配 PC 端 / 移动端等多端,支持 Vue2 / Vue3 / Angular 多技术栈,拥有灵活扩展的低代码引擎,包含主题配置系统 / 中后台模板 / CLI 命令行等丰富的效率提升工具,可帮助开发者高效开发 Web 应用。


欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~更多视频内容也可关注B站、抖音、小红书、视频号

OpenTiny 也在持续招募贡献者,欢迎一起共建

OpenTiny 官网:https://opentiny.design/

OpenTiny 代码仓库:https://github.com/opentiny/

TinyVue 源码:https://github.com/opentiny/tiny-vue

TinyEngine 源码: https://github.com/opentiny/tiny-engine

欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI~

如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

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

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

相关文章

如何学习VBA:3.2.7 工作簿的操作引申

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效率,而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册,现在已经全部完成,希望大家利用、学习。 如果…

【unity】常用属性特征

编辑器功能 AddComponentMenu-添加组件菜单 将脚本添加到Unity编辑器的菜单中,方便开发者在编辑器中快速添加组件。 示例 using UnityEngine; [AddComponentMenu("添加组件/FollowTransform")] public class FollowTransform : MonoBehaviour { }效果 …

OpenAI DALL·E 3文生图模型技术揭秘(建议收藏)

欢迎来到魔法宝库,传递AIGC的前沿知识,做有格调的分享❗ 喜欢的话记得点个关注吧! DALLE 3是OpenAI发布的一款文生成图AI系统,它无缝接入ChatGPT,通过接受文本提示作为输入,生成相应的图像作为输出。先来看…

【Linux】Linux常用命令—用户管理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Redis安装、配置

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

【算法每日一练]-单调队列(保姆级教程 篇2)#琪露诺 #选数游戏 #寻找段落

最后一期单调队列了啊 目录 题目&#xff1a;琪露诺 思路&#xff1a; 题目&#xff1a;选数游戏 思路&#xff1a; 题目&#xff1a;寻找段落 思路&#xff1a; 之前做的都是连续的长度区间求最值&#xff0c;今天体验一下不连续的区间。 然后就是要注意维护单调队列时…

Flutter有状态组件StatefulWidget生命周期

StatefulWidget是Flutter中的一个有状态的组件&#xff0c;它的生命周期相对复杂一些。下面是StatefulWidget的生命周期方法及其调用顺序&#xff1a; 1. createState(): 当StatefulWidget被插入到Widget树中时&#xff0c;会调用createState()方法来创建与之关联的State对象。…

如何有效概括一段工作经历?

问题描述&#xff1a; 如何有效概括一段工作经历&#xff1f; 解决方案&#xff1a; 1.要有效概括一段工作经历&#xff0c;可以遵循以下几个步骤&#xff1a; 确定关键信息&#xff1a;仔细审查工作经历&#xff0c;确定其中的关键信息和亮点。这可能包括你的职位、工作职责…

VR建筑仿真场景编辑软件有助于激发创作者的灵感和创造力

随着VR虚拟现实技术的不断发展和普及&#xff0c;VR虚拟场景编辑器逐渐成为了VR场景开发重要工具。它对于丰富和完善VR虚拟现实内容的创建和呈现具有重要的意义&#xff0c;为我们的工作和教学带来了许多变化和可能性。 首先&#xff0c;VR虚拟场景编辑器对于提升用户体验具有重…

C++实现查找连通域

目录 一、概述 1.1、四连通域算法 1.2、八连通域算法 1.3、种子填充法 二、代码 一、概述 图像处理中&#xff0c;查找连通域的算法是图像分割的重要方法之一。它能够将一幅图像分成若干个不重叠的区域&#xff0c;每个区域内部像素具有相似的性质&#xff0c;而不同区域…

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#和C++)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【01】Istio-1.17 部署

1.1 部署Istio控制平面 部署方法 istioctl istio的专用管理工具&#xff0c;支持定制控制平面和数据平面通过命令行的选项支持完整的IstioOperator API命令行各选项可用于单独设置&#xff0c;以及接收包含IstioOperator自定义资源(CR)的yaml文件 Istio Operator Istio相关的自…

哪些东西可以用超声波清洗机洗?这四款超声波清洗机可别错过

自从去眼镜店老板用超声波清洗机给我清洗过眼镜之后&#xff0c;我就发现&#xff0c;其实很多智能家居都可以帮我们大大解决一些清洁上面的问题&#xff0c;不仅方便还很高效&#xff01;这种一举两得的事情不得安排上&#xff01;现在市面上超声波清洗机可以清洗的东西是越来…

【OpenCV(4)】使用opencv编写mp4格式和avi格式

在之前的文章《【摄影与图像】444&#xff0c;422&#xff0c;420&#xff0c;10bit&#xff0c;8bit&#xff0c;RGB,YCrCb,场序&#xff0c;h264编码,封装&#xff0c;码率&#xff0c;PR常用配置》 说到了视频&#xff1a; 1、一个视频里面包含了什么&#xff1f; 图像音频…

通过百度翻译API完成Java中的中英文翻译

因为要做英文文献索引分词&#xff0c;所以对于索引词汇必须得是英文&#xff0c;将表中的中文都转换成英文 这里用到百度的翻译API 首先需要注册成为百度翻译开发者&#xff1a;百度翻译开放平台 注册成为个人开发者就可以&#xff0c; 这里可以完善相关信息&#xff0c;要记…

关于C++链接的一些理解

无论是.h还是.cpp&#xff0c;都可以写声明或者实体&#xff0c;而且.h和.cpp的前面的名字相同不相同没有任何的影响 最终一系列要连接的程序中&#xff0c;必须有且只有一个源文件有main函数&#xff0c;然后从这个main函数开始运行 include的作用其实是跟define一样的&#x…

高效筛选的秘密武器:JVS智能BI的‘and’与‘or’逻辑

在这个信息爆炸的时代&#xff0c;数据被誉为新时代的黄金和石油&#xff0c;蕴含着无尽的价值和潜力。然而&#xff0c;随着数据的爆炸式增长&#xff0c;如何高效、准确地从海量数据中提取出真正有价值的信息&#xff0c;成为摆在我们面前的一大挑战。我们需要用数据筛选工具…

app软件开发多少钱?功能会影响价格吗?

随着智能手机的普及&#xff0c;app开发市场日益繁荣&#xff0c;很多人都有开发app的梦想&#xff0c;但开发一款app需要多少钱呢?功能是否会影响价格?本文将为你揭开这个谜团。 一、app开发费用的影响因素 app开发费用受到多种因素的影响&#xff0c;例如开发难度、功能复…

垂直领域对话系统架构

垂直领域对话系统是指针对特定领域或行业的需求而构建的对话系统。这种系统通常需要具备高度的专业知识和对特定领域的知识库进行深入的学习和训练&#xff0c;以便能够提供准确、高效、实用的服务。 垂直领域对话系统的构建通常包括以下步骤&#xff1a; 确定目标领域或行业…

OpenCV:图像噪点消除与滤波算法

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…