更新记录
2.0.0(2026-11-02) 下载此版本
首次发布 up-term 2.0.0 终端插件,包含统一会话 API、示例和封面图。
- H5:基于内置 xterm.js 5.5.0 与 addon-fit 0.10.0,提供 custom 双向流终端组件、尺寸适配与全屏终端页。
- Android:提供 Termux TerminalView/TerminalSession 适配源码;local 会话使用 /system/bin/sh PTY。原生编译、自定义基座与设备验收尚未完成,按实验性实现提供。
- iOS:提供 SwiftTerm 1.20.0 SPM 适配源码,仅支持 custom 会话。原生编译与设备验收尚未完成,按实验性实现提供。
- 鸿蒙 NEXT:提供实验性组件、内置终端页和请求隔离事件桥。ArkWeb 渲染位置与跨层通信仍需目标工程验证,不等同于 H5 验证通过。
- 微信小程序不提供终端功能,只安全返回不支持。
- 修复 Web 依赖加载、ready 回调写入重入、关闭回调和会话释放,以及鸿蒙回调保存和请求隔离。发布前 32 项 Node 行为测试、类型检查和 H5 构建通过(不代表原生设备验收)。
- 保留设备信息与 Toast API,并明确 iOS 设备标识信息读取的隐私说明。
本版不内置 SSH 服务、WebSSH 网关、vim/htop 或完整 Termux 命令包。远程会话需由宿主提供已授权的数据源;原生端不能仅凭结构检查或平台声明认定可用于生产。封面是 API 功能示意,不是设备测试截图。
平台兼容性
up-term

