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

前言

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 = valuereturn true}const _path = [...path, property]// 监听修改handler.set && handler.set({target,property,receiver,root: rootStaticObject,path: _path,newVal: value,oldVal: target[property]})target[property] = valuereturn 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.mzph.cn/news/143839.shtml

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

相关文章

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了,笔者解析过glide的源码,也是因为觉得自己熟悉一些,也就没太关注过项目里glide的具体使用对当前业务的影响;主要是自负,还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

文章目录 BIO优缺点示例代码 NIO优缺点示例代码 AIO优缺点示例代码 总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 BIO、NIO和AIO是Java编程语言中用于处理输入输出(IO…

编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载

编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件&…

写的代理对象注入Spring的小基类,用于注入远程接口代理对象,算是对上篇文章的一个小改进

整来整去有点像一个微型openFeign&#xff0c;虽然简陋了点&#xff0c;但在改善代码质量和提高代码复用、可靠性、功能定制方面有着不错的效果。 public abstract class RemotingBean<T> implements ResourceLoaderAware, FactoryBean<T> {private ResourceLoade…

登录框渗透思路总结

0x00 前言 最近遇到几个靶机都是登录框&#xff0c;简单写下我的渗透思路吧~~ 0x01 渗透思路 1、用户名枚举爆破 用户名的查找&#xff0c;像工号可以尝试通过互联网搜索引擎去收集 爆破&#xff1a;burp字典 2、万能密码 测试方法&#xff1a; (1)用户名输入&#xff…

飞天使-django创建一个初始项目过程

创建django项目 运行项目 运行命令 pyhont manage.py runserver 然后访问 http://127.0.0.1:8000/&#xff0c; 则可以打开本地新建的项目 虚拟环境的部署-mac 在一台计算机上可以通过虚拟环境实现多个版本Django的开发环境 安装虚拟环境工具&#xff1a;如果你的系统中没有安…

探索人工智能领域——每日30个名词详解【day3】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

Skywalking流程分析_7(构造/实例方法的增强流程)

前言 this.enhance protected DynamicType.Builder<?> enhance(TypeDescription typeDescription, DynamicType.Builder<?> newClassBuilder,ClassLoader classLoader, EnhanceContext context) throws PluginException {//静态方法的增强newClassBuilder thi…

QT使用Socket与安卓Socket互发消息

背景:安卓设备通过usb网络共享给Linux,此时安卓设备与linux处于同一网络环境,符合使用socket的条件,linux做客户端,安卓做服务端 1.QT使用Socket (1).在工程文件中加入 QT network (2).导包以及写一些槽函数用做数据传输与状态接收 #ifndef MAINWINDOW_H #define MAINWINDOW…

【算法】算法题-20231116

这里写目录标题 一、合并两个有序数组&#xff08;力扣88 &#xff09;二、剑指 Offer 39. 数组中出现次数超过一半的数字三、移除元素&#xff08;力扣27&#xff09;四、找出字符串中第一个匹配项的下标&#xff08;28&#xff09; 一、合并两个有序数组&#xff08;力扣88 &…

在 HarmonyOS 上实现 ArkTS 与 H5 的交互

介绍 本篇 Codelab 主要介绍 H5 如何调用原生侧相关功能&#xff0c;并在回调中获取执行结果。以“获取通讯录”为示例分步讲解 JSBridge 桥接的实现。 相关概念 Web组件&#xff1a;提供具有网页显示能力的 Web 组件。 ohos.web.webview&#xff1a;提供 web 控制能力。 …

洋葱架构、三层架构及两者区别

前言 洋葱架构它的名称来源于洋葱的层次结构&#xff0c;即软件代码的各层次之间的关系。在这种架构中&#xff0c;应用程序的各个组件通过一系列层次结构被逐层包裹在一起&#xff0c;形成一个类似于洋葱的结构。 一、经典三层架构 三层架构是一种软件设计模式&#xff0c;…

【机器学习5】无监督学习聚类

相比于监督学习&#xff0c; 非监督学习的输入数据没有标签信息&#xff0c; 需要通过算法模型来挖掘数据内在的结构和模式。 非监督学习主要包含两大类学习方法&#xff1a; 数据聚类和特征变量关联。 1 K均值聚类及优化及改进模型 1.1 K-means 聚类是在事先并不知道任何样…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)

目录 基于ARM语音识别的智能家居系统 练习一 一、程序编译 练习二&#xff1a; 二、文件IO 三、文件IO常用API接口函数 1、打开文件 open&#xff08;&#xff09; 2、将数据内容写入文件 write&#xff08;&#xff09; 3、关闭&#xff08;保存&#xff09;文件 四、…

WPF中Dispatcher对象的用途是什么

在WPF (Windows Presentation Foundation) 中&#xff0c;Dispatcher 对象的主要用途是提供一个与UI线程关联的消息循环系统&#xff0c;这允许开发者在UI线程上安排和执行任务。由于WPF的UI元素不是线程安全的&#xff0c;因此任何对UI元素的访问都必须从创建该元素的线程&…

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比 目录 分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现QPSO-SVM、PSO-SVM、SVM分类预测对比&#xff0c;运行环境Matlab2018b…

uniapp生成自定义(分享)图片并保存到相册

需求描述 在一个页面中底部有个保存图片的功能&#xff0c;点击能够保存一张生成的自定义表格图片。 第一眼见到这个需求 自己会出现了两个问题 如何去处理图片中的自定义内容以及样式如何将自定义内容转化成图片 至于保存图片&#xff0c;uniapp有对应的api去实现uni.saveIma…

AIGC ChatGPT 4 与 Python 进行数据分析与可视化

Python是数据分析的理想工具,其优势主要体现在以下几个方面: 1. 丰富的库资源:Python有大量的数据分析和科学计算库,如pandas、NumPy、SciPy和Matplotlib等,这些库提供了数据操纵、处理、可视化、建模和算法功能,大大简化了数据分析的复杂性。 2. 高级编程语言:Python…

小样本目标检测(Few-Shot Object Detection)综述

背景 前言:我的未来研究方向就是这个,所以会更新一系列的文章,就关于FSOD,如果有相同研究方向的同学欢迎沟通交流,我目前研一,希望能在研一发文,目前也有一些想法,但是具体能不能实现还要在做的过程中慢慢评估和实现.写文的主要目的还是记录,避免重复劳动,我想用尽量简洁的语言…

【移远QuecPython】EC800M物联网开发板的MQTT协议腾讯云数据上报

【移远QuecPython】EC800M物联网开发板的MQTT协议腾讯云数据上报 文章目录 导入库初始化设置MQTT注册回调订阅发布功能开启服务发送消息函数打包调用测试效果附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from TenCentYun import TX…