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配置:

  1. 安装Sciter扩展: json { "recommendations": [ "sciter.sciter-tiscript", "sciter.sciter-html" ] } 2. 配置文件关联: json { "files.associations": { "*.htm": "sciter-html", "*.html": "sciter-html", "*.tis": "tiscript" } }

Sublime Text配置:

  1. 安装Package Control
  2. 安装Sciter语法高亮包
  3. 配置构建系统: 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 开发工作流

推荐的开发流程

  1. 项目规划

    • 定义应用需求
    • 设计界面原型
    • 规划技术架构
  2. 环境准备

    • 安装Sciter SDK
    • 配置开发工具
    • 创建项目结构
  3. 界面开发

    • 编写HTML结构
    • 设计CSS样式
    • 实现响应式布局
  4. 功能实现

    • 编写TIScript逻辑
    • 实现事件处理
    • 集成系统API
  5. 测试调试

    • 使用Inspector调试
    • 跨平台测试
    • 性能优化
  6. 打包发布

    • 创建可执行文件
    • 准备安装包
    • 发布应用

项目组织建议

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 练习题

基础练习

  1. 安装Sciter SDK并配置开发环境
  2. 运行本章提供的示例应用
  3. 修改样式,改变应用外观
  4. 添加新的按钮和对应的事件处理

进阶练习

  1. 创建一个简单的计算器界面
  2. 实现窗口大小调整功能
  3. 添加键盘快捷键支持
  4. 实现应用设置保存功能

挑战练习

  1. 创建一个多窗口应用
  2. 实现拖拽功能
  3. 集成系统托盘图标
  4. 添加自定义右键菜单

下一章预告: 在第2章中,我们将深入学习Sciter中的HTML与CSS基础,包括Sciter特有的HTML扩展、CSS增强功能,以及如何创建现代化的用户界面。