您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

最小响应式UI框架 VanJS 开源,仅 Preact 体积1/10!

时间:2023-05-22 14:06:37  来源:今日头条  作者:高级前端进阶

今天给大家带来的主题是号称世界上最小的响应式 UI 框架,即 VanJS。话不多说,直接进入正题。

1.什么是 VanJS

VanJS(缩写为 Vanilla JAVAScript)是一个基于纯 Vanilla JavaScript 和 DOM 的超轻量级、零依赖和特立独行(unopinionated)的响应式 UI 框架。使用 VanJS 编程会让开发者感觉很像 React。比如下面的 Hello World 代码:

// 可重用组件可以只是纯 vanilla JavaScript 函数
// 将第一个字母大写以遵循 React 约定
const Hello = () => div(
  p("Hello"),
  ul(
    li("️World"),
    li(a({href: "https://vanjs.org/"}, "VanJS")),
  ),
)
van.add(document.body, Hello())
// 或者,你可以这样写:
// document.body.AppendChild(Hello())

开发者可以使用 VanJS 提供的在线转换器将任何 html 片段转换为 VanJS 代码。 VanJS 还可以通过更自然的 API 帮助开发者管理状态和 UI 绑定:

const Counter = () => {
  const counter = van.state(0)
  // state表示状态
  return div(
    "❤️ ", counter, " ",
    button({onclick: () => ++counter.val}, ""),
    button({onclick: () => --counter.val}, ""),
  )
}

van.add(document.body, Counter())

2.为什么选择 VanJS?

VanJS 的愿景是成为 UI 的脚本语言,就像 bash 是终端的脚本语言一样。 VanJS 使前端工程师、后端工程师、系统工程师、数据科学家和任何其他人都能够构建全面的用户界面。

 

开发者可以随时随地在任何设备上使用 VanJS 进行编码,甚至在智能手机上!VanJS具有以下显著特点。

没有 React/JSX 的响应式编程

VanJS 提供了 React 的所有优点,包括:声明式 DOM 组合、可重用组件、相对状态绑定。但 VanJS 不需要 React、JSX、转译、虚拟 DOM 或任何隐藏逻辑。 一切用户界面都是用简单的 JavaScript 函数和 DOM 构建。

即使没有状态和状态绑定,开发者也可以构建交互式网页, VanJS 用于 DOM 组合和操作的灵活 API:标记函数和 van.add。

const StaticDom = () => {
  const dom = div(
    div(
      button("Dummy Button"),
      button(
        {onclick: () =>
          van.add(dom,
            div(button("New Button")),
            div(a({href: "https://www.example.com/"}, "This is a link")),
          )
        },
        "Button to Add More Elements"),
      button({onclick: () => alert("Hello from VanJS")}, "Hello"),
    ),
  )
  return dom
}

随手可得

无需任何安装、无需配置、无需第三方依赖、无需转译、无需 IDE 设置。要使用 VanJS 只需在脚本或 HTML 文件中添加一行代码即可开始编码。

import van from "./van-0.11.9.min.js"
// 要在没有 ES6 模块的情况下进行编码,可以下载打包版本 van-0.11.9.nomodule.min.js 
// 并将以下行添加到 HTML 文件中:
<script type="text/javascript" src="van-0.11.9.nomodule.min.js"></script>

VanJS 让开发者可以专注于应用程序的业务逻辑,而不是陷入框架和工具的泥潭。

超轻量

VanJS 是 Vanilla JavaScript 和 DOM 之上的一个非常薄的封装层,几乎不足以使 DOM 操作和状态绑定与 React 一样符合人体工程学(如果不超过),VanJS 将大部分工作委托给以本机代码实现的标准浏览器 API。

因此,VanJS 的包大小仅为 1.2kB,比大多数流行的 UI 框架小 100 多倍,只有 Preact 的体积1/10,如下图:

完美的实现,不是在没有什么可以添加的时候,而是在没有什么可以去掉的时候

TypeScript支持

VanJS 为 TypeScript 提供一流的支持。 只需将相应的 .d.ts 文件与 .js 文件一起下载,开发者就可以利用首选的开发环境提供的类型检查、IntelliSense 和大规模重构。下面是不同文件的功能说明。

 

简单易学

VanJS 非常强调框架的简单性。 API 中只有 4 个导出函数,感觉非常像 React。 因此,演练教程与完整的 API 参考相同,大多数开发人员可以在 1 小时内学会。

3.VanJS 高级特性之 Mini-Van

