Sciter.js 的前世今生

引言

发现很多人搞不清 sciter.js 还有 tis 还有各种各种。所以本文详细介绍了整个项目的前世今生。希望对大家有帮助。

Sciter 是一个跨平台的可嵌入 HTML/CSS/脚本引擎,用于构建桌面应用界面的解决方案。从早期的 HTMLayout 引擎起步,经过 TIScript 脚本时代的 Sciter.TIS ,演进到采用现代 JavaScript 引擎的 Sciter.JS。这一过程中,Sciter 引擎的架构、功能和API都经历了重大发展变化。

Andrew Fedoniouk:背景与项目起源

Andrew Fedoniouk (网名 c-smile )是 Sciter 引擎的创造者和主要开发者,俄罗斯的大佬。他拥有应用物理与数学的硕士学位,并有艺术文凭背景。这种跨领域背景使他既具备深厚的技术功底,又懂得用户界面设计的艺术。他早年参与了 W3C HTML5 规范的制定工作,担任特邀专家,就是它提出了 "Flexible Flow" 等布局方案 ;该灵活流式布局后来在他的 HTMLayout 和 Sciter 引擎中实现。在职业生涯早期,Andrew 还是知名笔记应用 EverNote 初期的三位开发者之一,负责其中 HTML 笔记渲染和所见即所得编辑模块的开发。这种经验使他深刻认识到采用 HTML/CSS 技术构建桌面富客户端界面的潜力和挑战,也直接促成了 Sciter 系列项目的构思。

开发动机: 2000年代中期,Web 技术开始用于富客户端界面,但彼时可用的嵌入式浏览器内核方案有限。例如,Internet Explorer 的 MSHTML 内核仅限 Windows,Mozilla Gecko/WebKit 等浏览器内核体积庞大、嵌入复杂。Andrew 希望打造一款轻量级、高性能且易于嵌入 的UI引擎,让开发者能使用熟悉的 HTML/CSS 构建桌面应用界面,而无需承受完整浏览器的开销。他在讨论 CSS 提案时曾强调过自行研发引擎的优势(例如他认为自制的 Canvas 实现"更简单、更高效、且无版权限制")。基于这种理念,Andrew 于 2003-2005 年 左右开始开发自己的 HTML/CSS 渲染核心(代号 H-SMILE),为后来的 HTMLayout 引擎奠定基础)。

HTMLayout 时代:嵌入式 HTML/CSS 引擎的起步 (2003-2007)

HTMLayout 是 Sciter 项目的前身,大约诞生于 2003-2005 年 间。它定位为一个轻量级浏览器引擎 ,能高效解析和渲染 HTML 与 CSS,用于应用程序的UI层。当时尚无成熟的开源浏览器内核,HTMLayout 提供了几乎完整的 HTML4/XHTML 支持和 CSS2.1 标准,并针对界面开发扩展了许多实用特性。但其设计目标不是通用浏览器,而是专注桌面应用UI,因此在标准兼容性上做出了取舍:精简了一些不常用于应用界面的网页特性,增加了如富文本编辑、灵活布局等桌面所需功能。这使得 HTMLayout 相较完整浏览器内核更加轻量,也更贴合桌面富客户端需求。

技术上,HTMLayout 最初主要支持 Windows 平台,使用 GDI/GDI+ 进行渲染。在架构 上,它包含自研的 DOM 实现和渲染布局引擎(H-SMILE 核心),但早期的 HTMLayout 不包含内置的脚本引擎 。这意味着应用需要通过原生代码与界面交互(例如通过C++回调处理事件),或者嵌入外部脚本环境。当时 Andrew 也在探索使用 D 语言实现无窗口GUI框架(代号 Harmonia)的可能性,但最终 HTMLayout 路线获得了更多关注。

HTMLayout 的局限: 由于缺乏通用脚本引擎支持,早期 HTMLayout 的交互逻辑需要大量依赖宿主应用代码,不如网页那样灵活。此外,它最初仅支持 Windows,无法跨平台使用。随着 Web 技术的发展,HTML/CSS 新特性(如 CSS3)和更复杂的脚本需求逐渐出现,HTMLayout 在功能扩展上遇到了瓶颈。Andrew 意识到,需要引入脚本能力和更先进的渲染机制来提升引擎的适用性。