up-term 是一个 UTS uni_modules 终端插件,提供统一的会话 API,并保留 v1 的设备信息与 Toast API。
首次发布的验证边界:H5 的构建与功能验证结果见下方“发布验证记录”。Android、iOS、鸿蒙 NEXT 的原生编译、自定义基座和真机输入输出尚未完成验收,相关适配代码按实验性实现提供;不要将平台声明或
isTerminalSupported()返回值当成已通过设备测试的证明。微信小程序不提供终端,仅返回不支持结果。
- Android:Termux
terminal-emulator+terminal-view(Apache-2.0,AAR 已内置),本地会话通过 PTY 启动/system/bin/sh。可用命令取决于设备和宿主沙箱;插件不附带vim、htop或完整 Termux 工具链。 - iOS:SwiftTerm(MIT,v1.20.0,通过 Swift Package Manager 拉取),提供终端视图适配;本轮未做 Xcode 编译和真机验收。
- Web:xterm.js(MIT,5.5.0,分发包已内置),提供
custom双向流和终端显示。 - 鸿蒙 NEXT:包含 ArkWeb 组件接入及内置页面的实验性适配。uni-app 逻辑层与视图层并非可无条件混用 DOM,ArkWeb 渲染位置和 UTS/页面事件通信必须在目标工程验证,不能视为 H5 构建通过后自动支持。
- 会话边界:插件仅在 Android 提供
local,iOS、Web、鸿蒙适配只接受custom;远程 shell 需要宿主提供已授权的 WebSocket/SSH 网关等数据源,插件不自带 SSH 服务。
平台能力与验收状态
下表是源码提供的 API 范围,不是全端运行验收承诺。
| 能力 | App-Android(实验性) | App-iOS(实验性) | H5 | App-Harmony(实验性) | mp-weixin |
|---|---|---|---|---|---|
up-term-view(nvue) |
local / custom,待真机验证 | custom,待真机验证 | — | — | — |
up-term-web(vue) |
— | — | custom | 接入代码,待渲染层验证 | — |
openTerminalPage |
local / custom,待编译验证 | custom,待编译验证 | custom | 内置页 + 事件桥,待验证 | 不支持 |
local 会话 |
/system/bin/sh PTY |
不支持 | 不支持 | 不支持 | 不支持 |
| v1 设备信息 / Toast | 原生实现,待回归 | 原生实现,待回归 | 不支持 | 不支持 | 不支持 |
环境要求
- HBuilderX 5.0+(iOS 侧
dependencies-spms要求)。 - iOS 云打包需 Xcode 16 镜像(SwiftTerm 1.20.0 基于 swift-tools 6.0)。
- 鸿蒙 NEXT:需兼容的 HBuilderX/uni-app 鸿蒙工具链。ArkWeb 集成和事件桥尚未完成目标设备验收。
- Android
minSdkVersion21;custom 回环实现依赖设备提供stty。 - xterm.js 和 Termux AAR 已内置;SwiftTerm 是锁版本的 SPM 远程依赖,首次 iOS 构建需要网络及兼容 Xcode。
- 插件不主动申请运行时权限。
getDeviceInfo()会读取设备/应用信息(iOS 含 IDFV)并返回给宿主,不会自动上传;远程会话和隐私披露由宿主负责。
安装
将 uni_modules/up-term 拷贝进你的 uni-app 工程。Android/iOS 使用原生依赖时需重新制作自定义基座。H5 不需要原生基座;鸿蒙需按其工具链集成并验证内置页面,不能套用 H5 的构建结果。
会话模型
终端 = 终端视图 + 会话,会话类型全端 API 一致:
local(仅 Android):插件内置 pty 子进程/system/bin/sh,输入渲染全部原生闭环。custom(其余全部场景):JS 拥有数据流。键盘输入经data事件交给 JS;JS 调write()把远端输出喂给终端。典型用法:WebSocket 连 WebSSH 网关,socket 消息write()进终端,data事件写回 socket。
用法一:嵌入式组件 up-term-view(App 端,nvue 页面)
组件为 UTS 兼容模式组件,只能在 nvue 页面使用,必须显式指定宽高:
<template>
<view style="flex:1;background-color:#000000;">
<up-term-view
ref="term"
style="width:750rpx;height:1200rpx;"
sessionType="custom"
:fontSize="14"
welcomeText="up-term ready\r\n"
@ready="onReady" @data="onData" @resize=""
@exit="onExit" @error="onError">
</up-term-view>
</view>
</template>
| 类别 | 名称 | 说明 |
|---|---|---|
| prop | sessionType |
'local'(默认,仅 Android)/ 'custom' |
| prop | fontSize |
字号(逻辑像素),默认 14 |
| prop | welcomeText |
custom 模式的初始输出(local 模式忽略) |
| event | ready / resize |
cols、rows |
| event | data |
data(键盘输入,custom 模式转发给远端) |
| event | title / exit / error |
title / code / message |
| 方法 | write(data) |
local:写 shell stdin;custom:喂输出到屏幕 |
| 方法 | kill() / setFontSize(px) / focus() / paste(text) |
会话与交互控制 |
组件事件负载可能被序列化为 Map 或普通对象(随平台桥接而异),示例中的
ev(e, key)助手两端通用(见examples/terminal.nvue)。
用法二:全屏原生终端页(App 端,任意 vue 页面)
import { openTerminalPage, writeTerminalPage, closeTerminalPage, isTerminalSupported } from '@/uni_modules/up-term'
if (isTerminalSupported()) {
openTerminalPage({
sessionType: 'custom', // Android 本地 shell 请改为 'local'
fontSize: 14,
welcomeText: 'connecting...\r\n'
}, (event) => {
const value = (key) => typeof event.get === 'function' ? event.get(key) : event[key]
const name = value('event')
if (name === 'ready') {
// 等待 ready 后再写入;这里是 custom 会话的远端输出示意
writeTerminalPage('connected\r\n$ ')
} else if (name === 'input') {
// value('data') 为输入字节流(字符串形式),交给宿主传输层
} else if (name === 'error') {
console.error(value('message'))
}
})
}
// 用户点击“断开”时调用,而不是紧跟在异步 open 之后执行
function disconnect() {
closeTerminalPage()
}
Android 页面顶部有关闭按钮、BACK 键可直接关闭;iOS/web 页面右上角 ✕ 关闭。v1 限制:同时仅一个终端页实例,重复打开触发 error 事件。
用法三:Web / 鸿蒙 NEXT
H5 使用 up-term-web 组件(easycom 自动注册,基于内置 xterm.js)。源码包含 APP-HARMONY 适配分支,但该分支的 DOM 执行上下文仍需在鸿蒙目标工程验收:
<template>
<!-- #ifdef H5 || APP-HARMONY -->
<view style="display:flex;flex-direction:column;height:100vh;">
<up-term-web
ref="term"
style="flex:1;width:100%;"
sessionType="custom"
:fontSize="14"
welcomeText="ready\r\n"
@ready="onReady" @data="onData" @resize="" @error="onError">
</up-term-web>
</view>
<!-- #endif -->
</template>
<script>
export default {
methods: {
onData(e) {
// e.data 为键盘输入 → 发往 WebSocket;远端输出 → this.$refs.term.write(data)
this.$refs.term.write(e.data) // 示例:直接回显
}
}
}
</script>
Web 端也可以直接调函数 API:openTerminalPage 会创建全屏 overlay 终端(closeTerminalPage 关闭),事件契约与 App 端一致。
鸿蒙 NEXT 的全屏页(实验性):当前实现从 UTS 层导航到插件内置 vue 页面,并通过 uni 全局事件总线传递选项/事件。原生与页面事件桥、ArkWeb 终端渲染尚未真机验证。集成时需在宿主 pages.json 注册内置页:
{ "path": "uni_modules/up-term/pages/up-term-harmony-page", "style": { "navigationBarTitleText": "终端" } }
local 会话在 web/鸿蒙适配中返回明确 error;本插件未在这些端实现本地 shell。
v1 API(保持兼容)
import { isSupported, isTerminalSupported, getDeviceInfo, showToast } from '@/uni_modules/up-term'
isSupported():App-Android / App-iOS 为 true(v1 语义)。isTerminalSupported():Android / iOS / H5 / 鸿蒙为 true。
Android 会话实现说明
local:TermuxTerminalSession(JNI pty)+TerminalView,env 注入PATH/HOME(应用 filesDir)/TERM=xterm-256color等。custom:真实TerminalSession运行stty raw -echo; exec cat回环进程——write()经回环渲染到仿真器;键盘输入全部经TerminalViewClient钩子拦截转发data事件,无本地回显。
发布验证记录
完整命令、结果和未覆盖范围见仓库的 docs/release-validation-2.0.0.md。
- 发布前
npm test行为回归:32/32 通过(Web/演示 18、Harmony 12、小程序降级 2)。Harmony 测试使用宿主 API 边界替身,不是原生联调。 npm run type-check:通过。npm run build:h5:通过,type-only 导入警告已修正。- H5 生产包浏览器交互:全屏页打开、ready 尺寸回调、输入事件及关闭清理通过。
下方清单是集成方需要执行的设备验收步骤,不代表本轮已执行。
设备与集成验收清单
Android(自定义基座)
examples/terminal.nvue:sessionType=local→ls、top、echo $PATH交互正常;@resize触发。examples/terminal-page.vue:全屏终端;✕ 与 BACK 关闭;custom 模式输入事件与write()渲染(含 ANSI 颜色)正常。- v1 API 正常。
iOS(自定义基座,Xcode 16 镜像)
terminal.nvue:custom+ WebSocket(WebSSH) 输入输出闭环;local触发@error。- 全屏页 custom 会话正常。
- v1 API 正常。
H5
npm run dev:h5打开examples/web-terminal.vue:键入回显、窗口缩放触发@resize。terminal-page.vue:openTerminalPage全屏 overlay、✕ 关闭、writeTerminalPage渲染正常。isTerminalSupported()为true;getDeviceInfo()安全降级。
鸿蒙 NEXT(真机/模拟器)
- uni-app 鸿蒙工程引入插件,并在 pages.json 注册内置页
uni_modules/up-term/pages/up-term-harmony-page。 - 打开
web-terminal.vue页面:ArkWeb 中 xterm.js 渲染与输入正常。 terminal-page.vue:openTerminalPage(custom)导航到内置终端页;input/resize/close事件经事件总线回传宿主;writeTerminalPage渲染正常。local请求返回明确 error(预期行为)。
mp-weixin
- 所有终端 API 返回
supported: false,页面不崩溃。
已知限制
- iOS / Web / 鸿蒙适配未提供本地 shell。iOS 普通沙箱应用不能用本插件启动系统 shell;不对鸿蒙其他原生运行环境的进程能力作通用结论。
- Android/iOS/Harmony 的编译、软键盘/硬键盘、控制键、UTF-8、ANSI 往返、页面回收均需在设备上验证;结构检查不能证明这些功能可用。
- 鸿蒙端全屏页依赖
uni.$emit/$on跨层事件总线与内置页注册;若宿主未注册内置页,openTerminalPage会通过error事件提示。 - iOS 终端标题(
title事件)暂不上报;iOS 全屏页不跟随旋转重排(v1)。 - custom 会话在 Android 5.x 可能因缺少
stty出现行缓冲(建议 Android 6.0+)。 - 组件/页面暂未暴露配色方案自定义(默认黑底白字)。
- mp-weixin 不支持终端(xterm canvas 适配不在本版范围)。
许可声明
依赖来源、版本、AAR 校验摘要及上游授权说明见 THIRD_PARTY_NOTICES.md。
- Termux terminal-emulator / terminal-view:Apache License 2.0(
utssdk/app-android/libs/LICENSE-termux.txt)。 - SwiftTerm:MIT License(
utssdk/app-ios/LICENSE-SwiftTerm.txt)。 - xterm.js:MIT License(
libs/xterm/LICENSE-xterm.txt)。 - addon-fit:MIT License(
libs/xterm/LICENSE-addon-fit.txt)。
示例
拷贝 examples/ 下的页面到业务工程:
basic.vue:v1 API 验证页(vue)。terminal.nvue:嵌入式终端组件页(nvue,Android local / 双端 custom)。terminal-page.vue:全屏终端页示例(vue,App/H5 可用)。web-terminal.vue:Web/鸿蒙终端组件示例(vue,H5/APP-HARMONY)。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 162954
赞赏 508
下载 12735827
赞赏 1959
赞赏
京公网安备:11010802035340号