1.1 Sciter概述
什么是Sciter?
Sciter是一个嵌入式HTML/CSS/脚本引擎,专为桌面应用程序开发而设计。它由Andrew Fedoniouk开发,旨在为开发者提供一种使用Web技术创建原生桌面应用的解决方案。
核心特性
1. 轻量级架构
- 小体积:整个引擎只有几MB大小
- 低内存占用:运行时内存使用效率高
- 快速启动:应用启动速度快
2. 现代Web标准支持
- HTML5:支持现代HTML标准
- CSS3:完整的CSS3特性支持
- Flexbox/Grid:现代布局系统
- 动画:CSS动画和过渡效果
3. 强大的脚本引擎
- TIScript:Sciter专用的脚本语言
- JavaScript兼容:支持大部分JavaScript语法
- 原生API:直接访问系统功能
4. 跨平台支持
- Windows:完整支持所有Windows版本
- macOS:原生macOS应用支持
- Linux:支持主流Linux发行版
Sciter vs 其他技术
特性 | Sciter | Electron | Qt | WPF |
---|---|---|---|---|
体积 | 小(~5MB) | 大(~100MB+) | 中等 | 中等 |
性能 | 高 | 中等 | 高 | 高 |
学习曲线 | 平缓 | 平缓 | 陡峭 | 陡峭 |
Web技术 | ✓ | ✓ | ✗ | ✗ |
跨平台 | ✓ | ✓ | ✓ | ✗ |
系统集成 | 优秀 | 良好 | 优秀 | 优秀 |
1.2 环境搭建
系统要求
Windows
- Windows 7 SP1 或更高版本
- Visual Studio 2015 或更高版本(可选,用于C++开发)
- .NET Framework 4.5+(用于.NET绑定)
macOS
- macOS 10.12 (Sierra) 或更高版本
- Xcode 9.0 或更高版本(可选,用于原生开发)
Linux
- Ubuntu 16.04+ / CentOS 7+ / Debian 9+
- GCC 5.4+ 或 Clang 3.8+
- GTK+ 3.0+
下载Sciter SDK
1. 官方下载
访问 Sciter官网 下载最新版本的SDK。
2. GitHub下载
git clone https://github.com/c-smile/sciter-sdk.git
cd sciter-sdk
3. SDK结构
sciter-sdk/
├── bin/ # 可执行文件和库
│ ├── windows/
│ ├── macosx/
│ └── linux/
├── include/ # C/C++ 头文件
├── samples/ # 示例代码
├── doc/ # 文档
└── tools/ # 开发工具
开发工具安装
1. Sciter Inspector
Sciter Inspector是官方提供的调试工具,类似于浏览器的开发者工具。
Windows安装:
# 下载并运行安装程序
sciter-sdk\bin\windows\inspector.exe
macOS安装:
# 复制到应用程序文件夹
cp -r sciter-sdk/bin/macosx/inspector.app /Applications/
Linux安装:
# 添加执行权限
chmod +x sciter-sdk/bin/linux/inspector
# 创建符号链接(可选)
sudo ln -s $(pwd)/sciter-sdk/bin/linux/inspector /usr/local/bin/sciter-inspector
2. 代码编辑器配置
VS Code配置:
- 安装Sciter扩展:
json { "recommendations": [ "sciter.sciter-tiscript", "sciter.sciter-html" ] }
2. 配置文件关联:json { "files.associations": { "*.htm": "sciter-html", "*.html": "sciter-html", "*.tis": "tiscript" } }
Sublime Text配置:
- 安装Package Control
- 安装Sciter语法高亮包
- 配置构建系统:
json { "shell_cmd": "sciter \"$file\"", "file_regex": "^(.+?):(\\d+):(\\d+): (.+)$", "selector": "source.html.sciter" }
### 第一个Sciter应用 #### 1. 创建项目结构 “`
my-first-app/ ├── main.htm # 主HTML文件 ├── styles.css # 样式文件 ├── script.tis # 脚本文件 └── app.exe # 可执行文件(Windows)
#### 2. 主HTML文件 (main.htm)
```html
<!DOCTYPE html>
<html>
<head>
<title>我的第一个Sciter应用</title>
<style>
@import url(styles.css);
</style>
<script type="text/tiscript">
include "script.tis";
</script>
</head>
<body>
<div class="container">
<h1>欢迎使用Sciter!</h1>
<p>这是你的第一个Sciter桌面应用程序。</p>
<div class="button-group">
<button id="hello-btn">点击我</button>
<button id="close-btn">关闭应用</button>
</div>
<div id="message" class="message hidden">
<p>Hello, Sciter World!</p>
</div>
</div>
</body>
</html>
3. 样式文件 (styles.css)
/* 全局样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #333;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.container {
background: white;
padding: 40px;
border-radius: 10px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
text-align: center;
min-width: 400px;
}
h1 {
color: #4a5568;
margin-bottom: 20px;
font-size: 2.5em;
}
p {
color: #718096;
margin-bottom: 30px;
font-size: 1.1em;
}
.button-group {
display: flex;
gap: 15px;
justify-content: center;
margin-bottom: 20px;
}
button {
padding: 12px 24px;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 600;
}
#hello-btn {
background: #4299e1;
color: white;
}
#hello-btn:hover {
background: #3182ce;
transform: translateY(-2px);
}
#close-btn {
background: #e53e3e;
color: white;
}
#close-btn:hover {
background: #c53030;
transform: translateY(-2px);
}
.message {
background: #f0fff4;
border: 2px solid #68d391;
border-radius: 6px;
padding: 15px;
margin-top: 20px;
transition: all 0.3s ease;
}
.message.hidden {
display: none;
}
.message p {
color: #2f855a;
margin: 0;
font-weight: 600;
}
/* 动画效果 */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.message:not(.hidden) {
animation: fadeIn 0.3s ease;
}
4. 脚本文件 (script.tis)
// TIScript 代码
// 应用初始化
function self.ready() {
// 绑定按钮事件
$("#hello-btn").on("click", function() {
showMessage();
});
$("#close-btn").on("click", function() {
closeApplication();
});
// 设置窗口属性
view.windowState = View.WINDOW_SHOWN;
view.windowCaption = "我的第一个Sciter应用";
stdout.println("应用已启动!");
}
// 显示消息
function showMessage() {
var messageDiv = $("#message");
if (messageDiv.hasClass("hidden")) {
messageDiv.removeClass("hidden");
// 3秒后自动隐藏
view.timer(3000, function() {
messageDiv.addClass("hidden");
return false; // 停止定时器
});
} else {
messageDiv.addClass("hidden");
}
}
// 关闭应用
function closeApplication() {
// 显示确认对话框
var result = view.msgbox(#question, "确认关闭", "确定要关闭应用程序吗?");
if (result == #yes) {
view.close();
}
}
// 窗口事件处理
function self.closing() {
stdout.println("应用正在关闭...");
return false; // 允许关闭
}
// 键盘事件处理
function self.onKey(evt) {
if (evt.keyCode == Event.VK_ESCAPE) {
closeApplication();
return true; // 事件已处理
}
return false;
}
// 工具函数
namespace Utils {
// 获取当前时间
function getCurrentTime() {
var now = new Date();
return now.toLocaleString();
}
// 显示通知
function showNotification(message, type = "info") {
var notification = {
message: message,
type: type,
timestamp: getCurrentTime()
};
stdout.println("通知: " + notification.message);
return notification;
}
// 延迟执行
function delay(ms, callback) {
view.timer(ms, function() {
callback();
return false;
});
}
}
// 导出工具函数到全局
self.Utils = Utils;
运行应用
方法1:使用Sciter可执行文件
# Windows
sciter-sdk\bin\windows\sciter.exe main.htm
# macOS
sciter-sdk/bin/macosx/sciter main.htm
# Linux
sciter-sdk/bin/linux/sciter main.htm
方法2:使用Inspector调试
# 启动Inspector并加载文件
inspector main.htm
方法3:创建独立可执行文件
Windows批处理文件 (run.bat):
@echo off
set SCITER_PATH=%~dp0sciter-sdk\bin\windows
"%SCITER_PATH%\sciter.exe" "%~dp0main.htm"
pause
Linux Shell脚本 (run.sh):
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCITER_PATH="$SCRIPT_DIR/sciter-sdk/bin/linux"
"$SCITER_PATH/sciter" "$SCRIPT_DIR/main.htm"
调试技巧
1. 使用Inspector
- 元素检查:右键点击元素查看HTML结构
- 样式调试:实时修改CSS样式
- 脚本调试:设置断点,查看变量
- 控制台:执行TIScript代码
2. 日志输出
// 控制台输出
stdout.println("调试信息: " + value);
// 错误输出
stderr.println("错误: " + error.message);
// 格式化输出
stdout.printf("用户ID: %d, 姓名: %s\n", userId, userName);
3. 错误处理
try {
// 可能出错的代码
var result = riskyOperation();
} catch(e) {
stderr.println("捕获到错误: " + e.toString());
// 错误处理逻辑
}
1.3 开发工作流
推荐的开发流程
项目规划
- 定义应用需求
- 设计界面原型
- 规划技术架构
环境准备
- 安装Sciter SDK
- 配置开发工具
- 创建项目结构
界面开发
- 编写HTML结构
- 设计CSS样式
- 实现响应式布局
功能实现
- 编写TIScript逻辑
- 实现事件处理
- 集成系统API
测试调试
- 使用Inspector调试
- 跨平台测试
- 性能优化
打包发布
- 创建可执行文件
- 准备安装包
- 发布应用
项目组织建议
project-name/
├── src/ # 源代码
│ ├── views/ # HTML视图文件
│ ├── styles/ # CSS样式文件
│ ├── scripts/ # TIScript脚本
│ └── assets/ # 资源文件
├── build/ # 构建输出
├── dist/ # 发布文件
├── docs/ # 文档
├── tests/ # 测试文件
└── tools/ # 构建工具
1.4 常见问题解决
Q1: Sciter无法启动
解决方案: - 检查系统兼容性 - 确认文件路径正确 - 检查权限设置 - 查看错误日志
Q2: 样式不生效
解决方案: - 检查CSS语法 - 确认文件引用路径 - 使用Inspector检查样式 - 清除缓存重新加载
Q3: 脚本报错
解决方案: - 检查TIScript语法 - 使用try-catch捕获错误 - 查看控制台输出 - 逐步调试代码
Q4: 中文显示乱码
解决方案: - 确保文件编码为UTF-8 - 设置正确的字符集 - 检查字体支持
1.5 本章总结
在本章中,我们学习了:
核心概念
- Sciter的基本概念和优势
- 与其他技术的对比
- 适用场景分析
环境搭建
- 系统要求和SDK安装
- 开发工具配置
- 调试环境设置
实践应用
- 创建第一个Sciter应用
- 基本的HTML/CSS/TIScript结构
- 调试和运行技巧
开发流程
- 推荐的开发工作流
- 项目组织结构
- 常见问题解决
1.6 练习题
基础练习
- 安装Sciter SDK并配置开发环境
- 运行本章提供的示例应用
- 修改样式,改变应用外观
- 添加新的按钮和对应的事件处理
进阶练习
- 创建一个简单的计算器界面
- 实现窗口大小调整功能
- 添加键盘快捷键支持
- 实现应用设置保存功能
挑战练习
- 创建一个多窗口应用
- 实现拖拽功能
- 集成系统托盘图标
- 添加自定义右键菜单
下一章预告: 在第2章中,我们将深入学习Sciter中的HTML与CSS基础,包括Sciter特有的HTML扩展、CSS增强功能,以及如何创建现代化的用户界面。