尽管如此,HTMLayout 在 2006 年左右已经在一些商业软件中投入使用。它因体积小、嵌入简单而受到欢迎,迄今已有数千万PC上安装的应用使用了 HTMLayout/早期Sciter 技术。这些实践经验为引擎下一步的改进提供了依据。

Sciter.TIS 时代:引入 TIScript 脚本和跨平台支持 (2007-2019)

为了突破 HTMLayout 的局限,Andrew 于 2007 年 设计了专用的脚本语言 TIScript (Terra Informatica Script)。TIScript 是对 JavaScript 的一种温和扩展,它保留了JS的大部分语法和特性,并增加了诸如类定义等高级功能。2007-2008 年 ,HTMLayout 集成了 TIScript 作为内置脚本引擎,实现了界面逻辑的脚本化。这标志着 HTMLayout 向下一代 Sciter 的演进。Sciter.TIS(一般直接称为 Sciter)指的就是采用 TIScript 作为脚本的 Sciter 引擎版本。

Sciter vs HTMLayout: Sciter 可以看作 HTMLayout 的下一代主要版本。相较前者,Sciter 增强和新增了以下关键能力:

  • 完整的脚本支持: 集成 TIScript 解释器,使UI可以用类JavaScript语言编写交互逻辑。这使得界面组件可以封装为可复用的脚本行为(behavior)。开发者能够在HTML中直接编写脚本处理事件、操作DOM,而不必每件小事都回调C++代码。TIScript 语法上是 JavaScript 的超集,支持原型继承和增强的类结构。它被设计为轻量级脚本引擎,适合嵌入式场景。
  • 跨平台图形支持: Sciter 扩展到 Windows、macOS 和 Linux 。Andrew 对渲染层做了抽象适配:在 Windows 上利用 Direct2D/DirectX (XP下退化为GDI+),在 macOS 上使用 CoreGraphics,在 Linux 上使用 Cairo 图形库。同时,引擎加入了 GPU 硬件加速 支持,在支持的系统上利用GPU提升界面绘制性能。这大大提高了引擎在复杂UI和动画场景下的性能。
  • 更新的Web标准支持: Sciter 支持了 HTML5 级别 的大部分元素,完全实现了 CSS 2.1 ,并择取性地实现了常用的 CSS3 特性。此外,Andrew 加入了一些自定义的 CSS 扩展以满足桌面UI需求,如 flex 布局单元、各种布局管理器等。这些扩展很多源自他在 W3C 提案中的构想(如灵活流式布局),使开发者能够用简洁的CSS描述复杂的界面布局和自适应行为(ps:作者讲有一套更好的理论,最后他们已经改不动了,所以只在 sciter 中有这个布局的实现。)。
  • UI组件与行为: Sciter 引入了 Behaviors 概念,即用脚本定义可附加到DOM元素的行为逻辑。例如,可以用 TIScript 创建自定义控件的行为处理输入、拖拽等事件。这类似于浏览器中的自定义元素/组件思想。在 Sciter SDK 示例中,包括时钟、小窗口拖动等行为的 TIScript 脚本实现。通过 Behavior 机制,Sciter 实现了一系列桌面常用控件扩展,例如 <input type=number>、树形下拉框<select type=tree>、遮罩输入框<input type=masked>等,超出了标准HTML表单控件的能力。

综上,Sciter (TIS) 相比 HTMLayout 已经是功能完整的嵌入式 UI 引擎,能够满足复杂桌面应用的UI需求。"Sciter API 是 HTMLayout API 的超集"------很多 HTMLayout 的嵌入接口在 Sciter 中依然适用,保证了原有应用的平滑升级。同时新增的 API 覆盖了脚本通信、窗口管理等领域。例如,Sciter 提供C/C++接口让宿主应用可以与 TIScript 交换数据、调用函数;并提供了创建图形窗口、加载 HTML 内容的简化接口。

引擎架构演进: 在这个阶段,Sciter 的内核架构日趋成熟。它由布局渲染引擎 (解析HTML/CSS并构建DOM和渲染树)、脚本引擎 (TIScript)、平台适配层(封装操作系统窗口和图形接口)组成。值得注意的是,Sciter 并未包含网络协议栈或浏览器全部特性,例如没有内置HTTP加载器(资源加载通常由宿主应用提供回调)也没有浏览器地址栏、导航等。这样的架构选择使其更加精简、安全,适合作为应用内的UI模块。

