既ovsjs之后的本人又一作品,为了让ovsjs可以写小程序,我为uni-app小程序端引入了对Vue渲染函数的支持

62 阅读4分钟

先上项目链接,欢迎大家体验与star,跑一下看看效果,参观了解一下

顺便声明,虽然这是刚开始,但这是一个值得信任的项目,因为我的ovsjs语法要基于这个运行,所以这坑不会弃,放心使用,欢迎想在uniapp上使用jsx和h函数的朋友和我交流,如果人多,我准备顺便支持下uniapp写jsx

github.com/alamhubb/un…

模板项目地址

github.com/alamhubb/un…

npm 命令

npx create-uni-render my-app

ovsjs项目地址和文章

github.com/alamhubb/ov…

vue也支持声明式UI了,向移动端kotlin,swift看齐,抛弃html,pug升级版,进来看看新语法吧

这个项目现在绑定vue的3.4.21版本,与uniapp绑定的vue版本一致,高版本不支持,原因待查

不想看我写的文章可以看ai写的

gitee.com/alamhubb/un…

github.com/alamhubb/un…

为什么做这件事?

众所周知,我开发了一个 移动端like的ovsjs语法,vue的第三种写法,让vue可以脱离模板得到更高的灵活性,使vue在灵活性上可以与react的jsx一决高下,将其斩于马下,又比h渲染函数的开发体验要好

因为要用ovsjs语法写uniapp小程序,因为ovsjs是基于h函数的dsl,所以我需要让uniapp支持h函数

语法是这样的

添加图片注释,不超过 140 字(可选)

又因为众所周知的原因,uniapp的小程序端是不支持h函数的,官方也不准备支持,现在是模板静态编译,动态会损失性能

github.com/dcloudio/un…

github.com/dcloudio/un…

所以我们需要自己动手解决这个问题

整个项目到目前可以跑一个样例demo,发布npm,供大家参考体验使用,耗时一周左右吧,具体原理也不难,总共就6个ts文件,一个.vue组件,每个文件不超过300行代码,然后还有一个vite插件编译端TechnicalImplementation.md · alamhubb/uni-render …整个项目到目前可以跑一个样例demo,发布npm,供大家参考体验使用,耗时一周左右吧,具体原理也不难,总共就6个ts文件,一个.vue组件,每个文件不超过300行代码,然后还有一个vite插件编译端

添加图片注释,不超过 140 字(可选)

基本就是整合现有工具链,参考uniapp事件处理的方式,还有给vue的h函数和uniapp的vue之间做桥接

原理

这部分本篇文章没写完,我也不准备写了,交给ai写了,这是ai写的技术实现目录

添加图片注释,不超过 140 字(可选)

ai写的链接如下

TechnicalImplementation.md · alamhubb/uni-render …

github.com/alamhubb/un…

下面是我手写的,没写完

做了哪些事

  1. 众所周知小程序端是不支持动态组件的,所以我们需要提供一个组件模板,传入json,根据json动态渲染

添加图片注释,不超过 140 字(可选)

就是这个RenderComponent组件,这是我们能用h函数动态渲染组件的一个基础组件

  1. 利用vue的customRender技术,将h函数的响应式做到不与dom绑定,可以自定义渲染平台

在web平台,h函数是与dom绑定的,在小程序平台没有dom,所以我们需要自定义渲染的方式,我们的解决方式就是通过vue的createRenderApp 将h函数组件渲染成VNode,然后我们将VNode 转成json,并Watch这个VNode的变化,每次vnode变化时重新给nodeJson赋值,这样我们的组件就能动态渲染VNode的内容了

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

  1. 上面是运行时,接下来是编译时

我们支持开发者随便写模板和渲染函数都可以支持

由于我们用vue的渲染函数用了一套vue,uniapp也内置了一套vue,这两套vue如果一起用就会打架,冲突

所以我们需要完全接管整套vue系统,只在我们的内部与uniapp的vue交互,就是上面说的vnode变化是赋值给nodeJson,这部分是uniapp的vue处理的,其他所有地方都用的我们自己的vue

众所周知,uniapp是会对.vue文件进行编译处理的,那我们如何拦截uniapp对.vue文件的处理呢

我们使用了vite的虚拟块技术,将.vue文件转发到.temp.ts文件上,这样uniapp后续就不会对这个.vue文件进行处理了

然后对于.page.vue 我们还需要特别的处理,写不动了,明天再写吧,还有我写的不好,想更详细了解了,可以看我让ai生成的项目技术原理介绍

github.com/alamhubb/un…

添加图片注释,不超过 140 字(可选)

本项目开发过程中借鉴了uniapp的事件系统处理逻辑