无需 JSX 的客户端、服务器端渲染的极简模板引擎,Mini-Van 是用于 DOM 组合和操作的超轻量级模板引擎。 Mini-Van 的最小包大小仅为 0.5kB,使开发者能够使用优雅且富有表现力的普通 JavaScript 代码构建全面的 UI。

Mini-Van 是 VanJS 的精简版,旨在提供一个基于纯 vanilla JavaScript 和 DOM 的超轻量级、零依赖、特立独行的 Reactive UI 框架。 与 VanJS 相比,Mini-Van 将 bundle 大小进一步降低到 0.5kB,并且可以在服务器端用作模板引擎。

服务器端:Npm 集成

Mini-Van 可以在服务器端用作模板引擎,为 HTTP 服务器渲染动态 Web 内容,借助于 NPM 包 mini-van-plate,可以在 Node.js 或 Bun 中使用。

目前服务器端集成有两种模式,即 van-plate 模式(基于文本模板,因此不需要 DOM 依赖)和 mini-van 模式(基于 DOM,因此需要 DOM 依赖)。

import http from "node:http"
import van from "mini-van-plate/van-plate"

const {a, body, li, p, ul} = van.tags
const hostname = '127.0.0.1'
const port = 8080
console.log("Testing DOM rendering...")
// 在控制台中生成`<a href="https://vanjs.org/">VanJS</a>`
console.log(a({href: "https://vanjs.org/"}, "VanJS").render())
const server = http.createServer((req, res) => {
  res.statusCode = 200
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  res.end(van.html(
    body(
      p("Your user-agent is: ", req.headers["user-agent"] ?? "Unknown"),
      p("Hello"),
      ul(
        li("️World"),
        li(a({href: "https://vanjs.org/"}, "VanJS")),
      ),
    ),
  ))
})
server.listen(port, hostname, () =>
  console.log(`Server running at http://${hostname}:${port}/`))

服务器端:Deno 集成

Mini-Van 也可以在 van-plate 模式和 mini-van 模式下与 Deno 一起使用。 Deno 模块已在 deno.land/x/minivan 发布。下面是van-plate模式代码:

import { serve } from "https://deno.land/std@0.184.0/http/server.ts"
import van from "https://deno.land/x/minivan@0.3.3/src/van-plate.js"

const {a, body, li, p, ul} = van.tags

const port = 8080

console.log("Testing DOM rendering...")
// 在控制台输出 `<a href="https://vanjs.org/">VanJS</a>` 
console.log(a({href: "https://vanjs.org/"}, "VanJS").render())

console.log(`HTTP webserver running. Access it at: http://localhost:${port}/`)
awAIt serve(req => new Response(
  van.html(
    body(
      p("Your user-agent is: ", req.headers.get("user-agent") ?? "Unknown"),
      p("Hello"),
      ul(
        li("️World"),
        li(a({href: "https://vanjs.org/"}, "VanJS")),
      ),
    ),
  ),
  {
    status: 200,
    headers: {"content-type": "text/html; charset=utf-8"},
  },
), {port})

在Mini-Van 模式下需要第 3 方 DOM 库来提供 Document 对象,下面是一个集成 deno-dom 的代码示例:

import { serve } from "https://deno.land/std@0.184.0/http/server.ts"
import { DOMParser } from "https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts"
import van from "https://deno.land/x/minivan@0.3.3/src/mini-van.js"
const document = new DOMParser().parseFromString("", "text/html")!
const {tags, html} = van.vanWithDoc(document)
const {a, body, li, p, ul} = tags

const port = 8080

console.log("Testing DOM rendering...")
const anchorDom = a({href: "https://vanjs.org/"}, "VanJS")
// anchorDom is an HTMLAnchorElement
// 在控制台输出 `<a href="https://vanjs.org/">VanJS</a>` 
console.log(anchorDom.outerHTML)
console.log(`HTTP webserver running. Access it at: http://localhost:${port}/`)
await serve(req => new Response(
  html(
    body(
      p("Your user-agent is: ", req.headers.get("user-agent") ?? "Unknown"),
      p("Hello"),
      ul(
        li("️World"),
        li(a({href: "https://vanjs.org/"}, "VanJS")),
      ),
    ),
  ),
  {
    status: 200,
    headers: {"content-type": "text/html; charset=utf-8"},
  },
), {port})

客户端集成

要在客户端使用,需要下载最新版本的 mini-van-0.3.3.min.js 并将以下行添加到脚本中:

import van from "./mini-van-0.3.3.min.js"

