先上项目链接,欢迎大家体验与star,跑一下看看效果,参观了解一下
顺便声明,虽然这是刚开始,但这是一个值得信任的项目,因为我的ovsjs语法要基于这个运行,所以这坑不会弃,放心使用,欢迎想在uniapp上使用jsx和h函数的朋友和我交流,如果人多,我准备顺便支持下uniapp写jsx
模板项目地址
npm 命令
npx create-uni-render my-app
ovsjs项目地址和文章
vue也支持声明式UI了,向移动端kotlin,swift看齐,抛弃html,pug升级版,进来看看新语法吧
这个项目现在绑定vue的3.4.21版本,与uniapp绑定的vue版本一致,高版本不支持,原因待查
不想看我写的文章可以看ai写的
为什么做这件事?
众所周知,我开发了一个 移动端like的ovsjs语法,vue的第三种写法,让vue可以脱离模板得到更高的灵活性,使vue在灵活性上可以与react的jsx一决高下,将其斩于马下,又比h渲染函数的开发体验要好
因为要用ovsjs语法写uniapp小程序,因为ovsjs是基于h函数的dsl,所以我需要让uniapp支持h函数
语法是这样的
添加图片注释,不超过 140 字(可选)
又因为众所周知的原因,uniapp的小程序端是不支持h函数的,官方也不准备支持,现在是模板静态编译,动态会损失性能
所以我们需要自己动手解决这个问题
整个项目到目前可以跑一个样例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 …
下面是我手写的,没写完
做了哪些事
- 众所周知小程序端是不支持动态组件的,所以我们需要提供一个组件模板,传入json,根据json动态渲染
添加图片注释,不超过 140 字(可选)
就是这个RenderComponent组件,这是我们能用h函数动态渲染组件的一个基础组件
- 利用vue的customRender技术,将h函数的响应式做到不与dom绑定,可以自定义渲染平台
在web平台,h函数是与dom绑定的,在小程序平台没有dom,所以我们需要自定义渲染的方式,我们的解决方式就是通过vue的createRenderApp 将h函数组件渲染成VNode,然后我们将VNode 转成json,并Watch这个VNode的变化,每次vnode变化时重新给nodeJson赋值,这样我们的组件就能动态渲染VNode的内容了
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
- 上面是运行时,接下来是编译时
我们支持开发者随便写模板和渲染函数都可以支持
由于我们用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生成的项目技术原理介绍
添加图片注释,不超过 140 字(可选)