当前位置: 首页 > news >正文

专访|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 = 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标签,一起参与开源贡献~

相关文章:

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

前言 OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会,我们采访了 TinyReact 的共建者 Mr 栋同学。 Mr 栋同学是一位热衷于前端技术的开发者,对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中&#xff0…...

2023年11月PHP测试覆盖率解决方案

【题记:最近进行了ExcelBDD PHP版的开发,查阅了大量资料,发现PHP测试覆盖率解决方案存在不同的历史版本,让我花费了蛮多时间,为了避免后人浪费时间,整理本文,而且网上没有给出Azure DevOps里面P…...

matlab模糊控制文件m代码实现和基础理论

1、内容简介 略 15-可以交流、咨询、答疑 通过m代码来实现生成模糊文件fis文件 2、内容说明 模糊文件m代码实现和基础理论 matlab模糊控制文件m代码实现和基础理论 模糊文件、m代码和模糊基础理论 3、仿真分析 略 4、参考论文 略 链接:https://pan.baidu.co…...

Java设计模式-创建型模式-单例模式

单例模式 单例模式饿汉式懒汉式 单例模式 解释:一个类只能有一个实例 单例模式可以分为两种 饿汉式 和 懒汉式 饿汉式 也被称为预加载,即 在加载类的时候,就将实例创建出来,加载到内存,不管之后会不会使用这个实例 …...

社区分享|杭银消费金融基于MeterSphere开展接口自动化测试

杭银消费金融有限公司(以下简称“杭银消费金融”)成立于2015年12月,是经中国银保监会批准,由杭州银行作为主发起人,联合滴滴出行、中国银泰等企业组建的持牌消费金融机构,注册资本为25.61亿元。杭银消费金融…...

阿里云2核2G云服务器99元一年!3M带宽的ECS云服务器哦

经济型e实例2核2G3M带宽优惠价99元一年 除了轻量服务器配置,经济型e实例2核2G3M配置也成为了用户关注的焦点。这款云服务器以99元一年的价格,适合个人和普通企业用户搭建网站、开发测试等需求。 我买的是阿里云这款99元的云服务器,活动参与地…...

【工程部署】在RK3588上部署OCR(文字检测识别)(DBNet+CRNN)

硬件平台: 1、firefly安装Ubuntu系统的RK3588; 2、安装Windows系统的电脑一台,其上安装Ubuntu18.04系统虚拟机。 参考手册:《00-Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN》 《RKNN Toolkit Lite2 用户使用指南》 1、文…...

Dockerfile运行容器不立即退出

1. 问题描述 运行容器结束,docker container立即退出。 2. 解决方案 在dockerfile中,添加如下命令, ENTRYPOINT ["tail", "-f", "/dev/null"]...

基因检测技术的发展与创新:安全文件数据传输的重要作用

基因是生命的密码,它决定了我们的身体特征、健康状况、疾病风险等。随着基因检测技术的高速发展,我们可以通过对基因进行测序、分析和解读,更深入地认识自己,预防和治疗各种遗传性疾病,甚至实现个性化医疗和精准健康管…...

Flink SQL自定义标量函数(Scalar Function)

使用场景: 标量函数即 UDF,⽤于进⼀条数据出⼀条数据的场景。 开发流程: 实现 org.apache.flink.table.functions.ScalarFunction 接⼝实现⼀个或者多个⾃定义的 eval 函数,名称必须叫做 eval,eval ⽅法签名必须是 p…...

【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象

process对象是一个全局对象,提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例,因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的process对象事件&…...

觉非科技发布【轻地图高速NOA智驾方案】|地平线,觉非科技,MobileDrive超捷生态协作实现技术落地

11月10日,2023世界新汽车技术合作生态展期间,觉非科技正式发布了基于地平线征程系列以及MobileDrive超捷规控系统的【轻地图高速NOA智驾解决方案】。该方案首次实现了从芯片能力输出、到数据闭环建设、再到规控部署的产业生态链协作与打通,为…...

竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…...

128. 最长连续序列

这道题最简单的想法就是排序计数,但是复杂度为O(nlogn),不符合题意 于是采用哈希表的方法 将所有数字存放在哈希表中,然后开始逐个寻找。 比如当前遍历到x,如果x-1也存在哈希表中,那就从x-1开始遍历最长连续序列&#…...

设计模式-设计原则

文章目录 设计模式-设计原则单一职责原则开闭原则里氏替换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 设计模式-设计原则 单一职责原则 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 有时候类的功能并不…...

MongoDB基础运维

mongodb的基础概念介绍 database #数据库 collection #集合,类似于mysql中的表 filed #类似于mysql中字段 document #每行的记录 连接客户端 mongo ip:port 例如mongo 127.0.0.1:27017 mongo客户端的命…...

侧击雷如何检测预防

侧击雷是一种雷击的形式,指的是雷电从建筑物的侧面打来的直接雷击。侧击雷对高层建筑物的防雷保护提出了更高的要求,因为一般的避雷带或避雷针不能完全保护住建筑物的侧面。侧击雷可能会对建筑物的结构、设备和人员造成严重的损害,甚至引发火…...

检索搜索信息能力

(一)搜索工具的选择 谷歌 > 微信搜一搜 > 抖音等短视频 > 百度 (二)搜索方式 一,搜索内容的分类 信息类学习类工具类 二,谷歌浏览器的搜索技巧 1、“搜索内容” 限定完整出现的词 如下图搜…...

设计大咖亲授:Figma中文环境设置全攻略!

作为UI设计师,你一定很熟悉Figma,Figma是一款专注于UI/UX设计的在线协作工具,使用非常高效方便,不需要下载和安装。它只需要通过浏览器编辑,在国外很受欢迎。但是Figma对于国内的小伙伴来说,使用Figma有一定…...

华为Hcia-数通学习(更改策略)

方法:书籍视频题目训练 书籍:华为HCNA网络技术学习指南。 视频:网络工程师学习路线_哔哩哔哩_bilibili 有过一点基础。考软考网络工程师的时候做了大量笔记,回去复习了一遍。现在准备找工作了,开始学习华为认证的网…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...