Sciter TIS时代的局限: 尽管 Sciter (TIS) 功能强大,但随着 Web 技术的继续发展,它也面临一些挑战:首先,TIScript 并非标准 ,这意味着 Web 开发者需要学习 Sciter特有的脚本特性,现有大量流行的 JS 库不能直接拿来使用。其次,ES6/ES2015 以后 JavaScript 发生了巨大变化(如箭头函数、模块、Promise等),而 TIScript 的更新相对闭源且节奏缓慢,一些现代特性可能不支持或语义不同。社区反馈中,有开发者尝试在 Sciter 上运行流行框架(如 React)时遇到兼容性问题,需要针对 Sciter 做修改。另外,Sciter 长期闭源仅提供预编译库,这也限制了社区参与度。为扩大影响力、紧跟技术演进,Andrew 萌生了引入标准 JavaScript 引擎并开源的想法。

Sciter.JS 时代:拥抱现代 JavaScript (2020-至今)

Sciter.JS 是 Sciter 引擎的最新阶段,它用现代 JavaScript 引擎 替代了 TIScript,并在2020年代初正式推出。其核心设计目标是在保持 Sciter 原有优势(小巧、高性能、跨平台)的同时,对开发者更友好:直接支持标准 ES2020 JavaScript,让 Web 开发者能零门槛编写界面逻辑。为此,Andrew 选择集成由 Fabrice Bellard 等开发的QuickJS引擎作为 Sciter 的脚本运行时。QuickJS 是一款轻量但支持现代 JS 特性的引擎,性能和体积非常适合嵌入式场景。Sciter.JS 也因此得名,即"Sciter with JavaScript"。

诞生与开源: 2020 年 10 月,Andrew 在 Hacker News 等社区宣布启动 Kickstarter 众筹 ,希望筹集资金将 Sciter/Sciter.JS 开源并持续改进。这一消息引起了开发者的关注,因为此前 Sciter 虽然免费供开发使用,但源代码未公开且采用商业授权。众筹最后失败,所以现在还是现在这种私有代码,软件费用使用,商业公司可以付费可以得到支持与实时更新的源代码,Andrew 在 2021 年 加速了 Sciter.JS 的开发。同年末,他公开发布了 "Sciter------5MB 的 Electron 替代品,现已切换为 JavaScript"的声明, 宣告 Sciter 正式进入 JS 时代。Sciter 引擎自此以 BSD 3-Clause许可开源。这对于扩大社区和吸纳贡献具有里程碑意义。

Sciter.JS 的新特性:

  • 标准 JavaScript 支持: Sciter.JS 内置的 QuickJS 引擎完整支持现代 ECMAScript 标准,包括 ES6+ 语法(如 => 箭头函数、class 类、模块)、Promise/async 等异步特性,以及 Map/Set 等新原生对象。开发者无需再学习 TIScript 的差异,可以直接使用熟悉的 JS 语法和工具链。这极大降低了使用门槛,适配性也更好------大量现有 JS 库可以更容易地移植到 Sciter 环境下运行。
  • JSX 与前端框架适配: Andrew 针对界面开发,对 QuickJS 做了一些扩展。例如,原生支持 JSX 语法,以便更简洁地描述UI组件;引擎还直接提供了 Element.patch() 等DOM方法,实现了内置的虚拟DOM diff与组件生命周期机制。借助这些扩展,开发者几乎可以在 Sciter.JS 中使用 React 的全部功能,无需引入 React 库。实际上,Sciter.JS 内置了一个轻量的响应式框架 ("Sciter Reactor "),支持使用 JSX 构建组件式界面,与 React 的思想类似。这些努力旨在让 Sciter 更加贴近 Web 开发主流生态,尽可能兼容现有前端理念。
  • 性能与体积优化: 得益于 QuickJS,Sciter.JS 即便支持完整 JavaScript,其库文件仍保持在 ~4-5MB 级别,非常轻量。QuickJS 执行效率高,且可以在启动时将字节码预编译,这使 Sciter.JS 在加载和运行脚本时具备出色的性能。Andrew 在几个月内成功集成并优化了这一新引擎,其开发效率之高令社区赞叹。此外,Sciter.JS 仍保持不依赖外部浏览器内核、无需安装运行时的优点------发布应用时只需打包一个 Sciter.dll/so。
  • 持续的引擎改进: 进入 Sciter.JS 时代后,Andrew 继续对引擎核心进行升级。例如,引入 Sciter.Lite 等概念提供更裁剪的构建、改进图形模块支持 SVG/Canvas 等、更完善的调试工具(Inspector)等。同时,官方为 Sciter.JS 提供了更丰富的文档和示例工程,帮助开发者上手。例如 C++ 封装的 sciter::window 类用于快捷创建窗口并加载界面,多语言绑定(如 Go-sciter , Python-pysciter , Rust-sciter 等)也随之更新适配 Sciter.JS。

