告别标记语法(html、jsx),我开发的前端声明式UI框架ovsjs(0.0.7)上线到了npm,欢迎体验

317 阅读3分钟

ovs

是一个类似于swiftUI的声明式UI框架,内部使用vue的渲染函数实现,核心竞争力是实现了前端的语法创新

项目地址

github.com/alamhubb/ov…

为什么要做这个UI框架

起因是我在使用vue开发一个社交业务型的UI框架时遇到的困扰,vue组件的灵活性、扩展性很差

我有一个MineView(我的)的基础页面,这个页面支持各种元素的插入,比如默认我只支持显示个人的头像、昵称、年龄、城市,由于不同的业务使用这个基础组件时,我需要扩展各种类型,比如有的业务需要这个页面显示手机号,需要在底部加个相册等等吧,就是各种你想想不到的扩展,如果使用插槽来做,我需要考虑各种情况,设计出各个位置的插槽,然后直接被替代,我如果想要基于以前的插槽内容扩展又做不到,只能再把默认插槽中的内容封装成组件,这样有需要制作很多组件,很繁琐

使用oop、class编程范式解决问题

这就让我想到oop、class的编程范式,如果用class来做就会很容易,继承父类,子类方法中使用父类、并在调用父类之前、父类之后随意增加逻辑,或者重写父类的某些小方法,要是能操作页面对象和操作普通对象一样容易该多好,如果可以用class的方式来实现UI该多美好

理想中的代码是什么样的,伪代码

基础组件MineView(我的)


//声明一个我的页面组件
Component MineView : div {
    //我的页面组件中的header部分,类似于vue的插槽,slot name="header",给MineView组件设置一个可渲染的组件属性,属性名:渲染内容
    header: div {
        avatar: div{ 头像 } 
        nickname:span{ 昵称 }
        age: span { 年龄 }
    }
}

新业务扩展, MineView加个相册

一个新业务,需要给我的页面,加个相册,我们直接使用MineView

Component PhotoMineView extend MineView : div {
    header:super.header,
    photo:div{
        //不设置属性名
        div{照片1}
        div{照片2}
        div{照片3}
    }
}

又一个新业务,给MineView的header加个性别内容

Component AddGenderMineView extend MineView : div {
    header {
        const newHeader = super.header
        //在header的avatar属性之后增加一个属性age,感觉jquery又回来了
        newHeader.appendAfter(newHeader.avatar, gender:div{
            性别
        })
        return newHeader
    }
}

你是否也期待这样灵活的前端UI语法

那么业内有没有基于class的成熟的ui解决方案呢,我找到了swiftUI和flutter,都是声明式的语法,那么能不能在前端也设计这样一种语法呢

让我们先看一下swiftUI的语法

SwiftUI 声明式代码

//
struct ContentView: View { 
    var body: some View { 
        Text("Hello, World!").padding() 
    } 
}

关于ovs

于是开始了OVS的开发之路

ovs语法解析

最开始我使用的是chevrotain,一个自定义语法的语法解析库,但是在语法转换这部分不太好用,我需要将 div{ 123}转换为vue的渲染函数 h('div',123) ,于是我模仿chevrotain开发了一个 subhuti

更多内容可看

# 告别 HTML、Template、JSX,像 Flutter 和 Swift 一样用 OOP 语法开发 Web 前端的新尝试

#【编译原理创新尝试(二)】generator代码生成篇:不再写代码生成器generator,用类ebnf语法实现不同编程语言的自动转换

# 【非标题党】用二十几行代码实现一个属于自己的编程语言编译器,我开源了一个js实现的语法编译器框架subhuti,轻松入门编译原理

ovs的体验

体验的项目地址 gitee.com/alamhubb/vi…


git clone https://gitee.com/alamhubb/vitesuhutiov.git
npm i 
npm run dev

注意,ovs目前只是一个交流项目,仅用于思想验证

目前只支持简单的es6语法,还不支持ts语法

求职

30岁,成人本科,10年前端(3年java,7年前端)20年代码经验求职,坐标(北京、天津、唐山)