# 运行模式

## 功能
`app.mode` 控制 `bt_app` 如何准备资源、执行脚本和加载窗口入口。当前只支持 `static`、`server`、`remote`。

## 对比
| 模式 | 入口示例 | 是否需要本地服务 | 是否适合打包 | 适合场景 |
|---|---|---|---|---|
| `static` | `index.html` | 否 | 是 | 纯静态页面、小工具、本地资源应用 |
| `server` | `http://127.0.0.1:18280` | 是 | 是 | BT 后端加 Web 前端的桌面应用 |
| `remote` | `https://example.com` | 否 | 是 | 远程 Web、SaaS 管理工具、云端页面壳 |

## static
`static` 模式通过 `bt://app/...` 读取项目资源。

```json
{
  "app": {
    "mode": "static",
    "entry": "index.html"
  }
}
```

优点是部署简单，打包后不需要启动本地 Web 服务。缺点是页面不能依赖浏览器服务器环境特性，例如服务端路由需要前端自己处理。

## server
`server` 模式先执行项目根目录的 `server.bt`，再打开 `app.entry` 指定的 HTTP 地址。

```json
{
  "app": {
    "mode": "server",
    "entry": "http://127.0.0.1:18280"
  }
}
```

`server.bt` 示例：

```bt
net.listen({
    type:'web',
    bind:'127.0.0.1:18280',
    sites:[
        {
            domains:['127.0.0.1'],
            root:'www/',
            entry:'main.bt',
            static:{
                route:'/static/{**}',
                path:'www/static/',
                default:'index.html'
            }
        }
    ]
})
```

优点是可以使用完整 BT Web 服务能力。缺点是要管理端口，端口被占用会启动失败。

开发目录运行时修改 `server.bt` 或相关资源后，`bt_app` 会先停止旧 Web 服务，再重新执行 `server.bt` 并刷新窗口。修改监听端口时，需要同步修改 `app.entry`，否则窗口仍会打开旧地址。

## remote
`remote` 模式直接打开远程 URL：

```json
{
  "app": {
    "mode": "remote",
    "entry": "https://example.com"
  }
}
```

远程入口模式下，软件壳本身可以保持稳定，业务页面部署在服务器端。开发者更新服务器内容后，用户再次打开应用即可使用新版本功能，不一定需要重新下载安装客户端。

当前版本 `remote` 页面同样会注入 `window.bt` 和窗口控制能力，只应加载可信远程页面。

## server.bt 自动执行
除了 `server` 模式，只要项目资源中存在 `server.bt`，当前运行时也会尝试执行它。普通 `static` 或 `remote` 项目如果不需要本地服务，不要放置无用的 `server.bt`。