API 与兼容性: 由于更换了脚本引擎,Sciter.JS 在 API 上做了一定调整但总体保持兼容:

  • 对于嵌入 API (C/C++ 接口),大部分函数命名和用法延续了 Sciter.TIS,只是内部实现改为 QuickJS。例如,加载 HTML 的 SciterLoadFile, 与宿主交互的 SciterSetCallback 等仍沿用。开发者可以很容易地将原有应用切换到新版引擎。Sciter.JS 仍提供类似 Value 类型来封装脚本数据、DOM 操作接口等,只是其内部对应 QuickJS 的数据结构。官方指出 Sciter.JS 的 API 是 Sciter.TIS API 的超集或延续。
  • 对于脚本层 API ,由于 TIScript 和标准 JS 在细节上有差异,某些脚本接口有所调整。例如,过去 TIScript 中的全局对象、类定义方式在 JS 中可能不同,需要相应替换。另外 TIScript 自带的一些原生类(如字典、数组扩展方法)在 Sciter.JS 中则被标准 JS 自带功能取代。不过 Sciter 框架提供的 $(), View, Window 等脚本接口基本不变,只是实现移植到新的JS引擎上。为了帮助旧用户过渡,Andrew 在文档中详细列出了 TIScript 与 JavaScript 的区别,以及如何迁移现有代码。

总的来说,Sciter.JS 的推出达到了预期效果:开发者反映新版本对现代前端技术的兼容性大大提高,能够直接运用诸如 TypeScript、Rollup/Webpack 等工具来开发 Sciter 应用前端。在保持引擎高效小巧的同时,Sciter.JS 为项目带来了更广阔的社区与生命力。

引擎架构的演进概览

随着三个阶段的发展,Sciter 引擎的架构逐步演进成熟:

  • HTMLayout 阶段架构: 单平台(Windows)+ 自研HTML/CSS解析 + 无内置脚本。重点在于布局和渲染内核的实现,如树状DOM结构和布局算法。Andrew 在这一阶段奠定了引擎的基础,比如采用流式布局和盒模型渲染 pipeline,为后续添加特性留出接口。
  • Sciter.TIS 阶段架构: 跨平台 + 集成 TIScript 脚本 + GPU 渲染支持。引擎被拆分为核心渲染模块脚本虚拟机 模块,两者通过内部 API 交互。DOM 元素可以在脚本中以对象形式操作,脚本引擎通过绑定将宿主C++对象(元素、UI事件等)映射为脚本对象。这一架构类似浏览器的 DOM-BOM 与 JS 引擎交互,但规模更小且封闭。引擎还增加了平台抽象层,使同一套代码可以编译到不同OS并调用各自底层绘图/窗口API。
  • Sciter.JS 阶段架构: 更换脚本引擎为 QuickJS + 增强 DOM 扩展。由于 QuickJS 的加入,脚本运行效率和标准兼容性提升,但也带来更复杂的内存管理(QuickJS 有自己的垃圾回收)。Andrew 对此进行了良好集成,保证了DOM对象和脚本对象生命周期的一致性。此外,Sciter.JS 模块化地加入了一些可选组件(如 Sciter.Quark 项目,用于打包应用资源),使引擎架构更模块化、易扩展。例如"Sciter Quark"用来将HTML/CSS/JS打包成单文件应用。总体而言,Sciter 当前架构已经非常完备,既能支持桌面,也在尝试布局到移动和物联网场景(针对移动和 IoT 的适配)。

GitHub 关停与迁移 GitLab

