前端又推陈出新了:Dlight.js,一个我认为目前JS端DX最好的框架

老规矩,开头先上正菜🥣:

官网:dlight.dev
Github:dlight.dev

现在关注这个框架还是非常非常早的。但是无妨让我们来探索、了解它。

现在官网首页已经有汉化了,我们看看它的code style,DX真的是Max

typescript 复制代码
@View
class MusicChooser {
  @Prop musics
  musicIdx = this.random()
  music = this.musics[this.musicIdx]
  random() {
    return Math.floor(Math.random() * this.musics.length)
  }

  View() {
    PrettyBtn("Get a new song!")
      .onClick(() => {
        this.musicIdx = this.random()
      })
    MusicDisplay(music)
  }
}

让我们从最基础的开始

声明一个div,非常简单:

typescript 复制代码
div("Hello world")

改变div的样式?添加divclass/id?添加div的事件?也非常简单,采用链式语法,一路.下去:

typescript 复制代码
div("Hello world")
   // 添加行内样式
   .style({ padding: "10px" })
   // 设置Id
   .id("app")
   // 设置class
   .class("root")
   // 添加事件
   .onClick(() => {
       // 在这里添加逻辑
   })

如果你了解过鸿蒙的ArkTS,又或者是做过苹果的原生Swift UI的开发,你应该能倍感亲切;但是有些东西还是和ArkTS是不一样的,比如自定义一个元素内部的内容,dlight.js是这么写的:

typescript 复制代码
div().onClick(() => {
    // 在这里添加逻辑
}); {
   // 在这里自定义内容
}

ArkTS的语法是这样的:

typescript 复制代码
Text() {
   // 在这里自定义内容
}.onClick(() => {
       // 在这里添加逻辑
})

可以看到,dlight.js的div(),实际上由;分号隔了两段,实际上是由两段代码组合而成的;那么,怎么渲染到页面上呢?

没错,Babel插件嘛。仓库是Monorepo的,看到这个文件夹,我就已经知道了()

有兴趣的可以看看:dlight/packages/core/babel-preset-dlight

再谈流程控制,都直接{}了,你想要在这个{}中操作整个View类的上下文干什么都可以了,比如亲爱的if/elseswitch-casefor循环:

响应式

一般的字符串,和数字,直接声明一个类属性即可:

typescript 复制代码
@View
class MusicChooser {
    // 如果这个属性在View函数中用了,它就是响应式的;
    // 如果没有用,它就是正常的类变量。非常智能了属于是
    test: string = "Hello world"
    
    View() {}
}

Props,也能很好地响应:

typescript 复制代码
@View
class MusicChooser {
    // 有这个@Prop,就是一个prop
    // 如果 = 了required,就表示是必传的
    @Prop
    test: string = required
    
    View() {}
}

TypeScript支持

特别是子组件,非常需要TypeScript的支持,因为dlight的组件设计是去除new关键字的组件,所以导出一个组件的时候,必须要用一个比较蹩脚的as any as T

typescript 复制代码
interface MyCompProps {
  /** 这是 prop1 */
  prop1: string
  /** Prop2是一个number */
  prop2: number
  /** Prop3是一个布尔值 */
  prop3: boolean
}

@View
class MyComp implements MyCompProps {
  @Prop prop1 = required
  @Prop prop2 = required
  @Prop prop3 = required

  View() {}
}

// 这个Pretty实际上就是any😂更语义化,语义化一点嘛(
export default MyComp as Pretty as Typed<MyCompProps>

性能

这方面文档上没有明说,但是据说与solid.js差不多哦,贴一个dlight团队发的链接,可以看到benchmark:

krausest.github.io/js-framewor...


整体大概这么多。整个看下来,这个框架无疑是极好的((((就是还没生态

现在Dlight还有一个叫Model的东西,类似React hook Vue hook这种,用于抽象API,以方便在视图中使用,但是文档现在还没有,再等等吧()

帮dlight的群引个流:

相关推荐
雨季66614 分钟前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart
天人合一peng29 分钟前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
会飞的战斗鸡1 小时前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
方也_arkling1 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
qq_177767371 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767372 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区2 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO2 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素
烬头88212 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos