0.1.0 发布说明
第一个公开版本。内核(YSU)与外壳(Vexo)都还没到功能完整的状态,但整条链路是通的:给一个网址,它取回来、排版、画到屏幕上,可以滚动、可以点链接、可以开多个标签页、可以打开本地文件。
第一个公开版本。内核(YSU)与外壳(Vexo)都还没到功能完整的状态,但整条链路是通的:给一个网址,它取回来、排版、画到屏幕上,可以滚动、可以点链接、可以开多个标签页、可以打开本地文件。
这一版有什么
渲染内核 YSU。 HTML 词法与树构建跟着 WHATWG 规范走,字符引用是完整表(2231 条具名实体,从规范的 entities.json 生成,含数字引用与 Windows-1252 的 C1 映射)。CSS 词法、选择器、层叠、继承、计算样式各自成模块。布局有块级、行内、文本、弹性、表格。绘制产出显示列表,渲染器是 wgpu 的两条实例化管线。
外壳 Vexo。 C++17 与 Qt6。工具栏、地址栏、标签栏、状态栏都是 Qt 部件。视口部件把内核交出的像素贴到屏幕上。
C ABI。 26 个 extern "C" 函数,静态库产出。边界上只有像素,外壳碰不到 wgpu。
脚本引擎 JSE。 词法与语法分析完成,ast::dump 能把语法树按可断言的格式导出。执行部分还没有。
功能一览
| 能力 | 状态 |
|---|---|
| 打开网址 | ✅ HTTP/1.1 与 HTTPS,跟随重定向 |
| HTML 解析与树构建 | ✅ 含插入模式、收养机构、外来内容 |
| CSS 解析与选择器匹配 | ✅ 含 :is()、:where()、:not()、:nth-child() 系列 |
| 层叠与继承 | ✅ 来源顺序、!important、内置默认样式表 |
| 块级与行内布局 | ✅ 含外边距合并、auto 外边距居中 |
| 弹性布局 | ✅ 单行 |
| 表格布局 | ✅ 列宽按内容求解 |
| 文本排版 | ✅ 断行、对齐、空白处理,由 cosmic-text 整形 |
| 绘制与渲染 | ✅ 背景、边框、圆角、文字、裁剪 |
| 外部样式表 | ✅ 逐个取回并应用 |
| 标签页、导航、缩放 | ✅ |
| 打开本地文件 | ✅ 命令行、拖放、文件对话框 |
| 本地文件里的外部样式表 | ✅ 从磁盘读 |
| 网页脚本 | ❌ <script> 不执行 |
| 图片 | ❌ 不显示 |
| 浮动与定位 | ❌ 不生效 |
| 书签、下载、设置、开发者工具 | ❌ |
需要知道的取舍
渲染按需进行。 滚动、加载完、改尺寸、改缩放时才画一次,空闲时一帧都不画。改状态之后忘了请求重绘,界面就会停在那里不动——写外壳代码时容易踩。
外壳必须链对静态库。 改了 C ABI 的签名之后要重新构建 libysu_capi.a。链到旧库会在启动时被版本号拦下,弹窗退出。
一次只有一份文档在渲染。 每个标签页有自己的内核实例,各自付各自的渲染代价。标签开多了内存会涨,没有共享。
没有连接池。 每取一个资源都是一条新连接,取完就断。取很多小样式表的页面会慢。
没有压缩传输。 请求不发 Accept-Encoding,也不解 gzip。对端返回未压缩内容,流量比主流浏览器大。
没有缓存。 刷新会重新取。
内核能力的边界
按特性分类的支持情况在支持范围,表现为「看着该动却没动」的那些在已知限制。两条值得在这里点出来:
position 能解析进计算样式,但布局阶段从不读它——absolute 与 fixed 都按常规流处理。float 连字段都没有。
<img> 不产生任何替换内容,background-image 不生效。DrawCommand::Image 这个变体有定义,但没有任何地方生产它。
构建
Linux x86_64 上验证通过。需要 Rust 1.98.1、CMake 3.16 以上、Qt6 的 Core / Gui / Widgets。步骤见准备环境。
Windows 与 macOS 上的 Rust 侧应当可以直接构建,外壳那层没有验证过。见其他平台的构建。
下一个版本的方向
让 <script> 跑起来,把 JSE 接进内核:定义宿主接口、在 YSU 里实现它、接上事件体系。图片的采集、解码、固有尺寸、纹理上传这条链也是一整块空白。
position 与 float 是布局层最明显的两个洞——它们不补上,很多真实页面的版式就是错的。表格的 colspan / rowspan 和边框合并同理。