【JadeView 2.0】打造火山视窗未来UI,新一代前端框架
本帖最后由 落雪有声 于 2026-5-15 23:45 编辑JadeView v2.0
基于 Rust 的下一代高性能 WebView 窗口库
全新 API 架构 | Python SDK2 | 系统托盘 | 全局热键 | 多显示器支持
极致轻量|零依赖|原生渲染|16ms 启动
DLL < 1 MB·无额外运行时·系统内置 WebView2·IPC < 1 ms
调用系统原生 WebView2(Edge 内核),无需打包浏览器引擎
支持 HTML/CSS/JS 构建桌面界面,DLL 体积不足 1 MB
资源与链接
[*]官方文档站:https://jade.run
[*]v2.0 API 预览:https://jade.run/api-2-preview
[*]Python SDK2 文档:https://jade.run/python-sdk2
[*]仓库:https://gitee.com/ilinxuan/JadeView_library/releases/tag/v2.0.0
[*] https://github.com/JadeViewDocs/library/releases/tag/v2.0.0
▌ 火山视窗SDK下载
[*]https://luoxue.lanzout.com/b0fpmq8bi
[*]注:SDK更新到 v2.0.1.26E06
▌ 快速概览
启动性能对比(不计算 HTML 加载时间)
测试环境:易语言下核心启动至窗口显示。来自 jade.run/spec/behavior 官方数据。
框架启动耗时核心架构
JadeView16 msRust + wry
Electron 231400 msChromium + Node.js
NW.js 0.70850 msChromium + Node.js
CEF / CefSharp数百毫秒Chromium
JadeView 完整启动流程(含加载 HTML 内容):约 300 ms
IPC 通信性能对比
框架往返延迟并发处理能力架构特点
JadeView< 1 ms> 800 请求/秒自定义协议 + Rust 实现
Electron 2310-50 ms~100 请求/秒Chromium + Node.js IPC
NW.js 0.708-40 ms~150 请求/秒Chromium + Node.js IPC
CEF / CefSharp5-30 ms~200 请求/秒Chromium IPC
IPC 性能优势:CPU 消耗降低 30%-50%,内存占用降低 20%-40%(相比传统 IPC 方案)
架构特点
[*]技术栈:Rust + wry(WebView)+ tao(窗口管理)+ tokio(异步运行时)+ serde(序列化)
[*]异步架构:初始化非阻塞;create_webview_window 立即返回 window_id,实际创建在事件循环线程中异步完成
[*]线程安全:所有 API 函数均为线程安全(互斥锁保护全局状态、无共享可变状态)
[*]IPC 协议:基于 Fetch API 的自定义协议,发布-订阅模式事件系统
[*]分层架构:核心层 → API 层 → SDK 层 → 应用层
[*]内存安全:Rust 所有权模型 + 自动内存释放,无直接 malloc/free 调用
▌ v2.0 升级指南
新增接口(14 个符号)
接口说明
create_borderless_webview_window创建无系统标题栏的 WebView 窗口
get_window_hwnd仅无边框窗口可通过此函数获取 HWND 供 Win32 API 使用
set_protocol_service_path替代旧版 create_local_server,将本地文件夹挂载为内置协议根
yaml_set / yaml_get在数据目录读写 YAML 配置
getPath / getLocale / get_displays_info获取常用系统路径、系统界面语言(BCP47)、多显示器信息
clear_data_directory清空本应用数据目录(需携带确认令牌)
jadeview_version读取 JadeView 自身版本字符串
register_url_scheme 等自定义协议注册 / 文件关联
register_global_hotkey 等全局热键,收到 global-hotkey 事件
系统托盘相关托盘图标、菜单、事件(见 SDK 文档 "系统托盘" 分栏)
API 变更对照
v1.x 旧接口v2.0 新接口说明
create_local_serverset_protocol_service_path本地文件夹挂载为内置协议根
remove_titlebar / borderless / no_centerframe_style + x/y=-1统一窗口边框样式
(新增)register_global_hotkey全局热键注册
(新增)register_url_scheme自定义协议注册
(新增)yaml_set / yaml_get内置 YAML 配置读写
(新增)get_displays_info多显示器信息查询
(新增)get_window_hwnd获取 Win32 HWND 句柄
(新增)系统托盘系列 API图标 / 菜单 / 通知 / 事件
破坏性变更
[*]字段移除:旧版 remove_titlebar、borderless、no_center 已移除,改用 frame_style 和 x/y=-1 居中;create_local_server 废弃,替换为 set_protocol_service_path
[*]初始化签名升级:JadeView_init 从旧版变为 6 参数(新增 app_name / app_signature / single_instance 必填)
[*]WebView 与窗口一一对应:统一暴露 window_id;navigate_to_url 等 API 均通过 window_id 标识目标窗口
[*]单实例模式:single_instance=1 时,第二次启动将命令行转发至已有实例,触发 second-instance 事件
[*]统一数据目录:默认为 %LOCALAPPDATA%\{app_signature}_data,作为 WebView2 会话与配置存储基准
▌ 核心 API 参考
WebViewWindowOptions — 窗口配置
字段顺序必须与 JadeView.h 一致,少填 / 多填 / 类型错位会导致静默读错内存。
字段说明
title窗口标题栏文字
width / height初始尺寸(像素)
resizable是否允许调整尺寸
frame_style边框样式:normal / no-titlebar / borderless / title-overlay(Windows 专属)
transparent是否透明背景
background_color窗口背景色(如 #1A1A2E)
theme主题:Light / Dark / System
maximized / fullscreen启动时最大化 / 全屏
x / y窗口坐标,均设 -1 时系统自动居中
always_on_top置顶显示
focus打开后是否获取键盘焦点
hide_window创建但不立即显示(预加载)
use_page_icon使用网页 favicon 作为窗口图标
content_protection 防录屏 / 截屏保护(v2.0 新增)
auto_save_state 自动记忆窗口位置和大小,450ms 防抖落盘(v2.0 新增)
min_width / min_height / max_width / max_height最小 / 最大允许尺寸
WebViewSettings — 网页行为控制
传 NULL 表示全用默认。
字段说明
autoplay媒体自动播放
background_throttling后台时降低定时器 / 动画频率(节能)
disable_right_click禁用网页右键菜单
ua自定义 User-Agent
preload_js页面加载前注入的 JavaScript 代码
allow_fullscreen允许网页使用全屏 API
postmessage_whitelistpostMessage 转发白名单,值为 UTF-8 字符串;event.origin 等于该字符串或其以此为后缀时放行;NULL 时不放行任何来源;set_protocol_service_path 加载的内置静态页不受此限制
核心 C 函数
JadeView_init — 初始化运行时
启动库内部的 GUI 线程和事件循环,登记应用名、数据目录、单实例设置。调用成功后,还需等 app-ready 事件。
纯文本查看 复制代码
int32_t JadeView_init(
int32_tenable_devmod, // 开发能力开关(DevTools 等),正式发布传 0
const char* log_path, // 日志文件路径;NULL = 不写文件
const char* data_directory, // 数据根路径;NULL = 系统默认位置
const char* app_name, // 应用显示名,必填,用于协议 / 通知等
const char* app_signature, // 应用唯一标识,必填,至少 6 字符
int32_tsingle_instance // 非 0:整机只允许一个进程;再开转发命令行
);
返回值:1 = 已启动 GUI 但未就绪,须等 app-ready;0 = 启动失败(参数错或作为第二实例被踢)。
app-ready 事件返回值
情况window_idevent_data
正常启动完成1文本 success
app_name / app_signature 校验失败0JSON:{"ok":false,"code":"...","message":"..."}
GUI 线程崩溃0纯文字错误说明
必须在 JadeView_init 之前就注册 app-ready(jade_on("app-ready", ...)),否则会漏掉第一条通知。
run_message_loop — 运行消息循环
在"exe 自己跑消息循环"的旧集成方式中可能用到。DLL 嵌入场景下,循环已在 JadeView_init 起好的线程中跑,一般不用调。
纯文本查看 复制代码
int32_t run_message_loop(void);
cleanup_all_windows — 清理全部窗口
关闭所有 JadeView 窗口、收尾资源、让事件循环结束,相当于退出前清理。
纯文本查看 复制代码
int32_t cleanup_all_windows(void);
// 返回值:1 = 已发起关闭与清理;0 = 失败(尚未完成初始化)
SDK 生态
SDK状态适用场景
Web SDK(JS/TS)稳定WebView 内的 IPC 通信接口(jade.invoke / jade.expose)
Python SDK2v2.0 新增ctypes 封装,支持窗口 / IPC / 托盘 / 通知 / 对话框
Python SDK稳定v1.x 绑定,窗口管理与 IPC 路由
易语言 SDK已更新专为易语言开发者设计,对接 v2.0 全量 API
火山视窗 SDK已更新窗口、WebView、IPC、托盘、通知和对话框完整支持
下载包文件
文件 / 目录说明
jadeview.dll核心运行时(< 1MB)
JadeView.hC 头文件,结构体声明(字段顺序以此为准)
sdk/web/Web SDK(JS/TS)
sdk/python/Python SDK(v1.x 绑定)
sdk/python2/ Python SDK2(v2.0 全新)
sdk/elanguage/易语言 SDK
sdk/volcano/火山视窗 SDK
docs/离线 API 文档
examples/各语言示例项目
▌ JAPK 打包格式
JAPK 是 JadeView 专属的应用资源包格式,将前端资源打包为单个 .japk 文件(签名效验机制,防篡改,隐私安全加密),分发简单、加载快速、支持混淆与签名。
打包方式
方式命令 / 工具内容保护签名适用场景
Electron ASARasar pack my-app app.japk明文无开发测试
JadePack(非签名)图形界面,一键构建XOR 混淆无基础保护需求
JadePack(签名)图形界面,勾选签名混淆 + 签名校验有生产环境,防篡改
加载方式
JadeView 通过 set_protocol_service_path API 加载 JAPK 包,API 返回协议 URL 用于 WebView 导航:
纯文本查看 复制代码
#include "jadeview.h"
void load_japk_example() {
char url_buffer;
const char* japk_path = "C:\\path\\to\\your\\app.japk";
int32_t result = set_protocol_service_path(
japk_path,
url_buffer,
sizeof(url_buffer)
);
if (result == 1) {
printf("协议 URL: %s\n", url_buffer);
// 使用 url_buffer 导航 WebView
}
}
注意:JadeView 完全兼容 Electron ASAR 格式,使用 @electron/asar 创建的包可直接加载。
打包前无需特殊配置文件,原始目录树结构会被保留。
▌ SDK 快速入门
<火山程序 类型 = "通常" 版本 = 1 />
包 火山.程序 <@视窗.附属文件 = "web_frame_style > web_frame_style">
类 启动类 <公开 基础类 = 程序类>
{
变量 Jade <类型 = JadeView>
变量 Jade托盘 <类型 = JadeView_托盘>
方法 启动方法 <公开 类型 = 整数>
{
Jade.置IPC频道回调 (本对象, "ipcChannelMessageCallback")// IPC频道消息 此为非静态回调方式
Jade.注册IPC通道 ("setTitlebarOverlayStyle")
Jade.订阅事件 (订阅_视图事件.请求新窗口)
如果 (Jade.初始化 (真, "", "", "JadeView火山示例", "jadeview.demo.app", 真) == 假)
{
返回 (0)
}
Jade.运行消息循环 ()
返回 (1)
}
方法 IPC频道消息 <公开 类型 = 文本型 注释 = "供 置IPC频道回调 匹配对象方法签名使用。返回空文本表示不回传;返回非空文本时桥接层会自动调用 jade_text_create。"
@强制输出 = 真 @输出名 = "ipcChannelMessageCallback">
参数 通道名 <类型 = 文本型>
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
调试输出 (取源方法名 (), 通道名, 窗口ID, 数据)
如果 (通道名 == "setTitlebarOverlayStyle")
{
变量 局_数据解析 <类型 = JSON对象类>
如果 (局_数据解析.创建自文本 (数据))
{
Jade.置标栏覆盖样式 (窗口ID, 局_数据解析.取整数值 ("height"), 局_数据解析.取文本值 ("icon_color"), 局_数据解析.取文本值 ("hover_bg"))
}
}
返回 ("")
}
#
方法 JadeView_应用就绪 <接收事件 类型 = 整数 注释 = "初始化阶段事件。默认会在 初始化() 内自动订阅。成功时数据通常为 success;失败时为错误文本或 JSON。返回值忽略。">
参数 来源对象 <类型 = JadeView 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
变量 窗口选项 <类型 = JadeView_窗口选项>
变量 视图选项 <类型 = JadeView_视图选项>
窗口选项.标题 = "Titlebar Overlay Demo"
窗口选项.左边 = -1
窗口选项.顶边 = -1
窗口选项.宽度 = 900
窗口选项.高度 = 700
窗口选项.可调整大小 = 真
窗口选项.使用页面图标 = 真
窗口选项.允许最小化 = 真
窗口选项.允许最大化 = 真
窗口选项.透明窗口 = 真
窗口选项.边框风格 = 边框风格.标题覆盖
窗口选项.主题 = 主题颜色.跟随系统
窗口选项.背景颜色 = "#f3f3f3"
窗口选项.内容保护 = 假
视图选项.允许全屏 = 真
视图选项.后台节流 = 真
视图选项.自动播放 = 真
视图选项.PostMessage白名单 = ""
变量 本地资源地址 <类型 = 文本型>
本地资源地址 = Jade.置协议服务目录 (取运行目录 () + "web_frame_style\\")
变量 主窗口ID <类型 = 整数>
主窗口ID = Jade.创建窗口 (本地资源地址, 0, 窗口选项, 视图选项)
}
返回 (0)
}
方法 JadeView_全部窗口已关闭 <接收事件 类型 = 整数 注释 = "全部窗口都关闭后触发。返回值忽略。">
参数 来源对象 <类型 = JadeView 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
参数 窗口ID <类型 = 整数>
{
如果 (来源对象 == Jade)
{
结束 ()
}
返回 (0)
}
方法 JadeView_请求新窗口 <接收事件 类型 = 整数 注释 = "可拦截事件。返回 1 表示拦截,返回 0 表示放行。">
参数 来源对象 <类型 = JadeView 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
参数 窗口ID <类型 = 整数>
参数 地址 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
调试输出 (取源方法名 (), 窗口ID, 地址)
返回 (1)// 返回 1 为拦截此事件
}
返回 (0)
}
}
JadeView — 让桌面开发回归简单
https://jade.run|v2.0 在线文档
点击链接加入群聊【易语言】jadeView前端UI:1103426302
本帖最后由 落雪有声 于 2026-5-25 14:10 编辑
2.1.0JAPK 内存载入 支持从内存直接加载 JAPK 包,无需本地文件系统,适用于将 JAPK 数据嵌入可执行文件或网络下载后直接使用。
应用包_加载字节集— 从内存加载 JAPK 包,自动检测魔数选择签名验证或解混淆路径
应用包_加载视窗文件资源
应用包_设置公钥 — 设置 Ed25519 公钥,调用后只接受 JAPK v2 签名包
应用包_是否加载 — 检查 JAPK 是否已成功加载
应用包_获取签名 — 获取当前加载包的应用标识
应用包_获取签名信息 — 获取签名信息 JSON(仅签名包)
应用包_卸载 — 清除加载状态并释放内存
JadeView_视图选项 新增字段
源站白名单 — IPC通讯白名单,逗号或分号分隔的域名列表(如 "http://198.18.0.1:8001, http://localhost:3000")。严格精确匹配,不支持通配符。设置后仅允许白名单内的来源跨域请求 JadeView 内部 API(invoke、on、dialog)。
火山修改内容:
更新了部分类名便于记忆
修改了部分函数名称,便于归类记忆
新增默认订阅:
应用包加载成功
应用包加载失败
SDK 下载 | JadeView
支持 很强{:2_37:} 111111 支持 浏览器套壳软件真的好用吗?我们**的一款软件就是浏览器套壳,跟老太太下楼一样,点个复选框时不时都失败 支持 Fang0x378 发表于 2026-5-15 21:41
浏览器套壳软件真的好用吗?我们**的一款软件就是浏览器套壳,跟老太太下楼一样,点个复选框时不时都失败 ...
你可以试试这个,我正式项目也开始用这个了 HTML做的界面确实好看,也方便,就是在火山里回调觉得挺麻烦,看看这个 :):):):):)
页:
[1]
2