
JSAR是可嵌入空间的 Web 运行时,它支持开发者使用类似于 Web 的技术来开发可嵌入空间的空间小程序。它可以帮助你将 Web 技术嵌入到某个空间场景中独立运行。
简单理解就是:

选择JSAR的原因很简单:
简单来说,如果你已经是一个Web开发者,JSAR让你几乎零门槛进入空间计算领域。
前往Node.js官网下载LTS版本。安装完后验证一下:
node -v # 应该显示 v18.x.x 或更高
npm -v # 显示npm版本如果你已经安装了VS Code,可以跳过这一步。如果没有安装,前往 VS Code官网 下载安装。
注意:确保VS Code版本 >= 1.80.0
Ctrl + Shift + P,输入 "Extensions: Install from VSIX…"
# 初始化项目
npm init @yodaos-jsar/widget
# 安装依赖
npm install脚手架会自动:
运行成功后,会获得一个 package.json


初始化完成后,你会得到这样的目录结构:

让我们看看关键文件的内容:
main.xsml(空间标记语言):
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="model" ref="model" selector="__root__" />
</space>
</xsml>lib/main.ts(TypeScript逻辑):
const scene = spaceDocument.scene as BABYLON.Scene;
const animationGroups = scene.animationGroups.filter((ag) => ag.name.endsWith('#model'));
if (animationGroups.length >= 1) {
animationGroups[0].start(true);
}.xsml文件

场景视图提供两个实用功能:
修改代码时,场景视图会自动刷新,实现热重载。
解决方法:

如果遇到 No view is registered with id: jsar-devtools.sceneObjectsHirarchy 错误,可能是VS Code的旧视图布局中ID冲突。
解决方法:
Ctrl/Cmd + Shift + PView: Reset View LocationsDeveloper: Reload WindowJSAR还提供了在线Playground,让你在浏览器中直接测试应用:
https://jsar.netlify.app/playground?url={你的XSML地址}GitHub项目示例:
https://jsar.netlify.app/playground?url=https://raw.githubusercontent.com/M-CreativeLab/jsar-gallery-rokid-jungle/main/main.xsml本地项目预览:
npm install serve -gserve -p 8080 --corshttp://localhost:8080/main.xsml,应该返回:
https://jsar.netlify.app/playground?url=http://localhost:8080/main.xsml
XSML(eXtended Spatial Markup Language)是JSAR的核心,它扩展了传统的HTML概念到3D空间。
基本结构:
<xsml version="1.0">
<head>
<title>Rokid Jungle</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="model" ref="model" selector="__root__" />
</space>
</xsml>用于把 <head> 中 <link> 引入的 3D 模型渲染到空间里。
属性 | 类型 | 说明 |
|---|---|---|
id | string | 网格元素的唯一标识符。 |
ref | string | 引用的外部资源 ID,目前仅支持 model。对应 |
selector | string | 在被引用的模型中选择具体节点(选择器字符串)。 |
用法要点:通过 ref 指向已经通过 <link> 引入的模型资源;selector 用于精确到模型中的某个节点。
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
width | number | 宽度。 |
height | number | 高度。 |
depth | number | 深度。 |
size | number | 统一尺寸的便捷属性(等边立方体)。 |
用法要点:size 与 width/height/depth 建议二选一,避免歧义。
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="robot" ref="robotModel" selector="Root/Armature" />
<!-- 基础几何 -->
<cube id="box" width="2" height="1" depth="3">
<bound id="box-bounds" />
</cube>
</space>
</xsml>
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
width | number | 宽度。 |
height | number | 高度。 |
size | number | 统一尺寸的便捷属性(正方形平面)。 |
用法要点:size 与 width/height 建议二选一。
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="robot" ref="robotModel" selector="Root/Armature" />
<plane id="floor" width="10" height="10" />
</space>
</xsml>
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
segments | number | 分段数。 |
diameter | number | 球体直径。 |
diameterX | number | X 轴直径(非等向椭球)。 |
diameterY | number | Y 轴直径。 |
diameterZ | number | Z 轴直径。 |
arc | number | 弧度(局部弧面)。 |
slice | number | 切片(局部切分)。 |
用法要点:diameter 与 diameterX/Y/Z 用于不同场景,建议不要混用以避免实现差异。
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="robot" ref="robotModel" selector="Root/Armature" />
<sphere id="ball" segments="32" diameter="2" />
<sphere id="ellipsoid" diameterX="2" diameterY="1" diameterZ="3" />
</space>
</xsml>
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
height | number | 高度。 |
diameter | number | 统一直径。 |
diameterTop | number | 顶部直径。 |
diameterBottom | number | 底部直径。 |
tessellation | number | 分段数。 |
用法要点:diameter 与 diameterTop/Bottom 通常二选一;若需要圆台/锥体效果,可使用不同的顶部/底部直径。
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="robot" ref="robotModel" selector="Root/Armature" />
<cylinder id="pillar" height="4" diameterTop="1" diameterBottom="1" tessellation="32" />
</space>
</xsml>
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
height | number | 高度。 |
radius | number | 统一半径。 |
radiusTop | number | 顶部半径。 |
radiusBottom | number | 底部半径。 |
用法要点:radius 与 radiusTop/Bottom 通常二选一。
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="robot" ref="robotModel" selector="Root/Armature" />
<capsule id="pill" height="3" radius="0.5" />
</space>
</xsml>
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
diameter | number | 圆环直径(主半径的两倍)。 |
thickness | number | 厚度(管径)。 |
tessellation | number | 分段数。 |
<xsml version="1.0">
<head>
<title>JSAR Widget</title>
<link id="model" rel="mesh" type="octstream/glb" href="./model/welcome.glb" />
<script src="./lib/main.ts"></script>
</head>
<space>
<mesh id="robot" ref="robotModel" selector="Root/Armature" />
<torus id="ring" diameter="5" thickness="0.5" tessellation="48" />
</space>
</xsml>
属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识符。 |
用法要点:
在使用XSML的时候,需要注意:
<head> 里通过 <link> 引入模型资源;ref 对应 link 的 id,selector 精确到节点。<bound> 以可视化/计算包围盒(大小由子元素决定)。开发完成后,需要将空间小程序打包成独立文件:
{name}-{version}.zip 文件

npm run build当前JSAR要求打包后的应用小于10MB。如果超出限制,可以:
npm install -g @gltf-transform/cli
# 压缩GLTF模型
gltf-transform optimize input.glb output.glb# 压缩纹理到合适尺寸
gltf-transform resize input.glb output.glb --width 512 --height 512打包完成后,可以通过Rokid设备进行真机测试:
JSAR 是一个面向空间小程序的开发框架,让 Web 开发者用熟悉的 JS/TS 直接写 3D 应用。XSML 描述场景,VS Code 场景视图热重载,Playground 一键预览,打包就是一个 zip,分发照着 Web 的节奏走。
体验下来最打动我的是门槛低、技能可复用、原型迭代极快。几分钟就能跑出首帧,模型用 link+selector 引用顺手,bound 自动包围盒省事,配合 gltf-transform 控制体积也轻松。如果你是 Web 开发者想试试空间计算,JSAR 值得投入时间——做个小 demo,就能感受到它的速度与潜力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。