迁移背景: Sciter 项目在开源初期托管于 GitHub(用户名 c-smile )。然而在 2022 年 3 月 前后,Andrew 遭遇了 GitHub 平台的账户或项目封禁俄罗斯帐号的情况。。当时正值 Sciter 开源不久,此事引发了关注。为保障项目持续发展,Andrew 在 2022年3月21日 注册了 GitLab 账户​gitlab.com并将 Sciter 的所有仓库迁移到了 GitLab 平台。

关停原因: Andrew 本人在社区中提到,当时 github 封禁了一批俄罗斯开发者​github-suspends-accounts-of-russian-devs。项目不想被任何政治影响;也可能由于老哥是苏联军工出生,论坛聊过他开导弹车喝酒之类的事情。当时正值俄乌冲突的多事之秋。所以迁移到了非美国主导的服务。

迁移过程与反应: Andrew 将原本在 GitHub 上的源码仓库(如 sciter-sdk, sciter-js-sdk 等)全部迁入 GitLab,并在 GitHub 留下说明,指出项目已迁移。例如,他在 GitHub 上的README中注明:"Sciter.TIS 开发已停止,请访问 GitLab 上的 Sciter.JS SDK"。他也在 GitHub issue 回复中明确告知提问者"Sciter 仓库已移至 GitLab"。社区层面,许多关注者随即转向新的 GitLab 仓库。幸运的是,项目开源时间尚短,迁移成本不算高。大部分 Sciter 的语言绑定和社区贡献者也迅速地更新了链接,继续在 GitLab 平台协作。有开发者在讨论区对 GitHub 此举表示质疑,但总的来说社区对迁移表现出了支持态度,也对 Andrew 能迅速恢复项目表示欣慰。

现状: 目前 Sciter 的官方代码仓库和Issue跟踪均在 GitLab(组织名为 sciter-engine )下运行。项目在 GitLab 上保持活跃更新,定期发布新版(今年 2015 年发布了 6.x 系列版本,基本每周一个更新)。虽然经历了平台变更,Sciter 的用户群并未受到明显影响,反而因为开源和拥抱标准JS赢得了更多开发者的认可。一些经典应用(如游戏 WarThunder 界面、Norton安全产品UI、Avast杀毒UI等)依然使用 Sciter 技术作为嵌入式界面引擎。Andrew 和社区也在 GitLab 平台延续着 Sciter 的开发之旅。

结语

HTMLayoutSciter.TIS 再到 Sciter.JS ,这个项目的演进见证了桌面应用界面开发从专有技术走向 Web 标准融合的历程。每个阶段的技术演进都凝聚了 Andrew Fedoniouk 对界面技术的深刻思考和大胆实践:他在早期自主实现浏览器渲染引擎,为桌面应用带来了 Web 的灵活性;通过 TIScript 提供脚本能力,填补了浏览器内核的空白;最终顺应时代引入标准 JavaScript,引擎开放源代码,与开发者社区共同前进。这一路,Sciter 引擎的架构愈加健壮,API 日臻完善,已经成为许多开发者打造跨平台富客户端的利器。Andrew 本人的背景和经历------从 EverNote 初创到 W3C 标准制定,再到独立开发 Sciter ------更为这一项目增添了传奇色彩。展望未来,随着 Sciter 在新平台和新领域的探索,我们有理由期待这一 "迷你版浏览器内核" 将继续在富客户端开发领域发挥独特作用,为开发者带来便利和创新。

相关推荐
桂月二二1 分钟前
Vue3服务端渲染深度实战:SSR架构优化与企业级应用
前端·vue.js·架构
萌萌哒草头将军2 分钟前
🚀🚀🚀 这六个事半功倍的 Pinia 库,你一定要知道!
前端·javascript·vue.js
_一条咸鱼_3 分钟前
深入剖析 Vue 状态管理模块原理(七)
前端·javascript·面试
rocky19113 分钟前
谷歌浏览器插件 录制动态 DOM 元素
前端
谁还不是一个打工人16 分钟前
css解决边框四个角有颜色
前端·css
海晨忆1 小时前
【Vue】v-if和v-show的区别
前端·javascript·vue.js·v-show·v-if
1024小神2 小时前
在GitHub action中使用添加项目中配置文件的值为环境变量
前端·javascript
齐尹秦2 小时前
CSS 列表样式学习笔记
前端
Mnxj2 小时前
渐变边框设计
前端
用户7678797737322 小时前
由Umi升级到Next方案
前端·next.js