如果要在不支持 ES6 模块的情况下进行编码,可以下载打包好的版本
mini-van-0.3.3.nomodule.min.js 并将以下行添加到 HTML 文件中:

<script type="text/javascript" src="mini-van-0.3.3.nomodule.min.js"></script>

4.本文总结

本文主要和大家介绍号称世界上最小的响应式 UI 框架,即 VanJS。相信通过本文的阅读,大家对 VanJS 会有一个初步的了解。

因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!

 

参考资料

https://Github.com/vanjs-org/van

https://vanjs.org/demo

https://vanjs.org/minivan

https://vanjs.org/start



Tags:UI框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
OpenHarmony - 基于ArkUI框架实现日历应用
前言对于刚刚接触OpenHarmony应用开发的开发者,最快的入门方式就是开发一个简单的应用,下面记录了一个日历应用的开发过程,通过日历应用的开发,来熟悉基本图形的绘制,ArkUI的组件...【详细内容】
2024-01-16  Search: UI框架  点击:(54)  评论:(0)  加入收藏
最小响应式UI框架 VanJS 开源,仅 Preact 体积1/10!
今天给大家带来的主题是号称世界上最小的响应式 UI 框架,即 VanJS。话不多说,直接进入正题。1.什么是 VanJSVanJS(缩写为 Vanilla JavaScript)是一个基于纯 Vanilla JavaScript...【详细内容】
2023-05-22  Search: UI框架  点击:(663)  评论:(0)  加入收藏
抖音前端UI框架开源了,亮瞎我的钛合金!
抖音开源了一个前端UI框架-Semi-UI,还是不错的。大家可以了解下哈,等成熟了,可以用用。Semi-UI,现代、全面、灵活的设计系统和 UI 库。快速搭建美观的React 应用。github开源地...【详细内容】
2023-04-18  Search: UI框架  点击:(355)  评论:(0)  加入收藏
推荐一个.net core web ui框架 Kendo UI
是一套使用 jQuery、Angular、React 或 Vue 框架的 JavaScript Web 应用程序的 UI 组件库图1 先看对曲线图的绘制,上方是一个显示单元格。下面是绘制了多条线段曲线图。图1图...【详细内容】
2022-09-21  Search: UI框架  点击:(495)  评论:(0)  加入收藏
最佳UI框架的详细指南
用户界面是应用程序最重要的元素之一,它是用户对应用程序中的第一印象,它需要有吸引力,易于操作。因此,如果你对应用程序开发感兴趣,你必须选择最佳的UI框架,它能够提供出色的用户...【详细内容】
2022-09-08  Search: UI框架  点击:(351)  评论:(0)  加入收藏
微信小程序开发教程:WeUI一个专为微信小程序设计的UI框架
WeUI是什么WeUI 是一套同微信原生视觉体验一致的基础样式库。由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。它最初是为了给在微信端页面...【详细内容】
2021-03-08  Search: UI框架  点击:(684)  评论:(0)  加入收藏
基于阿里Ant Design构建的高颜值开源管理后台UI框架
继承 Ant Design 专业美观的优点,支持PC/手机/平板的响应式布局的优秀后台管理系统 UI 框架。关于 Artiely Vue AdminAnt Design 是阿里巴巴蚂蚁金服团队出品的前端 UI 组件...【详细内容】
2020-12-17  Search: UI框架  点击:(1083)  评论:(0)  加入收藏
EAdmin开箱即用的后台UI框架
相信大家用过不少的后台UI框架,这其中包含了使用了最新前端技术栈的vue-element-admin、基于Bootstrap 4.4框架以及JS / jQuery插件并完全响应的管理模板AdminLTE、具有漂亮...【详细内容】
2020-09-23  Search: UI框架  点击:(920)  评论:(0)  加入收藏
EAdmin - 开箱即用的后台UI框架
现在要写一个后台UI界面,要学的东西越来越多了。各种新的前端框架,让人应接不暇,而一些已有的CSS框架,需要额外写的组件逻辑又太多。有没有一个能够开箱即用,通过配置化的方式,就...【详细内容】
2020-09-02  Search: UI框架  点击:(804)  评论:(0)  加入收藏
AliOS Things内置的嵌入式GUI框架LittlevGL
AliOS Things 是 AliOS 家族旗下、面向 IoT 领域的、高可伸缩的物联网操作系统。物联网设备开发过程中,嵌入式GUI(用户图形界面)的开发是一个重要的组成部分。许多智能设备如...【详细内容】
2020-06-21  Search: UI框架  点击:(728)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(54)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(86)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条